OpenGl在Y轴上旋转对象以查看另一个对象

时间:2018-11-18 20:58:19

标签: opengl math rotation glsl angle

因此,就像在一个主题中,我有2个对象(在z和x轴上)我绕着移动,另一个是静态的,但应该绕着y轴旋转以始终像看另一个一样...而我正在与这已经一个星期了

我现在得到的是

从1个对象到2个对象的

矢量,并实际查看2个对象的(也为矢量) 我正在计算这两个向量之间的天使,并将其添加到2个对象的rotattion.y中,但它无法正常工作

有什么办法使它起作用吗?顺便说一句,我正在使用Eular天使变换

pseudCode:

vectorFrom1to2 = vector1 - vector2;
lookatVectorof2ndObject;

我将它们都标准化,然后

float angle = acos(dot(vectorFrom1to2, lookatVectorof2ndObject));
object2.rotateY = angle;

我不知道我在哪里犯错

1 个答案:

答案 0 :(得分:1)

作为一般经验法则,在许多情况下我都发现它是正确的:当您发现自己从向量计算 angles 时,您很有可能会以不必要的复杂性来做某事不必要的方式。

您需要做的是基础转换,该转换将第一个对象的局部坐标系转换为使其局部Z轴指向第二个对象。您可以使用简单的旋转矩阵来做到这一点(前提是您已准备好矩阵/矢量库,可以更轻松地实现此目的)。

因此,假设您的对象1的位置为p1,而对象2的位置为p2,并且您希望p1p2旋转,则旋转矩阵可以为获得如下:

(我在这里只是使用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)

使用v通过m变换第一个对象的顶点v' = m * v时,您得到对象p1的Z轴指向{{1 }},它们都在同一个“世界”坐标系中表示。