当前位置:  开发笔记 > 人工智能 > 正文

计算LookAt矩阵

如何解决《计算LookAt矩阵》经验,为你挑选了2个好方法。

我正在编写一个3d引擎,我遇到了DirectX文档中描述的LookAt算法:

zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)

 xaxis.x           yaxis.x           zaxis.x          0
 xaxis.y           yaxis.y           zaxis.y          0
 xaxis.z           yaxis.z           zaxis.z          0
-dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye)  l

现在我得到它在旋转方面的工作方式,但我不太明白的是为什么它将矩阵的平移组件放在那些点积上.稍微检查一下,它似乎是根据新基础矢量投影到眼睛/摄像机位置上的一小部分来调整摄像机位置.

问题是为什么需要这样做?它完成了什么?



1> bobobobo..:

请注意,给出的示例是左手行主矩阵.

所以操作是:先转换到原点(按眼睛移动),然后旋转,使得从眼睛At的矢量与+ z对齐:

基本上,如果你通过平移 - 眼睛预先乘以旋转矩阵,你会得到相同的结果:

[      1       0       0   0 ]   [ xaxis.x  yaxis.x  zaxis.x 0 ]
[      0       1       0   0 ] * [ xaxis.y  yaxis.y  zaxis.y 0 ]
[      0       0       1   0 ]   [ xaxis.z  yaxis.z  zaxis.z 0 ]
[ -eye.x  -eye.y  -eye.z   1 ]   [       0        0        0 1 ]

  [         xaxis.x          yaxis.x          zaxis.x  0 ]
= [         xaxis.y          yaxis.y          zaxis.y  0 ]
  [         xaxis.z          yaxis.z          zaxis.z  0 ]
  [ dot(xaxis,-eye)  dot(yaxis,-eye)  dot(zaxis,-eye)  1 ]

补充说明:

请注意,观察变换是(有意)反转的:您将每个顶点乘以此矩阵以"移动世界",以便您想要查看的部分最终出现在规范视图体积中.

还要注意,LookAt矩阵的旋转矩阵(称为R)分量是基矩阵的反转变化,其中R的行是旧基矢量的新基矢量(因此变量名称为xaxis.x ,. .xaxis是基础发生变化后的 x轴).然而,由于反转,行和列被转置.


矩阵乘法不是可交换的.
这是最好的答案,比当前接受的答案更有说服力。

2> Judge Maygar..:

我通过创建一个3x3旋转矩阵构建一个观察矩阵,就像你在这里做的那样,然后将它扩展为带有零的4x4和右下角的单个1.然后我使用负眼点坐标(无点积)构建一个4x4平移矩阵,并将两个矩阵相乘.我的猜测是,这个乘法产生的效果相当于示例底行中的点积,但我需要在纸上进行计算才能确定.

3D旋转可以转换轴.因此,您不能直接使用眼点,也不能将其转换为新的坐标系.这就是矩阵乘法 - 或者在这种情况下,3点积值 - 完成的.


您是否应该通过计算相机方向的反向世界矩阵来创建视图矩阵?
如果我错了,请纠正我,但你的描述似乎是*viewing*变换(即*view*矩阵),而OP似乎显示*look-at*矩阵.有一次,我认为*view*和*look-at*matrices在同一个地方,但得到了(昂贵的)刻录,现在我认为它们是2个不同的矩阵.这是错的吗?**look-at*矩阵**与*视图矩阵完全相同**但是只是以不同的方式构建?
推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有