C++ XMMatrix-()运算符的访问浮点不工作

C++ XMMatrix-()运算符的访问浮点不工作,c++,matrix,directx,directx-11,modern-ui,C++,Matrix,Directx,Directx 11,Modern Ui,我试图用DirectX做一些3D的东西,我从OpenGL迁移过来,遇到了一个障碍 我想访问XMMATRIX的值,并查看Microsoft文档,其中应该有一个运算符: float& operator ()( size_t Row, size_t Column ); 因此,我试着这样使用: XMMATRIX i = XMMatrixIdentity(); float j = i(0,0); 但是Intellisense给了我一个错误: IntelliSense:在没有适

我试图用DirectX做一些3D的东西,我从OpenGL迁移过来,遇到了一个障碍

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

    float&  operator ()(
  size_t Row,
  size_t Column
);
因此,我试着这样使用:

XMMATRIX i = XMMatrixIdentity();
float j = i(0,0);
但是Intellisense给了我一个错误:

IntelliSense:在没有适当运算符或转换函数的情况下,调用类类型的对象以指向函数类型的指针

如果忽略Intellisense并进行编译,则会出现编译时错误:

错误C2064:项不计算为包含2个参数的函数

有人知道为什么会这样吗?或者以另一种方式访问矩阵的元素

谢谢你抽出时间

另外,如果这些信息有帮助的话,我正在为Windows 8创建一个C++/DirectX Modern UI应用程序。

检查,您会发现这取决于您使用的DirectX或XNA数学头以及当时生效的预处理器定义。默认情况下,出于优化的原因,矩阵和向量结构将使用SSE和Intrinsic实现,这使得提供行/列访问变得困难和昂贵

尝试在项目属性的C++条目的预处理器指令中定义XMyNoInIsNeCsIsx,或者在包含任何DirectX标题之前定义XxMyNoInInsiCsI. 此摘录自Windows 8 VS2012系统上的DirectXMath.h,显示了出现此错误的原因:

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
};
您可以尝试:

XMMATRIX i = XMMatrixIdentity();
float j = i.r[0].m128_f32[0];

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

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

float j = XMVectorGetX( i.r[0] );
如果要访问XMMATRIX的大部分或所有单个元素,最好的解决方案是将其转储到XMFLOAT4X4:

我将提交一个doc错误,因为MSDN上提到的操作符实际上是XNAMath,而不是DirectXMath。有关背景信息,请参阅


如果你发现DrimxMasic对于你的需求来说有点太硬,你可能想考虑使用./P>< P>我发现这是可行的,我也把我的代码放在同一个射线拾取教程上,我从XNAMATH转移到DUNCTXMUX。< /P> 这将从矩阵中选择正确的值,而无需禁用SSE内部函数

投影是包含来自摄影机的视图矩阵的XMMATRIX

    XMVECTOR xv = projection.r[0];
    XMVECTOR yv = projection.r[1];
    PRVecX =  ((( 2.0f * mouseX) / Window::ClientWidth) - 1 ) / XMVectorGetX(xv);
    PRVecY = -((( 2.0f * mouseY) / Window::ClientHeight) - 1 ) / XMVectorGetY(yv);

用define禁用intrinsic是个坏主意,因为它会大大降低程序的速度。在可能的情况下,将代码转换为正确加载和存储内在值,如上所述。

在文件头添加define\u XM\u NO\u INTRINSICS

#include <windows.h>
#define _XM_NO_INTRINSICS_//must before #include <DirectXMath.h>
#include <DirectXMath.h>
#include <iostream>

如果将调用更改为i.operator0,0会发生什么情况?@LuchianGrigore请看我的问题-我也编译了…我想访问它的唯一原因是因为这里的教程:它为“camProjection”实现了这一功能,将X/Y鼠标线从屏幕空间转换为视图空间。如果没有使用camProjection0,0等,我真的不太懂数学。如果有人能给我一个关于为什么我们必须为Z做这件事的快速解释/链接,我将不胜感激。@poncho好的,但你最好还是把它作为一个新问题提出来-你上面的问题非常符合SO问答格式,非常干净,所以为什么不把你的评论扩展成一个新的问题,也许有一些相关的代码。非常感谢迄今为止的帮助:这将无法移植到ARM-NEON。float j=XMVectorGetX i.r[0];工作,但不是一个特别有效的编码方式。
#include <windows.h>
#define _XM_NO_INTRINSICS_//must before #include <DirectXMath.h>
#include <DirectXMath.h>
#include <iostream>