2013-01-09 121 views
4

我是directX編程和Visual C++的新手,我遇到了將從xnamath.h中找到的示例遷移到DirectXMath.h的問題。我正在使用Visual Studio 2012.XMMATRIX運算符()與xnamath.h一起使用,但不能與DirectXMath.h一起使用

代碼的目的僅僅是初始化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 

任何意見將不勝感激。

回答

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了。

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跳轉出來的......當升級舊代碼時,這可能會很痛苦,但它是值得的。

相關問題