2012-06-30 2 views
1

Я использую D3DXIntersect(), чтобы забрать сетки с перекрестиями уже, но у меня возникли проблемы с его использованием, чтобы обнаружить столкновение с землей. Я хочу снять луч прямо так, чтобы я мог получить расстояние до соответствующего треугольника сетки с низким полигоном, но мой «удар» BOOL возвращает false при каждом вызове теста.D3DXIntersect Ray In Wrong Coords?

Поскольку мне не нужно преобразовывать координаты экрана в луч, я начинаю с положения луча в мировом пространстве, преобразуя его в пространство модели, а затем вызываю 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

Эта функция не очень эффективна в любом случае, так как даже если она использует некоторую форму пространственного разбиения, она должна будет каждый раз перестраивать эту структуру. Вам лучше сворачивать свое решение обнаружения столкновения. – Puppy

ответ

0

Я только что понял. Оказывается, это была легкая ошибка. Мировая матрица моей сетки была просто матрицей преобразования, а не мировой матрицей, т. Е. Матрицей трансляции и матрицей масштабирования, умноженной вместе. Для всех, кто борется с этой техникой, просто убедитесь, что ваши матрицы правильные, и приведенный выше код должен работать.