2009-10-04 18 views
14

Wie Sie vielleicht von this screenshot erzählen können, ich versuche, eine Physik-Engine für einen Platformer zu machen, an dem ich arbeite, aber ich bin auf ein bestimmtes Problem gestoßen: Ich muss in der Lage sein, den Winkel eines der Dreiecke zu finden, die man sehen kann, um dieses Netz zu bilden, so dass ich die Rotation und somit die Winkelbeschleunigung des Spielers trainieren kann dieses Dreieck.Finden Sie den normalen Winkel der Fläche eines Dreiecks in 3D, gegeben die Koordinaten seiner Ecken

screenshot

ich einen Algorithmus, den ich erstellen verwenden kann, um die Standorte aller drei Punkte jedes Dreieck zu finden, die der Spieler in Kontakt ist, aber ich weiß nicht, wie diese Punkte zu verwenden, um herauszufinden, die Drehung des Dreiecks.

Mit der Drehung meine ich die Richtung der Normalen weg von der Gesichtsmitte, d. H. Den Winkel, in dem sich eine Person lehnen würde, wenn sie auf dieser Oberfläche stünde. Kann jemand eine Reihe von Gleichungen aufstellen, mit denen dieses Problem gelöst werden kann?

+1

Danke für das Hinzufügen des Bildes Ich bin nur ein Gast :-( –

+0

Danke Jungs, Frage beantwortet! –

Antwort

34

Wenn Sie sich das Kreuzprodukt der beiden Vektoren:

p1 - p0 

und

p2 - p0 

wo p0, p1 und p2 sind drei Eckpunkte des Dreiecks, Sie erhalten die Normale. Ein Dreieck wird als auf dich gerichtet betrachtet, wenn die Scheitelpunkte im Uhrzeigersinn in Bezug auf seine äußere Normale angeordnet sind. Dies wird die linke Handregel genannt. Stellen Sie sich vor der linken Hand mit den Fingern von p0 zu p1 gelockt, Daumen-Sticks in Richtung des Gesichts aus normal:

face pointing away from camera face pointing towards camera

2

Es gibt 2 Normalen für das Dreieck (natürlich) und die, die Sie von Standardalgorithmen erhalten, hängt von der Reihenfolge der Ecken ab. Zitieren wiki

"Für ein Polygon (z. B. ein Dreieck) kann eine Flächennormale als das Vektorkreuzprodukt von zwei (nicht parallelen) Kanten des Polygons berechnet werden."

Aber die Richtung der Normalen ist abhängig von der Reihenfolge der Punkte gewählt, können Sie sie berechnen und entscheiden können, einige andere Heuristik, ob der Rückwärtsvektor die normal sind Sie interessiert.

9

Das Kreuzprodukt die richtige Antwort ist. Vergessen Sie nicht, das Ergebnis zu normalisieren, und vergessen Sie nicht, dass das Ergebnis ungültig ist, wenn das Dreieck keine Fläche hat, weil es keine gut definierte Norm gibt. Grundsätzlich, wenn Sie Ihre drei Ecken p0 sind, p1 und p2:

vector temp = cross(p1 - p0, p2 - p0); 
if (length(temp) < epsilon) then 
    Degenerate_triangle_error; 
else 
    return normalize(temp); 

Auch, wie die andere Antwort sagt, ob Sie die ‚nach oben gerichtet‘ oder ‚nach unten gerichtet‘ normalen hängt von der Bestellung Ihrer Eckpunkten erhalten .

+2

+1 Guter Punkt über degenerierte Dreiecke. –

+0

Wenn das Dreieck Nullbereich hat, haben Sie nicht entweder eine Linie definiert oder ein Punkt, der keine Dreiecke ist? Das kann mit einer Wächterklausel gefangen werden, nicht? – jcolebrand

3

Um die Beantwortung Ihrer Frage abzuschließen, können Sie den Winkel mit einem Punktprodukt berechnen, sobald Sie den Einheitsnormalenvektor Ihres Dreiecks haben.

Das Skalarprodukt zweier Einheitsvektoren ist gleich dem Kosinus des Winkels zwischen ihnen. Wenn Sie also die Arccos des Skalarprodukts Ihres Einheitsnormalenvektors und Ihrer Einheit Aufwärtsvektor berechnen, erhalten Sie den Steigungswinkel Ihrer Dreieck (Winkel von der Horizontalen weg).

Beachten Sie auch, dass OpenGL normalerweise ein rechtshändiges Koordinatensystem verwendet. Wenn Sie das also verwenden, werden Ihre Dreieckscheitelpunkte entgegen dem Uhrzeigersinn angeordnet.

Verwandte Themen