如何将对象定向到3D中的点,而不会沿着方向向量发生不希望的旋转

时间:2017-07-29 08:12:34

标签: opengl 3d rotation orientation glm-math

我正试图将物体朝向太空中的一个点,使用:

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));

当对象“看到”3D中的点时,它似乎围绕它自己的前向向量(m_X)旋转,这意味着UP向量的方向不正确。因此,对象有时会在颠倒时看到这一点......所以它就像是一个倾斜的头部(围绕局部前向矢量旋转)

我知道如何将物体朝向2D中的一个点 - 这不是我所追求的 - 我正在寻找一种方法来校正3d中的upvector,使得物体的“顶部”始终是(或多或少)面朝上,所以我需要对象跟随(看)不仅仅是左右两点,而且还要向上和向上下来。

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

1 个答案:

答案 0 :(得分:1)

只需重新安排进行计算的顺序:

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));

此处,up是完美的向上方向,例如(0, 1, 0)

请注意,如果uptarget - m_Position平行,则会失败,因为您将拥有无约束的自由度。您需要为该案例添加假设。