2017-07-29 1 views
0

Je suis en train d'orienter un objet vers un point dans l'espace, en utilisant:Comment orienter vers le point objet en 3D sans rotations indésirables le long vecteur de direction

m_Z = glm::normalize(target - m_Position); 
m_Y = glm::normalize(m_Y - glm::dot(m_Y, m_Z) * m_Z); 
m_X = glm::normalize(glm::cross(m_Y, m_Z)); 

Et pendant que l'objet ne « regarde » la point en 3D, il semble tourner autour de son propre vecteur direct (m_X), ce qui signifie que le vecteur UP est dans une direction incorrecte. Donc l'objet regarde parfois le point tout en étant à l'envers ... Donc c'est comme une tête inclinée (pivotée autour d'un vecteur direct local)

Je sais orienter un objet vers un point en 2D - ce n'est pas ce que je suis après - je cherche un moyen de corriger l'upvector en 3d dans la mesure où le "top" de l'objet est toujours (plus ou moins) vers le haut, donc j'ai besoin que l'objet suive (regarde) le point non seulement à gauche et à droite, mais aussi & vers le bas.

m_X = left vector of object 
m_Y = up vector of object 
m_Z = forward vector of object 

target = point's world position 
m_Position = object's world position 

Répondre

1

juste réarranger l'ordre dans lequel vous faites les calculs:

m_Z = glm::normalize(target - m_Position); 
m_X = glm::normalize(glm::cross(up, m_Z)); 
m_Y = glm::normalize(glm::cross(m_Z, m_X)); 

Ici, up est le haut-direction parfaite, par exemple (0, 1, 0).

Notez que cela échouera si up est parallèle à target - m_Position car vous aurez un degré de liberté non contraint. Vous auriez besoin d'ajouter des hypothèses pour ce cas.

+0

Je viens d'essayer, il semble que les résultats sont ceux attendus, merci pour votre aide, marqué comme réponse, cela m'a beaucoup aidé! – Jack