因此,就像在一个主题中,我有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;
我不知道我在哪里犯错
答案 0 :(得分:1)
作为一般经验法则,在许多情况下我都发现它是正确的:当您发现自己从向量计算 angles 时,您很有可能会以不必要的复杂性来做某事不必要的方式。
您需要做的是基础转换,该转换将第一个对象的局部坐标系转换为使其局部Z轴指向第二个对象。您可以使用简单的旋转矩阵来做到这一点(前提是您已准备好矩阵/矢量库,可以更轻松地实现此目的)。
因此,假设您的对象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)
使用v
通过m
变换第一个对象的顶点v' = m * v
时,您得到对象p1
的Z轴指向{{1 }},它们都在同一个“世界”坐标系中表示。