Texturkoordianten aus XYZ Position berechnen
Übersicht

![]() |
VincentBetreff: Texturkoordianten aus XYZ Position berechnen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo !
Ich hab angefangen einen kleinen, extremst billigen 3d Modeller zu programmieren. Man kann schon toll verschiedene Dinge erstellen ( z.B. Torus , Quader ... mit eigenen Funktionen, um jeder Fläche ein eigenes Surface zu geben). Auch Bewegen, Drehen und Skalieren klappt toll. Nur die Texturkoordinaten sind lästig. Die sollen aus den XYZ Koordinaten und Normalen der Vertexpunkte direkt errechnet werden. Ich hab das Kreuzprodunkt des VertexNormals und (0,1,0)T für U-Koordinate und (1,0,0)T für V-Koordinate gebildet. Das Ergebnis das normiert und die Achsenanteile mit der zugehörigen Position des Vertex im Raum multipliziert. Das klappt auch manchmal ganz gut. Aber sobald man das Objekt dann dreht ... die VertexNormalen also mehrere Achsenanteile haben, gibts es haufenweise doofe Fehler. Code: [AUSKLAPPEN] For group.group = Each group If group\selected = 1 For o = 1 To CountSurfaces( group\mesh ) i = GetSurface( group\mesh , o ) For a = 0 To CountVertices( i )-1 TFormPoint VertexX( i , a ), VertexY( i , a ), vertexZ( i , a ), group\mesh, 0 x# = TFormedX() : y# = TFormedY() : z# = TFormedZ() TFormNormal VertexNX( i , a ), VertexNY( i , a ), VertexNZ( i , a ), group\mesh, 0 a1# = TFormedX() a2# = TFormedY() a3# = TFormedZ() ;Kreuzprodukt Normal (a ) mit (b) = ( 0 , 1 , 0 ) ; u COORD (x) b1# = 0 : b2# = 1 : b3# = 0 v1# = ( a2*b3 - a3*b2 ) v2# = ( a3*b1 - a1*b3 ) v3# = ( a1*b2 - a2*b1 ) If a1 = b1 And (a2 = b2 Or a2 = -b2 ) And a3 = b3 ; Versuch Fehler zu beheben v1 = 1 v2 = 0 v3 = 0 EndIf n# = 1.0 / Sqr( v1*v1 + v2*v2 + v3*v3);normieren v1 = v1 * n v2 = v2 * n v3 = v3 * n u# = ((v1 * x) + (v2 * y) + (v3 * z)) ;Kreuzprodukt Normal (a ) mit (b) = ( 1 , 0 , 0) ; v COORD b1# = 1 : b2# = 0 : b3# = 0 v1# = ( a2*b3 - a3*b2 ) v2# = ( a3*b1 - a1*b3 ) v3# = ( a1*b2 - a2*b1 ) If (a1 = b1 Or a1 = -b1 ) And a2 = b2 And a3 = b3; Versuch Fehler zu beheben v1 = 0 v2 = 1 v3 = 0 EndIf n# = 1.0 / Sqr( v1*v1 + v2*v2 + v3*v3);normieren v1 = v1 * n v2 = v2 * n v3 = v3 * n v# = ((v1 * x) + (v2 * y) + (v3 * z)) VertexTexCoords( i , a , u , v ) Next Next EndIf Next Ich hab schon recht intensiv in Foren und Google gesucht, aber nichts sinnvolles gefunden. Im Notfall müsste ich für alle möglichen Normalen-Achsenanteil-Vorzeichen-Kombinationen eine gesonderte Berechnung machen ... was sehr unelegant wär ^^ |
||
Gott ist nicht mit uns ... weil er mit Idioten keine Gnade kennt ! |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
das wird so net gehen wenn du für alle das gleiche muster nehmen willst einfach weil verschiedene objekte -> verschiedene UV maps brauchen.
Am einfachsten ist es die textur in Weltkoordinaten zu haben und auf das objekt "runterzuprojizieren". Aber dazu wirst du hier nix finden, da musst du dich schon intensiver damit auseinander setzen und das heisst auch pseudo codes, C und C++ fürchte ich, sorry. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Vincent |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich will nicht für alle das gleiche muster nehmen.
die UV koordinaten werden ja für jeden vertexpunkt einzeln erstellt, abhängig von seiner position und normalen. und ich benutze wiegesagt auch keine blitz3d - Standartcubes etc, sondern selbst erstellte, bei denen jede fläche ne eigene surface hat. das mit dem runterprojezieren mach ich ja schon. indem ich das vektorprodukt bilde und normiere ... aber ist halt nicht ganz fehlerfrei .. ich suche den denkfehler darin. |
||
Gott ist nicht mit uns ... weil er mit Idioten keine Gnade kennt ! |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann dreh doch die Kamera ums Objekt und nicht das Objekt vor der Kamera . | ||
![]() |
Vincent |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Texturkoordinaten UV sind unabhängig von Kameras. | ||
Gott ist nicht mit uns ... weil er mit Idioten keine Gnade kennt ! |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das meine ich nur weil du von Objekt drehen sprachst .
Vieleicht ist das Problem das du zwar in Weltpos. umrechnest aber die Tiefe mit einbeziehst obwohl du nur U & V brauchst . Nur ne Vermutung weil so sichtig habe ich dein Beispiel Quelltext nicht verstanden . Kannste mal zwei Pics zeigen , vor und nach dem drehen vom Objekt ? |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group