D3DX在错误的Coords中插入Ray?

时间:2012-06-30 13:13:35

标签: c++ matrix directx

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

我原本没有用网格比例划分原点,但是在谷歌搜索如何补偿缩放网格之后,我发现了一个以这种方式编写的例子。如果这是一个错误,请告诉我,但即使没有使用标尺和测试常规尺寸的网格,我仍然没有受到射线的打击。

有没有人看到任何会阻止我被击中的错误?也许我没有正确地转换光线? 在此先感谢您的时间。

1 个答案:

答案 0 :(得分:0)

我只是想通了。原来这是一个容易犯的错误。我的网格的世界矩阵只是平移矩阵而不是世界矩阵,即平移矩阵和缩放矩阵相乘。对于其他任何正在努力使用这种技术的人,只需确保你的矩阵是正确的,上面的代码应该可行。