如何从视图矩阵中获取当前相机位置?

4

我已经实现了一个简单的弧形球相机,并且它运行良好。当我使用鼠标时,我通过滚动、俯仰和偏航更新视图矩阵。

但是,为了正确计算镜面反射,我需要当前摄像机在世界空间中的位置,而这个位置并没有在应用旋转时被更新。

你们知道如何从视图矩阵中检索出当前位置吗?或者还有其他方法可以更新它吗?


1
这是一个ModelView矩阵吗?如果是的话,请参见https://www.opengl.org/discussion_boards/showthread.php/178484-Extracting-camera-position-from-a-ModelView-Matrix - Arnav Borborah
不确定你所说的ModelView矩阵是什么意思 :P 我所指的View矩阵是DirectX::XMMatrixLookAtLH(position, target, up)的结果。 - Bartosz Boczula
我添加了一些调试输出,但结果不对。以下是位置信息: BaseCamera::updateVewMatrix():位置 6.000000,6.000000-10.000000 0.000000 这是视图矩阵: [[-0.000000][0.000000][1.000000][0.000000]] [0.000000][1.000000][0.000000][0.000000]] [[-1.000000][0.000000][-0.000000][0.000000]] [[0.000000][0.000000][19.999998][1.000000]] - Bartosz Boczula
所以我猜这不仅仅是简单的“获取第三行”的情况。 - Bartosz Boczula
1个回答

7

你有几个简单的选择:

  1. 通过调用XMMatrixInverse或D3DXMatrixInverse反转视图矩阵,以获取“CameraWorld”矩阵。然后它的(_41,_42,_43)元素将是位置向量。

  2. 反转视图矩阵(与上次一样),但不是读取forth roe,而是使用XMMatrixDecompose或D3DXMatrixDecompose来获取相机位置和方向。

一个好主意是将View和InvView矩阵都保存在程序内存中,以便快速访问这些信息:矩阵反转计算代价昂贵。

  • 视图矩阵仅仅是相机世界矩阵的反向变换(只是忽略系统的左手或右手性质)。

1
矩阵将被存储为XMMATRIX,以便编译器将其存储为高速CPU浮点寄存器(参见SSE3DNow!NEON等)。您可以使用XMStoreFloat4x4将XMMATRIX转换为XMFLOAT4X4(并使用XMLoadStoreFloat4x4相反)。 - Sprimesson
1
绝对不可以。如果你是一个刚入门的程序员,那么应该将它们转换为XMFLOAT4X4并进行简单的计算。但是如果计算复杂且繁重,你必须使用XMMATRIX来执行它们。 - Sprimesson
1
请注意,XMMATRIX变量通常不存储在RAM中。因此,请勿对它们进行有趣的引用/取消引用操作!如果您想将数据存储在RAM上,必须使用XMFLOAT4X4或XMFLOAT4X4A(后者速度更快,但在使用时应小心)。 - Sprimesson
1
在您的情况下,将其转换为XMFLOAT4X4是一个好习惯(同时您可以使用m.r[3]获取反转XMMATRIX的第四行,并直接将其转换为XMFLOAT3,从而获得您想要的内容)。 - Sprimesson
1
你可能会发现,使用 DirectX Tool Kit 中的 SimpleMath 包装器更容易,它可以处理所有的 XMLoadFloat4x4 / XMStoreFloat4x4 等 C++ 运算符,非常适合简化使用,特别是对于新手来说,这样做可以避免使用 SIMD 数学库时的困难。 - Chuck Walbourn
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接