我正试图将物体朝向太空中的一个点,使用:
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
答案 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)
。
请注意,如果up
与target - m_Position
平行,则会失败,因为您将拥有无约束的自由度。您需要为该案例添加假设。