0

インターネットには、OpenGL でのアークボールの使用に関する情報がいくつかありますが、DirectX についてはあまり情報がありません。Microsoft DirectX SDK のアークボール関数のバージョンを使用しています。マウスの動き (fDeltaX および fDeltaY) の変化によって平行移動行列を変更することで、オブジェクトの位置をシフトします。

D3DXMatrixTranslation( &arcBall.mTranslationDelta, -fDeltaX, fDeltaY, 0.0f );
D3DXMatrixMultiply( &arcBall.mTranslation, &arcBall.mTranslation, &arcBall.mTranslationDelta );

問題は、回転の中心がオブジェクトの中心と同じであるため、回転の中心がオブジェクトとともに移動することです。回転中心を固定するにはどうすればよいですか?

画面上にオブジェクトを描画するには、オブジェクトの中心位置を使用してワールド マトリックスを作成し、回転マトリックスを掛けてから平行移動マトリックスを掛けます。

D3DXMatrixTranslation( (D3DXMATRIX*)&g_World_drawing, -g_vObjectCenterPtr.x, -g_vObjectCenterPtr.y,  -g_vObjectCenterPtr.z );
D3DXMatrixMultiply( (D3DXMATRIX*)&g_World_drawing, (D3DXMATRIX*)&g_World_drawing, ArcBall_GetRotationMatrix() );
D3DXMatrixMultiply( (D3DXMATRIX*)&g_World_drawing, (D3DXMATRIX*)&g_World_drawing, &arcBall.mTranslation );

次に、描画用にそのワールド マトリックスを指定します。

d3dDevice->SetTransform(D3DTS_WORLD, &g_World_drawing);

別の回転中心が必要ですか? その場合、どのように使用しますか? または、オブジェクトの移動を補正する方法はありますか?

この問題を示すために、Visual Studio 2012 で非常に単純なプログラムを作成しました。gametutorials.com の Rotating Cube チュートリアルにアークボールを追加し、フォルダーを圧縮して、問題の説明といくつかの画面イメージと共にここに投稿しました。

マウスの移動量に応じて平行移動行列を設定し、それを回転行列で乗算し、その値の 2 つを回転中心:

D3DXMatrixTranslation( &translationDelta, dPix->x * xfactor, dPix->y * yfactor, 0.0f );
D3DXMatrixMultiply( (D3DXMATRIX*)&translationDelta, (D3DXMATRIX*)&translationDelta, ArcBall_GetRotationMatrix(abPtr) );
g_vObjectCenterPtr->x += translationDelta._41;
g_vObjectCenterPtr->y -= translationDelta._42;

次に、アークボールの平行移動行列を変更して、回転中心の移動を補正する必要があります。

// now compensate for moving the object so that the object remains as motionless
D3DXMatrixTranslation( &translationDelta, translationDelta._41, -translationDelta._42, 0.0f );
D3DXMatrixMultiply( (D3DXMATRIX*)&translationDelta, (D3DXMATRIX*)&translationDelta, ArcBall_GetRotationMatrix(abPtr) );

D3DXMatrixTranslation( &arcBall.mTranslationDelta, translationDelta._41, translationDelta._42, 0);
D3DXMatrixMultiply( &arcBall.mTranslation, &arcBall.mTranslation, &arcBall.mTranslationDelta );

ただし、回転中心が静止したままオブジェクトが移動するように、オブジェクトの移動と対応する回転中心の移動を組み合わせる方法を理解できませんでした。誰もこれを行う方法を知っていますか?

4

1 に答える 1

0

コードを試したり、DirectX で直接作業したりしたことはありませんが、平行移動してから回転すると、常に平行移動したポイントが回転しますが、回転してから平行移動すると回転しません (または、両方の変換を含むマトリックスを使用すると同等です)。

このために独自のコードを記述したい場合は、クォータニオン NLERP を使用して実行できます。単純ですが、正しく理解するのは少し難しいです。

于 2014-12-23T22:43:33.477 に答える