为什么XMMatrixInverse()有行列式参数?
why XMMatrixInverse() has pDeterminant parameter?
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 包装器。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 为什么XMMatrixInverse()有行列式参数?