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



所以就像在一个主题中一样,我有两个对象,一个是我移动的(在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,并且您希望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)

当用m通过:v' = m * v变换第一个对象的顶点v时,可以使对象p1的Z轴指向p2的位置,所有这些都在同一个"世界"坐标系中表示。

最新更新