5

私はdirectXプログラミングとVisualC++を初めて使用し、見つけた例をxnamath.hからDirectXMath.hに移行する際に問題が発生します。VisualStudio2012を使用しています。

このコードの目的は、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

アドバイスをいただければ幸いです。

4

3 に答える 3

2

DirectXMath に使用しているバージョンによって異なります。_XM_NO_INTRINSICS_ を定義して、必要な結果を得ることができます。詳細については、 http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xmmatrix (v=vs.85).aspxを参照してください。

于 2013-01-10T18:02:54.283 に答える
1

Direct X 11+ では、マトリックスに直接アクセスする機能

matrix (row, column)

パフォーマンスの問題により削除されました。rMicrosoft は、メンバーを介して値にアクセスすることをお勧めします。使用することをお勧めします

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 からのジャンプです... 古いコードをアップグレードするときは面倒かもしれませんが、それだけの価値はあります。

于 2013-08-06T20:34:00.787 に答える