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

More

Frischling

  • »More« ist der Autor dieses Themas
  • Private Nachricht senden

1

19.06.2014, 12:44

Berechnung des Normalsvektors

Hallo miteinander.
ich wollte mir eine Funktion schreiben um den Normalvektor berechnen zu können. Dieser wird ja aus den Kreuzprodukt gebildet, wovon a = Punkt B - Punkt A und b = Punkt C - Punkt A ist. Nun sehe ich auf manchen Seiten, dass der Normalvektor so berechnet wird:

C-/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
index1 = (j * m_terrainHeight) + i;
            index2 = (j * m_terrainHeight) + (i+1);
            index3 = ((j+1) * m_terrainHeight) + i;

            // Get three vertices from the face.
            vertex1[0] = m_heightMap[index1].x;
            vertex1[1] = m_heightMap[index1].y;
            vertex1[2] = m_heightMap[index1].z;
        
            vertex2[0] = m_heightMap[index2].x;
            vertex2[1] = m_heightMap[index2].y;
            vertex2[2] = m_heightMap[index2].z;
        
            vertex3[0] = m_heightMap[index3].x;
            vertex3[1] = m_heightMap[index3].y;
            vertex3[2] = m_heightMap[index3].z;

            // Calculate the two vectors for this face.
            vector1[0] = vertex1[0] - vertex3[0];
            vector1[1] = vertex1[1] - vertex3[1];
            vector1[2] = vertex1[2] - vertex3[2];
            vector2[0] = vertex3[0] - vertex2[0];
            vector2[1] = vertex3[1] - vertex2[1];
            vector2[2] = vertex3[2] - vertex2[2];

Quelle

Dies würde ja folgendes entsprechen, wenn ich mich nicht täusche:
a = Punkt A - Punkt C
b = Punkt C - Punkt B

Daraus würde ja resultieren, dass der Normalvektor in einer anderen Richtungen zeigen würde. Beispiel:
A (5 | 1 | 0); B (1 | -3 | 0); C (-2 | -1 | 0)
a = B - A = (-4 | -4 | 0)
b = C - A = (-7 | -2 | 0)

a x b = (0 | 0 | -20)
_____________________________________________________
Selbe Punkte
a = A - C = (7 | 2 | 0)
b = C - B = (3 | 2 | 0)

a x b = (0 | 0 | 20)
______________________________________________________
=> Der Richtungsvektor zeigt in einer anderen Richtung.

Meine Frage wäre daher, was ist denn nun richtig für die Berechnung des Normalvektors oder ist es egal?

2

19.06.2014, 12:51

Es gibt kein "richtig" oder "falsch".

Der Normalenvektor steht immer senkrecht auf den beiden Vektoren, aus denen du das Kreuzprodukt (und somit den Normalenvektor) berechnest. Der Normalenvektor bildet dann mit den beiden anderen Vektoren ein Rechtssystem, wodurch seine Gerichtetheit zustande kommt. Siehe dazu auch http://de.wikipedia.org/wiki/Rechtssystem_(Mathematik).

Deine Quelle verwendet schlicht anders gerichtete Vektoren. Die Ordnung der eingegebenen Punkte entscheidet letztlich somit auch die Richtung des resultierenden Normalenvektors.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

More

Frischling

  • »More« ist der Autor dieses Themas
  • Private Nachricht senden

3

19.06.2014, 13:21

Würde bedeuten, wenn ich die erste 'Formel' zur Berechung hernehme, aber die Vertices aus der Quelle nehme (scheinen ja anders angeordnet zu sein), es so anordnen müsste: CalcNormal(C, B, A), damit der Normalvektor richtig gerichtet ist.

4

20.06.2014, 12:39

Wenn du die Reihenfolge der Punkte so setzt, kommt das selbe Ergebnis raus, wie bei der Quelle, ja.

Die Frage ist eher, was das "richtig gerichtet" bei dir bedeutet.

Um das richtig zu verstehen, solltest du dir das einfach mal aufzeichnen und dann mögliche Kombinationen bzw. Reihenfolgen der Eingangsvektoren und deren Ergebnisvektoren einzeichnen.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Werbeanzeige