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