如何将对象定向到 3D 中的点而不会沿方向向量进行不需要的旋转

How to orient object towards point in 3D without undesired rotations along direction vector

我正在尝试将对象定向到 space 中的一个点,使用:

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 中 "look at" 点,但它似乎围绕它自己的前向矢量 (m_X) 旋转,这意味着向上矢量的方向不正确。所以这个物体有时在倒着的时候看着那个点...所以它就像一个倾斜的头(围绕局部前向矢量旋转)

我知道如何将对象定向到 2D 中的一个点 - 这不是我所追求的 - 我正在寻找一种方法来将 3d 中的向上矢量校正到对象 "top" 总是(或多或少)面朝上,所以我需要物体跟随(看)点,不仅是左右,还有上下。

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

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

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 平行,这将失败,因为您将拥有不受约束的自由度。您需要为这种情况添加假设。