XMMatrix的访问浮点数-()运算符不起作用

pon*_*cho 4 c++ directx matrix directx-11 modern-ui

我正在尝试在DirectX中做一些3D的工作(我正在从OpenGL迁移),但遇到了麻烦。

我想访问XMMATRIX的值,并查看Microsoft文档,应该有一个()运算符:

    float&  operator ()(
  size_t Row,
  size_t Column
);
Run Code Online (Sandbox Code Playgroud)

所以我尝试这样使用:

XMMATRIX i = XMMatrixIdentity();
float j = i(0,0);
Run Code Online (Sandbox Code Playgroud)

但是Intellisense给了我错误:

IntelliSense:调用类类型的对象,而没有适当的operator()或将函数转换为指针到函数的类型。

如果我忽略Intellisense并仍然进行编译,则会收到编译时错误:

错误C2064:术语未求值为带有2个参数的函数

有人知道为什么会这样吗?还是访问矩阵元素的另一种方法?

谢谢你的时间。

PS:如果此信息有帮助,我将为Windows 8创建C ++ / DirectX Modern UI应用程序。

Rog*_*and 6

检查此MSDN链接,您将看到它取决于您拥有的DirectX或XNA数学头以及当时有效的预处理器定义。默认情况下,出于优化的原因,矩阵和向量结构将使用SSE和内在函数实现,这使得提供行/列访问变得困难且昂贵。

尝试_XM_NO_INTRINSICS_在项目属性的C ++条目的预处理程序指令中定义,或者#define _XM_NO_INTRINSICS_在定义#include任何DirectX标头之前进行定义。

此摘录来自DirectXMath.h我的Windows 8 VS2012系统,显示了为什么出现此错误:

struct XMMATRIX
{
    // ... code removed for clarity

#ifdef _XM_NO_INTRINSICS_
    float       operator() (size_t Row, size_t Column) const { return m[Row][Column]; }
    float&      operator() (size_t Row, size_t Column) { return m[Row][Column]; }
#endif

    // ... code removed for clarity
};
Run Code Online (Sandbox Code Playgroud)


Chu*_*urn 6

XMVECTOR由于底层 SIMD 指令集的原因,对和的单个元素访问XMMATRIX效率非常低,因此 DirectXMath 库不通过成员方法支持它。根据您的需要,有多种方法可以实现此目的。

如果您只需要 (0,0) 元素,您可以使用:

float j = XMVectorGetX( i.r[0] );
Run Code Online (Sandbox Code Playgroud)

如果您要访问 XMMATRIX 的大部分或全部单个元素,最好的解决方案是将其转储到XMFLOAT4X4

XMFLOAT4X4 tmp;
XMStoreFloat4x4( &tmp, i );
float j = tmp.m[0][0]; // or float j = tmp._11
Run Code Online (Sandbox Code Playgroud)

我将提交一个文档错误,因为 MSDN 上提到的operator()实际上是“XNAMath”,而不是“DirectXMath”。请参阅此博客文章了解一些背景信息。

如果您发现 DirectXMath 对于您的需求来说有点过于核心,您可能需要考虑使用DirectX 工具包中的SimpleMath