我使用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
}
我原本没有用网格比例划分原点,但是在谷歌搜索如何补偿缩放网格之后,我发现了一个以这种方式编写的例子。如果这是一个错误,请告诉我,但即使没有使用标尺和测试常规尺寸的网格,我仍然没有受到射线的打击。
有没有人看到任何会阻止我被击中的错误?也许我没有正确地转换光线? 在此先感谢您的时间。
答案 0 :(得分:0)
我只是想通了。原来这是一个容易犯的错误。我的网格的世界矩阵只是平移矩阵而不是世界矩阵,即平移矩阵和缩放矩阵相乘。对于其他任何正在努力使用这种技术的人,只需确保你的矩阵是正确的,上面的代码应该可行。