Texturen in VRML

Moinmoin.

ich habe auf der Arbeit die Aufgabe bekommen ein c+±Programm zu schreiben, welches anhand von eingegebenen Werten (mit GUI) ein Haus generiert. Die berechneten Punkte werden in eine VRML-Datei geschrieben.

Das klappt auch alles so gut und ich sehe ein vernünftiges Haus mit Wänden, Dach, Tür und mehreren Fenstern.

Nun wollte ich die mit Texturen belegen…ich habe schon so ein bisschen rumprobiert mit imageTexture und textureTransform usw und bin nun an einem Punkt an dem ich nciht mehr weiter weiß.

Die Wände mit einer backstein-Textur zu versehen is kein sindg, da sich die ja wiederholen. Wenn ich nun aber ein Fenster mit einer Textur versehen will stoße ich auf ein Problem. Da die Fenstergröße von den Eingaben des Users abhängen brauche ich ein allgemeines „Gesetz“, wie ich eine Textur an die Größe der Fläche anpasse. Die Das Texturbild soll sich nicht wiederholen, sondern so wie es ist auf die Fläche angepasst werden.

Ich habe schon einiges rumprobiert und mir sogar Wertetabellen mit verschiedenen Breiten und Höhen und den zugehörigen s- unt t-Werten des „scale“-Knotens aber ich komme einfach nicht hinter das System des texturen in VRML.

Ich habe mal ein paar Werte für breite und Höhe ausprobiert und mir die zugehörigen scale Werte notiert:

z.B.:

Breite = 3 Hoehe = 1 --> scale 1 3
hm dachte ich das is ja einfach aber…

Breite = 6 Hoehe = 4 --> scale 1 1.5
man sieht Ähnlichkeit aber das ist noch nicht allgemein genug, denn…

Breite = 3 Hoehe = 2 --> scale 1 1.5
kommt mir bekannt vor…aber wieso?? Der Größenunterschied zwischen den Seiten ist doch unterschiedlich. ich mein dass 6/4=3/2 ist weiß ich aber ich verstehe die allgemeine Gesetzmäßigkeit nicht :frowning:

Interessant wirds dann noch wenn das Fenster höher ist als breit:

Breite = 3 Hoehe = 4 --> scale 1.3 1 , rotation 1.57
wieso diese komische rotationzahl und wieso gerade 1.3 wobei das bei den anderen doch so schön gepasst hat

Hoffe mir kann einer helfen. Vielleicht ist das ja auch ein allgemeines Problem bei Texturen egal ob nun in VRML oder sonst was. Ich bin für jede Hilfe und Denkanstoß dankbar

VRML Textur
Das mit „Wörmel“ ist schon ein biscchen her bei mir.

Aber ich poste mal Beispielcode, der einen Container darstellt. Die Seitenwände, die Vorder-, die Rückseite und das Dach bestehen aus einem dementsprechnden Foto, was auf die volle länge (keine wiederholung) gestreckt ist.

#VRML V2.0 utf8

PROTO Container[ 
 exposedField MFString dach "ContainerBlauDach.png"
 exposedField MFString front "ContainerBlauFront.png"
 exposedField MFString seite "ContainerBlauSeite.jpg"
] {
 Transform {
 children [
 DEF Seitenwand Transform{
 children [
 Shape {
 appearance Appearance {
 texture ImageTexture {
 url IS seite
 }
 textureTransform TextureTransform {
 scale 1 1
 }
 } 

 geometry IndexedFaceSet {
 coord Coordinate {point [ 
 -0.5 0 0.2
 0.5 0 0.2
 0.5 0.5 0.2
 -0.5 0.5 0.2
 ]}

 coordIndex [
 0 1 2 3 -1
 ]
 }
 }
 ] 
 }
 DEF Seitenwand2 Transform {
 children [USE Seitenwand] 
 rotation 0 1 0 3.1459
 }

 DEF Frontwand Transform {
 children [
 Shape {
 appearance Appearance {
 texture ImageTexture {
 url IS front
 }
 textureTransform TextureTransform {
 scale 1 1
 }
 } 

 geometry IndexedFaceSet {
 coord Coordinate {point [ 
 -0.5 0 -0.2
 -0.5 0 0.2
 -0.5 0.5 0.2
 -0.5 0.5 -0.2
 ]}

 coordIndex [
 0 1 2 3 -1
 ]
 }
 }
 ] 
 }
 DEF Heckwand Transform {
 children [USE Frontwand]
 rotation 0 1 0 3.145
 }

 DEF Deckel Transform {
 children [
 Shape {
 appearance Appearance {
 texture ImageTexture {
 url IS dach
 } 
 textureTransform TextureTransform {
 scale 1 1
 }
 } 

 geometry IndexedFaceSet {
 coord Coordinate {point [ 
 -0.5 0.5 0.2
 0.5 0.5 0.2
 0.5 0.5 -0.2
 -0.5 0.5 -0.2
 ]}

 coordIndex [
 0 1 2 3 -1
 ]
 }
 }
 ] 
 }
 ]
 }
}

Besten Dank.

Bin für heute und morgen krankgeschrieben und habe nächste Woche Berufschule…werde in 1,5 wochen mal sehen wie ich das verwerten kann und melde mich dann nochmal

Danke für die Antwort

So nun bin ich mal wieder auf der Arbeit und habe mich dem Code gewidmet.

Habe den Code so kopiert und in eine wrl-Datei gespeichert. Habe dann die Texturen durch „Fenster.jpg“ ersetzt (ContainerBlauDach.png hab ich ja leider nicht :wink: )

Leider bieb der Bildschirm leer, also es erschen nichts.

Habe den Code dann mal auf den folgenden reduziert:

#VRML V2.0 utf8

DEF Seitenwand Transform{
 children [
 Shape {
 appearance Appearance {
 texture ImageTexture {
 url "Fenster.jpg"
 }
 textureTransform TextureTransform {
 scale 1 1
 }
 } 

 geometry IndexedFaceSet {
 coord Coordinate {point [ 
 -0.5 0 0.2
 0.5 0 0.2
 0.5 0.5 0.2
 -0.5 0.5 0.2
 ]}

 coordIndex [
 0 1 2 3 -1
 ]
 }
 }
 ] 
 }

Es erschien ein halbes Fenster :frowning:

Fazit: Die Anpassung auf die komplette Fläche hatr leider nicht geklappt :-/

Oder sind die eigentlich wichtigen zeilen bei der Reduktion des Codes weggefallen?

Problemo gelösto

Das Problem war kein VRML-Spezifisches, sondern ein allgemeines.

Lösung:

Wenn die Breite größer als die Höhe ist, muss die Textur mit „scale 1 breite/hoehe“ skaliert werden

Wenn die Hoehe größer als die Breite ist, dann muss die Textur mit „scale hoehe/breite 1“ skaliert und mit „rotation 1.57“ gedreht werden.

Wenn Höhe = Breite ist, dann kann man sich die Skalierung sparen (scale 1 1), aber muss überprüfen ob die texturierte Fläche Parallel zur X-Achse (rotation 0) oder Parallel zur Z-Achse (rotation 1.57) liegt.

Hoffe ich konnte mit der Info noch dem einen oder anderen helfen.

Korrektur
Wenn Höhe = Breite ist, muss überprüft werden ob die Fläche parallel zur xy-Fläche oder parallel zur yz-Achse