我是directX编程和Visual C ++的新手,我在将从xnamath.h找到的示例迁移到DirectXMath.h时遇到了问题。我正在使用Visual Studio 2012。
代码的目的只是初始化XMMATRIX,然后在控制台中显示它。原始代码如下所示(它工作正常):
#include <windows.h>
#include <xnamath.h>
#include <iostream>
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;
}
当我运行程序时,它提供以下输出:
A =
1 0 0 0
0 2 0 0
0 0 4 0
1 2 3 1
Press any key to continue . . .
但是,当我将标题更改为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;
}
当我尝试编译时,我收到os << m(i, j) << "\t";
的错误,其中包含:
error C2064: term does not evaluate to a function taking 2 arguments
当我将鼠标悬停在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
非常感谢任何建议。
答案 0 :(得分:2)
这取决于您用于DirectXMath的版本,您可以定义_XM_NO_INTRINSICS_以获得所需的结果。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xmmatrix(v=vs.85).aspx
答案 1 :(得分:2)
我更改了示例代码以使用
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;
}
这与旧的xnamath具有相同的效果。
答案 2 :(得分:0)
在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;
}
使用_XM_NO_INTRINSICS_
时要小心,因为这不仅会影响矩阵值,还可能会影响性能敏感代码,并可能影响其他操作。 DirectXMath是XNAMath的一个跳转...当升级旧代码时,它可能很痛苦,但值得。