спросите о функции D3DXIntersect :(

        // get the current transform matrices
D3DXMATRIX matProjection, matView, matWorld, matInverse;
ENGINE.GetDevice()->GetDevice()->GetTransform(D3DTS_PROJECTION, &matProjection);
ENGINE.GetDevice()->GetDevice()->GetTransform(D3DTS_VIEW, &matView);
ENGINE.GetDevice()->GetDevice()->GetTransform(D3DTS_WORLD, &matWorld);

// use the mouse coordinates to get the mouse angle
float xAngle = (((2.0f * ENGINE.GetInputManager()->GetMousePos()->x) / WINDOW_WIDTH) - 1.0f) / matProjection(0, 0);
float yAngle = (((-2.0f * ENGINE.GetInputManager()->GetMousePos()->y) / WINDOW_HEIGHT) + 1.0f) / matProjection(1, 1);

D3DXVECTOR3 origin, direction;
origin = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
direction = D3DXVECTOR3(xAngle, yAngle, 1.0f);

// find the inverse matrix
D3DXMatrixInverse(&matInverse, NULL, &(matWorld * matView));

// convert origin and direction into model space
D3DXVec3TransformCoord(&origin, &origin, &matInverse);
D3DXVec3TransformNormal(&direction, &direction, &matInverse);
D3DXVec3Normalize(&direction, &direction);

// detect picking
BOOL hit;
std :: list<CEntity*> :: iterator iter = MAINMANAGER.GetLegoObjectManager()->GetObjList().begin();
CResource* g_pResource = NULL;

while(iter != MAINMANAGER.GetLegoObjectManager()->GetObjList().end())
{
g_pResource = static_cast<CEntity*>(*iter)->GetResource();

D3DXIntersect( static_cast<PassiveMesh*>(g_pResource)->GetMesh(), &origin, &direction, &hit, NULL, NULL, NULL, NULL, NULL, NULL);

if(hit)
{
ENGINE.GetDevice()->GetDevice()->SetRenderState(D3DRS_LIGHTING, FALSE);
break;
}
else
{
ENGINE.GetDevice()->GetDevice()->SetRenderState(D3DRS_LIGHTING, TRUE);
}

++iter;
}

Это мой образец исходного кода.
У меня проблема.

если я создам три трехмерных объекта. так что комплектация работает третий объект. не работает первый, второй объект.

если я создаю только один объект. комплектация работает хорошо!

если я создам два объекта. Комплектация работает вторым объектом, а не первым.

Только создайте последний объект, выбирая хорошо.

Я не понимаю, почему эта проблема возникает.

Пожалуйста, дайте мне совет.

0

Решение

Я предполагаю, что ваш список не упорядочен по расстоянию до камеры, что является нормальным, но из-за этого вы просто проверяете сетку и, если есть попадание, вы ломаетесь. Вместо этого, поскольку вы не знаете порядок списка, вы должны проверить все сетки в списке, а затем выбрать самую короткую. То, как вы делаете вещи, теперь делает выбор в зависимости от списка, а не от того, где находится камера.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]