Я использую 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
}
Я не был первоначально деление происхождения по шкале сетки, но после того, как прибегая к помощи, чтобы компенсировать масштабированную сетку, я нашел пример, написанный на этом пути. Если это ошибка, сообщите мне, но даже без использования шкалы и тестирования на сетке с обычным размером я все равно не получаю удар с лучом.
Кто-нибудь видит ошибки, которые мешают мне получать хиты? Может быть, я не перерабатываю луч правильно? Заранее благодарим за ваше время.
Эта функция не очень эффективна в любом случае, так как даже если она использует некоторую форму пространственного разбиения, она должна будет каждый раз перестраивать эту структуру. Вам лучше сворачивать свое решение обнаружения столкновения. – Puppy