LookAt函数

该页面https://goocreate.com/learn/everything-you-always-wanted-to-know-about-rotation/介绍了一种名为 LookAt 的功能,能够旋转一个三维对象以面向另一个对象。LookAt 函数的内部操作被描述为(但没有列出代码):

函数的工作方式是获取实体和目标位置并相减,以获取一个背向量。然后它计算上向量和背向量之间的叉乘,以获取正确向量。然后计算正确向量和背向量之间的叉积,以获取一个与方向向量和正确向量均正交的上向量,并将所有三个向量归一化后分别存储在我们的旋转 Matrix3x3 中的各自行内。

我正在尝试在没有3D函数库帮助的情况下复制这个功能。我有3D向量减法、矩阵乘法、点积和叉积函数。(我在编写 Lua 代码。)

我无法弄清楚如何使一个对象面向与另一个对象相同的方向(并且希望方向相同)。

我读到过这只是基于角度创建旋转矩阵的问题,但我发现所有关于3D角度的内容最终都会返回一个角度 - 我认为每个平面都应有3个角度。

如何构建这个旋转矩阵?我不知道我的对象面向哪个方向,这就是计算对象当前的x、y、z角度的问题。我认为我需要一个确定对象当前三维角度的函数以及一种将其转换为另一个对象的旋转矩阵的方法。

点赞
用户2858170
用户2858170

首先:

如果对象没有方向,你就不能将其转换成特定的方向。因此,你要么必须知道定义对象方向的向量,要么必须自己定义一个。

LookAt函数内部操作的描述(但没有列出代码)如下:

这不是真的。他们链接了一个FAQ,其中包含可能会在阅读文章时涉及的问题。(仔细阅读!

他们为你提供以下信息:

LookAt函数内部的算法是什么:
简写算法如下:

z.set(back_direction).normalize();
x.set(up).cross(z).normalize();
y.set(z).cross(x);
m[0] = x[0];
m[1] = x[1];
m[2] = x[2];
m[3] = y[0];
m[4] = y[1];
m[5] = y[2];
m[6] = z[0];
m[7] = z[1];
m[8] = z[2];

关于你所遇到的关于角度数量的问题:

如果你绕三个轴旋转,例如x、y、z,你只需要3个角度。但你可以绕任意轴旋转。然后当然只需要一个角度。

获取一本线性代数教材或浏览网络上的教程和例子。确保你了解自己在做什么。它会帮助你不用例子代码就能解决未来的问题。这是简单的数学 :)

2016-07-25 16:09:21