Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

NachoMan

Community-Fossil

  • »NachoMan« ist der Autor dieses Themas

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

1

25.12.2014, 19:06

Stauchen bei generierter UV Map verhindern.

Ich arbeite gerade an einem Wegesystem, das sich zur Laufzeit auf mein Terrain legt. Das funktioniert auch ganz gut. Allerdings habe ich Verständnissprobleme bei der Nutzung der UV Map.

So generiere ich ein Face, also ein Abschnitt des Weges:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void GenerateSegment(Vector3 start, Vector3 end, int segmentCount, Vector3 direction, Vector3 rotatedDirection, float length, float width)
{
    Vector3 moveVector = end - start;
    moveVector.y = 0;

    Vector3[] vertices = new Vector3[4];
    vertices[0] = start + rotatedDirection * (width/2f);
    vertices[1] = start - rotatedDirection * (width/2f);
    vertices[2] = end - rotatedDirection * (width/2f);
    vertices[3] = end + rotatedDirection * (width/2f);
    for(int i = 0; i < vertices.Length; ++i)
    {
        vertices[i].y = SampleHeight(vertices[i]);
    }

    newVertices.AddRange(vertices);
    
    newTriangles.Add(segmentCount*4);
    newTriangles.Add(segmentCount*4 + 1);
    newTriangles.Add(segmentCount*4 + 3);
    newTriangles.Add(segmentCount*4 + 1);
    newTriangles.Add(segmentCount*4 + 2);
    newTriangles.Add(segmentCount*4 + 3);
    
    newUV.Add(new Vector2 (1, 1));
    newUV.Add(new Vector2 (0, 1));
    newUV.Add(new Vector2 (1, 0));
    newUV.Add(new Vector2 (0, 0));
}

Nun habe ich das Problem, dass die Texturen gestaucht bzw. gezogen werden(siehe Anhang). Dabei hätte ich lieber eine Kachelung.
Habe bereits zwei Möglichkeiten ausprobiert:

C#-Quelltext

1
2
3
4
newUV.Add(new Vector2 (length, 1));
newUV.Add(new Vector2 (0, 1));
newUV.Add(new Vector2 (length, 0));
newUV.Add(new Vector2 (0, 0));

C#-Quelltext

1
2
3
4
newUV.Add(new Vector2 (1/length, 1));
newUV.Add(new Vector2 (0, 1));
newUV.Add(new Vector2 (1/length, 0));
newUV.Add(new Vector2 (0, 0));

Funktioniert leider beides nicht und da ich mich damit nicht auskenne bin ich mit meinem Latein am Ende. :(

Hat jemand eine Idee wie ich eine Kachelung mit der UV umsetze?

Danke schonmal im Voraus!
»NachoMan« hat folgendes Bild angehängt:
  • uvmapproblem.jpg
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

2

26.12.2014, 15:03

Ich finde das sind noch recht wenig Informationen. Aber das Hauptproblem ist natürlich erstmal, dass du irgendwie ein Quad ausrechnest, und unabhängig von dessen Größe die Textur genau einmal drauf legst. Deine Lösungsansätze scheinen das ja eigentlich zu behen, es ist halt bloß ein wenig die Frage, was genau du haben willst. Hier mal zwei Ansätze:

Deine Wege laufen immer ungefähr in einer Ebene, was bei verhältnismäßig flachen Landschaften meistens so ist. Dann kannst du als Texturkoordinaten einfach die Weltkoordinaten der Vertexe nehmen (schmeißt den Z Wert halt weg) und hast eine verzerrungsfreie, perfekte Kachelung. Verzerrt wird es nur, wenn du Stiegungen drin hast, bis 45 Grad sollte es aber noch ganz ok aussehen.

Oder du richtest die Textur am Weg aus. Dann sollte jedes Wegsegment (Quad) gleich breit sein, und du würdest die Textur entlang der Breite n-mal kacheln. Die Kachelung entlang der Länge kannst du variabel machen, wenn die Segmente unterschiedlich lang sind, musst dann aber jeweils den passenden Wert an das nächste Segment übergeben, um einen nahtlosen Übergang zu bekommen.
Lieber dumm fragen, als dumm bleiben!

NachoMan

Community-Fossil

  • »NachoMan« ist der Autor dieses Themas

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

26.12.2014, 16:25

Ich finde das sind noch recht wenig Informationen.

Leider gibt es dazu nicht mehr zu sagen. Aber...
Deine Wege laufen immer ungefähr in einer Ebene, was bei verhältnismäßig flachen Landschaften meistens so ist. Dann kannst du als Texturkoordinaten einfach die Weltkoordinaten der Vertexe nehmen (schmeißt den Z Wert halt weg) und hast eine verzerrungsfreie, perfekte Kachelung. Verzerrt wird es nur, wenn du Stiegungen drin hast, bis 45 Grad sollte es aber noch ganz ok aussehen.

Das hat super funktioniert. Dankeschön!
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige