2009-10-04 21 views
14

Como puedes ver en this screenshot, estoy intentando hacer un motor de física para una plataforma en la que estoy trabajando, pero me he topado con un problema definido: necesito poder descubrir el ángulo de cualquiera de los triángulos que puedes ver para formar esta malla, de modo que pueda calcular la rotación y, por lo tanto, la aceleración angular del jugador en ese triánguloEncuentra el ángulo normal de la cara de un triángulo en 3D, dadas las coordenadas de sus vértices

screenshot

puedo usar un algoritmo que he creado para encontrar las ubicaciones de los 3 puntos de cualquier triángulo que el jugador está en contacto con, pero no saben cómo utilizar esos puntos para hacer ejercicio la rotación del triángulo

Por la rotación, me refiero a la dirección de la normalidad lejos del centro de la cara, es decir, el ángulo en el que una persona se inclinaría si estuviera en esa superficie. ¿Puede alguien presentar una serie de ecuaciones que permitan resolver este problema?

+1

Gracias por añadir la imagen Sólo soy un invitado :-( –

+0

Gracias chicos, pregunta respondida! –

Respuesta

34

Si se toma el producto vectorial de los dos vectores:

p1 - p0 

y

p2 - p0 

donde p0, p1 y p2 son tres vértices del triángulo, obtendrás lo normal. Se considera que un triángulo apunta hacia usted si los vértices están ordenados en el sentido de las agujas del reloj con respecto a su normal hacia afuera. Esto se llama regla de la mano izquierda. Imagínese la celebración de su mano izquierda con los dedos curvados de p0 a p1, el pulgar sobresale en la dirección de la normal de la cara:

face pointing away from camera face pointing towards camera

2

Hay 2 normales para el triángulo (por supuesto) y la que obtiene de los algoritmos estándar depende del orden de sus vértices. Citando wiki

"Para un polígono (como un triángulo), una superficie normal se puede calcular como el producto vectorial cruzado de dos bordes (no paralelos) del polígono".

Pero la dirección de la normal depende del orden de los puntos elegidos, se puede calcular y decidir el uso de algunos otros heurística si el vector inverso es lo normal le interesa.

9

El producto cruz es la respuesta correcta. No te olvides de normalizar el resultado, y no te olvides que si el triángulo tiene un área cero, el resultado no es válido porque no hay una normal bien definida. Básicamente, si sus tres vértices son p0, p1 y p2:

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

Además, como dice la otra respuesta, si obtiene el 'enfrentando' o 'abajo hacia' normal dependerá de la ordenación de sus vértices .

+2

1 punto positivo de triángulos degenerados. –

+0

Si el triángulo tiene un área de cero, ¿no es así definido, ya sea una línea o un punto, que no son triángulos, eso se puede atrapar con una cláusula de guardia, ¿no? – jcolebrand

3

Para terminar de responder a su pregunta, una vez que tenga el vector normal de la unidad de su triángulo, puede calcular el ángulo con un producto de puntos.

El producto escalar de dos vectores unitarios es igual al coseno del ángulo entre ellos, por lo que si calcula los arcos del producto escalar de su unidad vector normal y su unidad Vector ascendente obtendrá el ángulo de inclinación de su triángulo (ángulo alejado de la horizontal).

Además, tenga en cuenta que OpenGL utiliza convencionalmente un sistema de coordenadas a la derecha, por lo que si está utilizando eso, entonces sus vértices triangulares tendrán un orden en sentido antihorario.

Cuestiones relacionadas