DirectX3D 11を使用してアプリケーションを作成し、カメラのターゲットベクトルは変数xdelta、ydelta、およびzdeltaによって決定されます。
RMBとLMBを押したままマウスを画面上で動かすときに、ビューをXYでパンする必要があります。
マウスの動きのデルタをVIEWスペースに追加して、ワールドXとYではなく、ビューに対してXとYでパンするようにする必要があると考えました。
ただし、これは初めてのことで、VIEW座標をWORLD座標に戻す方法がわかりません。
すべてのフォーマットルールを正確に覚えるのに十分なほどここに投稿していないので、すべてのフォーマットルールに従っていることを願っています。
どんな助けでもいただければ幸いです。以下は私のコードスニペットです。おそらくもっと良い方法もあります。
if ( m_Input->RMBPressed() == true && m_Input->LMBPressed() == true ) // Pan View
{
if ( curX != mouseX || curY != mouseY ) {
//Get Target Coordinates in View Space
D3DXVECTOR3 targetView = (D3DXVECTOR3 ( mView(2,0), mView(2,1), mView(2,2) );
//Add mouse XY delta vector to target View Coordinates
D3DXVECTOR3 delta ( (float)curX-(float)mouseX,
(float)curY-(float)mouseY, zdelta );
targetView += delta;
//Convert back to World Coordinates
}
}
私は別のアプローチを試していますが、それは正しいアプローチであると信じていますが、それでも正しく機能していないようです。マウスを動かすと、画面からXとYのデルタが取得され、変数「xdelta」と「ydelta」に格納されます。
次に、変換行列を作成します
D3DXMATRIX mTrans;
次に、マトリックスに値を入力します
// Rotation
mTrans(0,0) = delta.x;
mTrans(1,1) = delta.y;
// Translation
mTrans(0,3) = delta.x;
mTrans(1,3) = delta.y;
対応するビュー座標を取得するには、mViewと呼ばれるビューマトリックスを掛ける必要があると思います。
mTrans= mTrans*mView;
次に、これらの変換された値を現在のターゲットXおよびYに追加します。これは、変数「target_x」および「target_y」によって決定されます。これにより、ビュー座標XおよびYに対して(つまり、現在のビューに直交する)ターゲットベクトルが移動します。
target_x += mTrans(0,3);
target_y += mTrans(1,3);
しかし、そうではありません。ビューのX軸とY軸ではなく、ワールドのX軸とY軸に沿ってターゲットを移動します。
その他のスニペット
私はD3DXMatrixLookAtLH関数を使用していますが、マウスの動きに基づいてターゲット位置の変化を計算し、新しいターゲットをその関数にフィードさせようとしています。いくつかのコードスニペットを追加しました:
if ( m_Input->RMBPressed() == true && m_Input->LMBPressed() == true ) // Pan View
{
if ( curX != mouseX || curY != mouseY ) {
//Get mouse XY delta vector
D3DXVECTOR3 delta ( (float)curX-(float)mouseX, (float)curY-(float)mouseY, zdelta );
//Create Transformation Matrix
D3DXMATRIX mTemp;
// Rotation
mTemp (0,0) = delta.x;
mTemp (1,1) = delta.y;
mTemp (2,2) = delta.z;
// Translation
mTemp (0,3) = delta.x;
mTemp (1,3) = delta.y;
mTemp (2,3) = delta.z;
//Convert to View Coordinates
mTemp = mTemp*mView;
xdelta += mTemp(0,3);
ydelta += mTemp(1,3);
// Convert Spherical to Cartesian coordinates: mPhi measured from +y
// and mTheta measured counterclockwise from z.
float height = mRadius * cosf(mPhi);
float sideRadius = mRadius * sinf(mPhi);
float x = xdelta + sideRadius * cosf(mTheta);
float z = zdelta + sideRadius * sinf(mTheta);
float y = ydelta + height;
// Build the view matrix.
D3DXVECTOR3 pos(x, y, z);
D3DXVECTOR3 target(xdelta, ydelta, zdelta);
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f); // Y Axis is up. Looking down Z.
D3DXMatrixLookAtLH(&mView, &pos, &target, &up);
まず第一に、あなたのすべての情報に感謝します。DirectXマトリックスをゆっくりと理解するのに役立ちます。以下のロジックで正しいですか?画面上でマウスの変更がXで5.0、Yで5.0であると仮定します。それが私のデルタです。Zは常に0.0になります。ビュー座標は次のようになります。
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f); // Y Axis is up. Looking down Z.
D3DXVECTOR3 delta ( 5.0f, 5.0f, 0.0f );
D3DXVECTOR3 origin ( 0.0f. 0.0f, 0.0f );
D3DMATRIX mTemp;
D3DXMatrixIdentity (&mTemp);
D3DXMatrixLookAtLH (&mTemp, &delta, &origin, &up );
これで、XYデルタのビュー座標をmTempビューマトリックスに保存する必要がありますか?
もしそうなら、XYデルタビュー座標をmView XY座標に追加し、次にワールド座標に変換して、実際のXYワールド値を取得することにより、続行するための最良の方法は、ターゲットを設定する必要がありますか?
私はこれをどのように達成するかについて途方に暮れています。それは私には本当にそれほど明確ではありません、そして私が主題に関して購入したすべての本もまた明確ではありません。