为什么XMMatrixInverse()有行列式参数?

why XMMatrixInverse() has pDeterminant parameter?

本文关键字:行列式 参数 XMMatrixInverse 为什么      更新时间:2023-10-16
XMMATRIX XM_CALLCONV XMMatrixInverse(XMVECTOR *pDeterminant, FXMMATRIX M);

我刚刚开始学习 DirectX,我不明白为什么这个函数除了原始矩阵本身之外还要求行列式参数来计算逆函数。

根据我对数学部分的记忆,仅输入矩阵就足够了:

orig matrix -> cofactor matrix -> adjoint matrix
orig matrix -> det[orig matrix]
inverse = adjoint/det

那么为什么它需要额外的参数呢? 为了加快计算速度,请消除上述第二步?

DirectXMath 中的XMMatrixInverse函数使用 Cramer 规则来计算逆函数。大部分代码是计算伴随,最后一步是乘以行列式的倒数。因此,该函数还必须计算行列式。

因此,该函数可以选择返回该行列式,以防您有其他用途。正如对您的问题的评论中所述,pDeterminant是 2.04 之前的 xboxmath/XNAMath 中的必需参数,

XMMATRIX XMMatrixInverse(_Out_ XMVECTOR* pDeterminant, CXMMATRIX M);

但我在 DirectXMath 中将其设置为可选,如 SAL 注释所示:

XMMATRIX XM_CALLCONV XMMatrixInverse(_Out_opt_ XMVECTOR* pDeterminant, _In_ FXMMATRIX M);

所以你可以做到:

XMMATRIX mat = …
// Don't care about the determinant
XMMATRIX imat = XMMatrixInverse(nullptr, mat);
// Want the determinant
XMVECTOR d;
XMMATRIX imat = XMMatrixInverse(&d, mat);

XNAMath 2.04 是一个仅限 Web 的版本,旨在更紧密地匹配我为 DirectXMath 所做的一些更改,以帮助从 Xbox 360 和旧版 DirectX SDK 过渡。请参阅此博客文章。

由于您是 DirectX 的新手,因此您应该特别查看适用于 DX11/DX12 的DirectX 工具包和用于 DirectXMath 的 SimpleMath 包装器。