我已经使用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
}


我最初并没有将原点除以网格比例,但是在搜索了如何补偿缩放后的网格后,我发现了一个以此方式编写的示例。如果这是一个错误,请让我知道,但是即使不使用比例尺并在常规尺寸的网格上进行测试,我仍然不会受到射线的打击。

是否有人看到任何会使我无法获得成功的错误?也许我没有正确转换射线?
在此先感谢您的时间。

最佳答案

我只是想通了。原来这是一个容易犯的错误。我的网格物体的世界矩阵只是简单的平移矩阵,而不是世界矩阵,即平移矩阵和缩放矩阵相乘。对于其他尝试使用此技术的人,只需确保您的矩阵正确无误,并且上面的代码应该可以工作。

关于c++ - D3DX在错误的坐标中相交射线?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11274336/

10-11 15:41