OpenGl 在 Y 轴上旋转对象以查看另一个对象
OpenGl Rotate object on Y axis to look at another object
就像在一个主题中一样,我有 2 个对象,一个在周围移动(在 z 和 x 轴上),另一个是静止的,但应该围绕 y 轴旋转,以便始终像看另一个一样......我是与此抗争已经一个星期了
我现在得到的是
从 1object 到 2object 的矢量和 2object 的实际查看(也是矢量)
我正在计算这两个向量之间的角度并将其添加到 2 对象的 rotattion.y 但它无法正常工作
知道如何让它发挥作用吗?顺便说一句,我正在使用 eular 天使变换
伪代码:
vectorFrom1to2 = vector1 - vector2;
lookatVectorof2ndObject;
我将它们都归一化,然后
float angle = acos(dot(vectorFrom1to2, lookatVectorof2ndObject));
object2.rotateY = angle;
我不知道我错在哪里
作为一般经验法则,在我观察到的许多情况下证明了自己是正确的:一旦你发现自己从向量计算 角度 ,你很可能正在做某事以一种比必要的更不必要的复杂方式。
您只需要一个基础变换,它可以变换第一个对象的局部坐标系,使其局部 Z 轴指向第二个对象。你可以用一个简单的旋转矩阵来做到这一点(前提是你有一个 matrix/vector 库可以更容易地促进这一点)。
所以,如果你有对象 1 的位置 p1
和对象 2 的位置 p2
并且你希望 p1
旋转到 p2
,那么旋转矩阵可以通过以下方式获得:
(我只是在这里使用 GLSL 伪语法)
vec3 p1 = ... // <- position of first object
vec3 p2 = ... // <- position of second object
vec3 d = normalize(p2 - p1)
vec3 r = cross(vec3(0.0, 1.0, 0.0), d)
= vec3(d.z, 0, -d.x)
mat3 m = mat3(d.z, 0, -d.x, // <- first column ('right' vector)
0, 1, 0, // <- second column (keep Y)
d.x, 0, d.z) // <- third column (map Z to point towards p2)
当通过 m
变换第一个对象的顶点 v
时: v' = m * v
你得到对象 p1
的 Z 轴指向 p2
,都是在同一个"world"坐标系下制定的。
就像在一个主题中一样,我有 2 个对象,一个在周围移动(在 z 和 x 轴上),另一个是静止的,但应该围绕 y 轴旋转,以便始终像看另一个一样......我是与此抗争已经一个星期了
我现在得到的是
从 1object 到 2object 的矢量和 2object 的实际查看(也是矢量) 我正在计算这两个向量之间的角度并将其添加到 2 对象的 rotattion.y 但它无法正常工作
知道如何让它发挥作用吗?顺便说一句,我正在使用 eular 天使变换
伪代码:
vectorFrom1to2 = vector1 - vector2;
lookatVectorof2ndObject;
我将它们都归一化,然后
float angle = acos(dot(vectorFrom1to2, lookatVectorof2ndObject));
object2.rotateY = angle;
我不知道我错在哪里
作为一般经验法则,在我观察到的许多情况下证明了自己是正确的:一旦你发现自己从向量计算 角度 ,你很可能正在做某事以一种比必要的更不必要的复杂方式。
您只需要一个基础变换,它可以变换第一个对象的局部坐标系,使其局部 Z 轴指向第二个对象。你可以用一个简单的旋转矩阵来做到这一点(前提是你有一个 matrix/vector 库可以更容易地促进这一点)。
所以,如果你有对象 1 的位置 p1
和对象 2 的位置 p2
并且你希望 p1
旋转到 p2
,那么旋转矩阵可以通过以下方式获得:
(我只是在这里使用 GLSL 伪语法)
vec3 p1 = ... // <- position of first object
vec3 p2 = ... // <- position of second object
vec3 d = normalize(p2 - p1)
vec3 r = cross(vec3(0.0, 1.0, 0.0), d)
= vec3(d.z, 0, -d.x)
mat3 m = mat3(d.z, 0, -d.x, // <- first column ('right' vector)
0, 1, 0, // <- second column (keep Y)
d.x, 0, d.z) // <- third column (map Z to point towards p2)
当通过 m
变换第一个对象的顶点 v
时: v' = m * v
你得到对象 p1
的 Z 轴指向 p2
,都是在同一个"world"坐标系下制定的。