Visual c++ XMMATRIX运算符()使用xnamath.h,但不使用DirectXMath.h 我是DirectX编程和Visual C++的新手,我有一个问题,我从XnasAT.h移植到DirectXMax.h的例子。我正在使用Visual Studio 2012

Visual c++ XMMATRIX运算符()使用xnamath.h,但不使用DirectXMath.h 我是DirectX编程和Visual C++的新手,我有一个问题,我从XnasAT.h移植到DirectXMax.h的例子。我正在使用Visual Studio 2012,visual-c++,directx,directx-11,Visual C++,Directx,Directx 11,代码的目的只是初始化XMMATRIX,然后在控制台中显示它。原始代码如下所示(工作正常): 但是,当我将标题更改为DirectXMath时,它将不再工作: #include <windows.h> #include <iostream> #include <DirectXMath.h> #include <DirectXPackedVector.h> using namespace DirectX; using namespace DirectX

代码的目的只是初始化XMMATRIX,然后在控制台中显示它。原始代码如下所示(工作正常):

但是,当我将标题更改为DirectXMath时,它将不再工作:

#include <windows.h>
#include <iostream>
#include <DirectXMath.h>
#include <DirectXPackedVector.h>
using namespace DirectX; 
using namespace DirectX::PackedVector;
using namespace std;

ostream& operator<<(ostream& os, CXMMATRIX m)
{
    for(int i = 0; i < 4; ++i)
    {
        for(int j = 0; j < 4; ++j)
            os << m(i, j) << "\t";
        os << endl;
    }
    return os;
}

int main()
{
    XMMATRIX A(1.0f, 0.0f, 0.0f, 0.0f,
               0.0f, 2.0f, 0.0f, 0.0f,
               0.0f, 0.0f, 4.0f, 0.0f,
               1.0f, 2.0f, 3.0f, 1.0f);

    cout << "A = " << endl << A << endl;

    return 0;
}
当我将鼠标悬停在
m(I,j)
下的红色曲线上时,它告诉我:

DirectX::CXMMATRIX m
Error: call of an object of a class type without appropriate operator() or conversion function to pointer-to-function type

如果您有任何建议,我们将不胜感激。

这取决于您用于DirectXMath的版本,您可以定义_XM\u NO\u intrinsic以获得所需的结果。有关更多信息,请参见

我将示例代码更改为使用

ostream& operator<<(ostream& os, CXMMATRIX m)
{
    for(int i = 0; i < 4; ++i)
    {
            for(int j = 0; j < 4; ++j)
                os << m.r[i].m128_f32[j] << "\t";
            os << endl;
    }
    return os;
}

ostream&operator在Direct X 11+中,直接访问矩阵的能力

matrix (row, column)
由于性能问题,已删除。Microsoft建议通过
r
成员访问这些值。我建议使用

XMStoreFloat4 (row, column)
对于4x4矩阵,您不需要担心数据类型

ostream& operator<< (ostream& os, CXMMATRIX m)
{
    for (int i = 0; i < 4; i++)
    {
        XMVECTOR row = m.r[i];
        XMFLOAT4 frow;
        XMStoreFloat4(&frow, row);

        os << frow.x << "\t" << frow.y << "\t" << frow.z << "\t" << frow.w << endl;
    }

    return os;
}
ostream和操作符
matrix (row, column)
XMStoreFloat4 (row, column)
ostream& operator<< (ostream& os, CXMMATRIX m)
{
    for (int i = 0; i < 4; i++)
    {
        XMVECTOR row = m.r[i];
        XMFLOAT4 frow;
        XMStoreFloat4(&frow, row);

        os << frow.x << "\t" << frow.y << "\t" << frow.z << "\t" << frow.w << endl;
    }

    return os;
}