2013-07-16 2 views
0
 // 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; 
    } 

Это мой сбор исходного образца код. У меня есть проблема.спросить о функции D3DXIntersect :(

если создать три 3D-объектов. Так что выбор-ест объект. Не работает первым, второй объект.

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

если я создаю два объекта. Сбор работает второй объект не первый.

только с последние последние работы собираются хорошо.

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

, пожалуйста, дайте мне несколько советов.

+0

Я не понимаю. Как вы знаете, работает ли пересечение, если вы только меняете освещение, если есть удар, а затем перерыв? Кроме того, что вы подразумеваете под seco? Поскольку список, очевидно, не зависит от того, откуда вы трассируете луч. –

ответ

1

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