Textur auf Polygon kacheln
-
Hi ich habe eine Frage bezüglich meiner Kachel-Funktion für Texturen (OGL):
Ich mache das momentan so:Als Beispiel sein ein Quad gegeben:
Pseudocode: Vertexe des Quads: V1.x = 0.0f; V1.y = 1.0f; V1.z = 0.0f; V2.x = 5.0f; V2.y = 1.0f; V2.z = 0.0f; V3.x = 5.0f; V3.y = 0.0f; V3.z = 0.0f; V4.x = 0.0f; V4.y = 0.0f; V4.z = 0.0f;
Um nun die Textur gleichmäßig über das Quad zu kacheln benutze ich als u Koordinate die x Koordinate der zugehörigen Vertexe und als v Koordinate die y Koordinate des zugehörigen Vertexe!
Das funkt prima solange die z Koordinaten aller Vertexe die gleichen Werte haben, nehmen wir aber mal an die z Koordinaten von V2 und V3 hätten den Wert 1.0f oder auch -1.0f dann wäre die Textur ja nichtmehr "natural" sondern etwas auf der "u Achse" verzerrt. Meine Frage nun wie kann ich diese Ungenauigkeit beseitigen bzw. wie rechne ich den Jeweiligen Koordinaten ohne diese Ungenauigkeit aus?Ich hoffe ich habs verständlich erklärt. Danke schonmal im voraus!
-
du berechnest die länge der 3 kanten und gibst ihnen entsprechend viel platz auf dem uv-space. die kantenlängen werden nicht durch orjentierunge der polygone verfälscht, jedoch werden dann die polygonkanten nichtmehr zueinander passen von den texturen her, das ist leider nicht möglich.
beim automatischen texturieren für shadowmaps/lightmaps nimmt man meißtens die ansicht der achsen, in der die größte fläche zu sehen ist
mit ansicht der achsen meine ich: xy-ansicht,xz-ansicht oder yz-ansicht. damit bekommt man ne verzerrung von maximal 45°, weil ab da wieder die ansicht sich ändert in eine günstigerere ansicht.
die verteilung mittels kantenlänge kann mit nährungsfunktionen durchgeführt werden, das einfacher zu implementieren
an sich bestimmst du für einen punkt eine uv coordinate z.B. 0|0, für den zweiten punkt berechnest du die kantenlänge des polys, skalierst das entsprechend deinen wünschen und kannst dann z.B. 0|laenge*scale als koordinate nehmen, dann berechnest du wie weit der dritte punkt vom ersten und vom zweiten entfernt sein muss, im verhältnix der beiden längen könntest du die erste UV kante aufteilen, somit hättest du für den dritten punkt: unbekanntU|länge*scale*laengevon1zu3/(leangevon1zu3+leangevon1zu2), mit den werten nun solltest du "unbekanntU" rausfinden können...ich hoffe das ist nicht zu falsch was ich hier schrieb.. und verständlich
rapso->greets();
-
Original erstellt von rapso:
ich hoffe das ist nicht zu falsch was ich hier schrieb.. und verständlichja, danke, ist toll!