简体   繁体   中英

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

I'm trying to orient an object towards a point in space, using:

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

And while the object does "look at" the point in 3D, it seems to rotate around it's own forward vector (m_X) meaning the UP vector is in an incorrect direction. So the object is sometimes looking at the point while being upside down... So it's like a head that's tilted (rotated around local forward vector)

I know how to orient an object towards a point in 2D - that is not what I'm after - I'm looking for a way to correct the upvector in 3d to an extent that the object's "top" is always (more or less) facing up, so I need the object to follow (look at) the point not just left and right, but also up & down.

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

Just re-arrange the order in which you do the calculations:

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

Here, up is the perfect up-direction, eg (0, 1, 0) .

Note that this will fail if up is parallel to target - m_Position as you will have an unconstrained degree of freedom. You would need to add assumptions for that case.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM