所以就像在一个主题中一样,我有两个对象,一个是我移动的(在z和x轴上(,另一个是静态的,但应该围绕y轴旋转,以总是像看另一个一样。。。我已经和这个斗争了一个星期
我现在得到的是
从1对象到2对象的矢量以及2对象的实际视图(也是矢量(我正在计算这两个向量之间的夹角,并将其添加到2个对象的旋转y中,但它不能正常工作
知道如何让它工作吗?顺便说一句,我正在使用欧拉天使变换
pseudCode:
vectorFrom1to2 = vector1 - vector2;
lookatVectorof2ndObject;
我把它们都标准化,然后
float angle = acos(dot(vectorFrom1to2, lookatVectorof2ndObject));
object2.rotateY = angle;
我不知道我把错在哪里了
在我观察到的许多情况下,经验法则证明了这一点:一旦你发现自己根据向量计算角度,你很可能会以一种比必要的更不必要的复杂方式做一些事情。
您所需要的只是一个基础变换,它变换第一个对象的局部坐标系,使其局部Z轴指向第二个对象。你可以用一个简单的旋转矩阵来实现这一点(前提是你有一个矩阵/向量库可以更容易地实现这一目标(。
因此,如果您有位置为p1
的对象1和位置为p2
的对象2,并且您希望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' = m * v
变换第一个对象的顶点v
时,可以使对象p1
的Z轴指向p2
的位置,所有这些都在同一个"世界"坐标系中表示。