1

D3DXIntersect() を使用して既に十字線でメッシュを選択していますが、それを使用して地面との衝突を検出するのに問題があります。ローポリ メッシュの対応する三角形までの距離を取得できるように光線をまっすぐ下に向けたいのですが、テストが呼び出されるたびに BOOL "hit" が false を返します。

画面座標を光線に変換する必要がないので、ワールド空間での光線の位置から始めて、モデル空間に変換してから、D3DXIntersect() を呼び出します。

....
//when I want to check collision with the mesh..
D3DXVECTOR3 origin, direction;

//divide the camera location by the scale of the mesh.
origin = D3DXVECTOR3(gCamera->pos().x / meshScale,
 gCamera->pos().y / meshScale, gCamera->pos().z / meshScale); 
direction = D3DXVECTOR3(0.0f, -10.0f, 0.0f);  //Tried -1.0 originally

//get the inverse of the mesh's world matrix
D3DXMATRIX inverseWorld;
D3DXMatrixInverse(&inverseWorld, 0, &meshWorld);

//transform the Ray using the inverse matrix
D3DXVec3TransformCoord(&origin, &origin, &inverseWorld);
D3DXVec3TransformNormal(&direction, &direction, &inverseWorld);

//Intersection Test
BOOL hit = 0;
DWORD faceIndex = -1;
float u = 0.0f;
float v = 0.0f;
float dist = 0.0f;
ID3DXBUFFER* allHits = 0;
DWORD numHits = 0;
HR(D3DXIntersect(mMesh, &origin, &direction, &hit,
&faceIndex, &u, &v, &dist, &allHits, &numHits));

if( hit )
{

   //execute code to prove this line executed...
   //change camera position
}
else
{
   //show me the test happened and there wasn't a hit
}

もともと原点をメッシュ スケールで割っていたわけではありませんが、スケーリングされたメッシュを補正する方法をグーグルで調べたところ、このように記述された例が見つかりました。それが間違いである場合はお知らせください。ただし、スケールを使用せず、通常のサイズのメッシュでテストを行っても、光線がヒットしません。

私がヒットしないようにする間違いを見た人はいますか? たぶん私は光線を適切に変換していませんか?お時間をいただきありがとうございます。

4

1 に答える 1

0

私はそれを理解しました。簡単な間違いだったことがわかりました。私のメッシュのワールドマトリックスは、ワールドマトリックスではなく、単に変換マトリックスでした。つまり、変換マトリックスとスケーリングマトリックスを掛け合わせたものです。この手法で苦労している他の人は、行列が正しく、上記のコードが機能することを確認してください。

于 2012-06-30T14:13:18.000 に答える