4

現在、ビデオ ゲーム + エンジンを作成しています。RasterTek で、DirectX 11 プログラミングに関する本当に素晴らしいチュートリアルをいくつか見つけました。残念ながら、彼らは廃止された DirectX SDK を使用しており、私は Windows SDK に含まれる新しい DirectX SDK で VS 2013 を使用しています。

Windows SDK を使用するようにコードを変換していますが、チュートリアル 4 でいくつかの問題に遭遇しました (はい、49 個のチュートリアルすべてを変換しますが、おそらくさらに多くの問題が発生するでしょう)。

D3DXMathの操作から、D3DXVECTOR3 を XMFLOAT3 に変換する必要があると言われました。次に、 XMVector3TransformCoord に変換されたD3DXVec3TransformCoordでこれらの XMFLOAT3 を使用しようとしています。

例:

XMFLOAT3 up, position, lookAt;

// Setup the vector that points upwards.
up.x = 0.0f
up.y = 1.0f
up.z = 0.0f

// Setup the position of the camera in the world.
position.x = m_positionX;
position.y = m_positionY;
position.z = m_positionZ;

// Setup where the camera is looking by default.
lookAt.x = 0.0f;
lookAt.y = 0.0f;
lookAt.z = 1.0f;

// Transform the lookAt and up vector by the rotation matrix so the view is correctly rotated at the origin.
XMVector3TransformCoord(lookAt, rotationMatrix);
XMVector3TransformCoord(up, rotationMatrix);

エラーが発生します:

IntelliSense: "DirectX::XMFLOAT3" から "DirectX::XMVECTOR" への適切なユーザー定義の変換が存在しません

XMLloadFloat3 を使用して、lookAt および up をTypeCastできることがわかりました。

XMVector3TransformCoord(XMLoadFloat3(&lookAt), rotationMatrix);
XMVector3TransformCoord(XMLoadFloat3(&up), rotationMatrix);

私はこれを行う必要がありますか、および/またはこれを行うための最良の方法はありますか?

これを行った後、次のことを試みます。

// Translate the rotated camera position to the location of the viewer.
lookAt = position + lookAt;

そしてエラーを取得します:

IntelliSense: これらのオペランドに一致する演算子 "+" はありません。オペランドの種類は次のとおりです: DirectX::XMFLOAT3 + DirectX::XMFLOAT3

D3DXVECTOR3 では + 演算子を使用できましたが、XMFLOAT3 では使用できませんか? これらを一緒に追加するにはどうすればよいですか?

4

2 に答える 2

2

1.私はすべきですか?

私はこれを行う必要がありますか、および/またはこれを行うための最良の方法はありますか?

一般的に言えば、Windows SDK を使用して新しいコードを記述しますが、古いコード (自分のコード、特に他のコード) を変換する必要はありません。時間の無駄です。DirectX SDK をインストールして、ビルドできるようにすることができます。

一方で、DrectX とそのインフラストラクチャについてもう少し学ぶ良い機会です。たとえば、D3DXMath から DirectXMath (以前の XMMath) への移植では、SSE ベースの数学ライブラリの長所と短所を学ぶことができ、独自の数学ライブラリを書き始めるのに適した場所です。

2. どうやって?

この大変な作業を本当に行うことに決めた場合は、Chuck Walbourn の優れた記事 - MSFT: Living without D3DXで 90% の情報を見つけることができます。さらに 9.9% はドキュメントから自分で見つけ出し、DirectXMath ソース コードを見てさらに 0.1% (これはヘッダー ライブラリであり、すべての関数がインライン化されており、自由に学習することはできません)。おそらく、 MSDNのその人物による別の記事にも興味があるでしょう。

3.operator+問題

D3DXVECTORn単一のタイプ (はコンポーネントの数) の代わりにn、新しい math には と の 2 つのタイプが含まれXMFLOATnますXMVECTOR。行列についても同じです: XMMATRIXand XMFLOATaXb(ここでa、 andbは行列の次元です)。

  • XMFLOAT人々は単に値を保存するために使用されます。ただの浮き輪です。それらに対して演算子は定義されておらず、関数もありません。ただし、XMLoad*/それらをXMStore* 受け入れます。
  • XMVECTORXMMATRIXこれらはすべての関数で使用され、オーバーロードされた演算子もあります (使用はお勧めしません。代わりXM*に関数を使用してください)。彼らは超音速のSSE内部を使用しています。しかし..値を保存するために使用するのは難しいです。たとえば、XMVECTORクラス メンバーを作成すると、アラインメントの問題が発生します。
  • したがって、基本的には、値をXMFLOATs に格納して移動しますが、計算の前に関数を使用してそれらをXMVECTORおよびに変換し( で行ったように)、計算後に関数を使用して s に戻します。または、 es とs を適切に調整することで、もう少し利益を得ることができるため、直接保存できます(おそらく、調整されたメモリ アロケーターが必要になります)。XMMATRIXXMLoad*XMVector3TransformCoord()XMFLOATXMStore*classstructXMVECTORXMMATRIX

さて、これで準備は完了です。移植おめでとうございます!=)

于 2013-09-10T06:13:40.673 に答える