最近、DirectX11 と 3D 座標の計算に関する苦境に陥りました。マウス座標をこの 3D 座標に変換したいと考えています。ポリゴンモデル(デフォルト立方体など)やメッシュオブジェクトを空きスペースに挿入するとき、MayaやUnityと同じように動作させたいです。この座標を計算するには、どのような手順と計算が必要ですか?
質問する
1251 次
1 に答える
0
これは、レイ トレーシングでスクリーン座標を 3D 空間のレイに戻すために使用する計算と同じです。
これは、従来の DirectX SDK サンプル「Pick10」の D3DXMath コードです。
const D3DXMATRIX* pmatProj = g_Camera.GetProjMatrix();
POINT ptCursor;
GetCursorPos( &ptCursor );
ScreenToClient( DXUTGetHWND(), &ptCursor );
// Compute the vector of the pick ray in screen space
D3DXVECTOR3 v;
v.x = ( ( ( 2.0f * ptCursor.x ) / pd3dsdBackBuffer->Width ) - 1 ) / pmatProj->_11;
v.y = -( ( ( 2.0f * ptCursor.y ) / pd3dsdBackBuffer->Height ) - 1 ) / pmatProj->_22;
v.z = 1.0f;
// Get the inverse view matrix
const D3DXMATRIX matView = *g_Camera.GetViewMatrix();
const D3DXMATRIX matWorld = *g_Camera.GetWorldMatrix();
D3DXMATRIX mWorldView = matWorld * matView;
D3DXMATRIX m;
D3DXMatrixInverse( &m, NULL, &mWorldView );
// Transform the screen space pick ray into 3D space
vPickRayDir.x = v.x * m._11 + v.y * m._21 + v.z * m._31;
vPickRayDir.y = v.x * m._12 + v.y * m._22 + v.z * m._32;
vPickRayDir.z = v.x * m._13 + v.y * m._23 + v.z * m._33;
vPickRayOrig.x = m._41;
vPickRayOrig.y = m._42;
vPickRayOrig.z = m._43;
これを DirectXMath に変換し、MSDN コード ギャラリーに再投稿するつもりでしたが、まだスタックのトップにはなっていません。上記のコードは、左手座標を想定しています。
2D スクリーンの位置と変換行列は、3 つの自由度のうち 2 つしか提供しないことに注意してください。そのため、深さについて何らかの仮定を立てる必要があります。
「3Dでピッキング」という用語も検索してください。
于 2015-01-28T06:58:15.693 に答える