2009-10-04 9 views
14

Come puoi dire dallo this screenshot, sto provando a creare un motore fisico per un platform su cui sto lavorando, ma mi sono imbattuto in un problema ben preciso: ho bisogno di essere in grado di scoprire l'angolo di uno qualsiasi dei triangoli che puoi vedere comporre questa maglia, in modo da poter calcolare la rotazione e quindi l'accelerazione angolare del giocatore quel triangolo.Trova l'angolo normale della faccia di un triangolo in 3D, date le coordinate dei suoi vertici

screenshot

posso usare un algoritmo che ho creato per trovare le posizioni di tutti e 3 i punti di ogni triangolo che il giocatore è in contatto con, ma non so come utilizzare i punti per lavorare fuori la rotazione del triangolo.

Per rotazione, intendo la direzione del normale lontano dal centro della faccia, cioè l'angolo a cui una persona si appoggia se si trovasse su quella superficie. Qualcuno può inventare una serie di equazioni che consentano di risolvere questo problema?

+1

Grazie per aver aggiunto l'immagine sono solo un ospite :-( –

+0

Grazie ragazzi, risposta alla domanda! –

risposta

34

Se si prende il prodotto vettoriale dei due vettori:

p1 - p0 

e

p2 - p0 

dove p0, p1 e p2 sono tre vertici del triangolo, otterrai il normale. Un triangolo è considerato rivolto verso di te se i vertici sono ordinati in senso orario rispetto alla sua normale esteriore. Questa è chiamata la regola della mano sinistra. Immaginate tenendo la mano sinistra con le dita piegate da p0 a p1, il pollice sporge in direzione del volto normale:

face pointing away from camera face pointing towards camera

2

Ci sono 2 normali al triangolo (ovviamente) e quello che ottieni dagli algoritmi standard dipende dall'ordine dei suoi vertici. Citazioni wiki

"Per un poligono (ad esempio un triangolo), una superficie normale può essere calcolata come prodotto vettoriale incrociato di due spigoli (non paralleli) del poligono."

Ma la direzione della normale dipende l'ordine dei punti scelto, è possibile calcolare e decidere l'utilizzo di alcune altre euristiche se il vettore inverso è normale che ti interessa.

9

Il prodotto croce è la risposta giusta. Non dimenticare di normalizzare il risultato e non dimenticare che se il triangolo ha un'area zero, il risultato non è valido perché non esiste una normale ben definita. In sostanza, se i tre vertici sono p0, p1 e p2:

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

Inoltre, come l'altra risposta, dice, se si ottiene il 'up rivolta' o 'giù di fronte a' normale dipenderà l'ordinamento dei vostri vertici .

+2

+1 Buon punto sui triangoli degenerati. –

+0

Se il triangolo ha un'area zero, non avete definito una linea o un punto, che non sono triangoli? Che può essere catturato con una clausola di guardia, no? – jcolebrand

3

Per completare la risposta alla domanda, una volta ottenuto il vettore normale del triangolo dell'unità, è possibile calcolare l'angolo utilizzando un prodotto punto.

Il prodotto punto di due vettori di unità è uguale al coseno dell'angolo tra di loro, quindi se si calcola l'arccos del prodotto punto del proprio vettore unità normale e l'unità Su vettore si otterrà l'angolo di inclinazione del proprio triangolo (angolo lontano dall'orizzontale).

Inoltre, si noti che OpenGL utilizza convenzionalmente un sistema di coordinate destrorso, quindi se lo si sta utilizzando, i vertici del triangolo avranno un ordine in senso antiorario.