цикл не работает правильно - PullRequest
0 голосов
/ 25 ноября 2010

У меня есть этот цикл, который проверяет два объекта.Проблема в том, что он проверяет только первый, но не проверяет остальные ... Когда мой цикл проверяет первый объект на предмет выбора, он говорит, был ли он выбран или нет, но когда он повторяется, чтобы проверитьвторой объект говорит, что он не был выбран, даже когда он был выбран.Поэтому я переключил процесс проверки.Как сейчас, второй объект проверяется, чем первый объект проверяется.Поэтому после того, как я это сделал, я получил такой результат, он говорит, что второй объект выбран или нет, он работает нормально, но когда он повторяется, он начинает проверять первый объект, он говорит, что он не выбран, даже когда он был выбран ..
вот мой цикл

for(int i=0; 1>=i; i++)
    {
        matWorld=entity[i]->s;
        // Use inverse of matrix
        D3DXVec3Unproject(&rayPos,&rayPos,&vp,&matProj,&matView,matWorld);
        D3DXVec3Unproject(&rayDir,&rayDir,&vp,&matProj,&matView,matWorld);
        rayDir -= rayPos; // make a direction from the 2 positions
        D3DXVec3Normalize(&rayDir,&rayDir);

        if(FAILED(D3DXIntersect(entity[i]->pDrawMesh, &rayPos, &rayDir, &hasHit, NULL, NULL, NULL, &distanceToCollision, NULL, NULL)))
        {
            PostQuitMessage(0);
        };

        if(hasHit!=0)
        {
            entity[i]->draw=false;
        }
    }

есть идеи?

РЕДАКТИРОВАТЬ 2:
хорошо, я не думаю, что вы, ребята, правильно меня поняли.Я не пытаюсь заставить мой цикл проверять больше entity.
Хорошо, я буду, вот что происходит.
1. Когда он в первый раз зацикливается, проверяет, выбран ли entity[0]или нет, этот шаг работает нормально.
2. Когда он повторяется во второй раз, проверяет, выбран ли entity[1] или нет, ЗДЕСЬ ПРОБЛЕМА.
мой цикл работает нормально, когда он зацикливается дляв первый раз, но он не работает, когда он повторяется во второй раз.
Когда я отлаживал, я пытался это сделать.
1. Когда он зацикливается в первый раз, проверяет, если entity[1]Этот шаг работает нормально.
2. Когда он повторяется во второй раз, проверяет, выбран ли entity[2] или нет, ЗДЕСЬ ПРОБЛЕМА.кажется, что после первого цикла что-то не так, но я не вижу, что это.Кстати, я не получаю никаких ошибок. РЕДАКТИРОВАТЬ 3: Вся функция

BOOL D3dDevice::Picking(HWND hWnd, LPDIRECT3DDEVICE9 d3ddev, CXFileEntity *entity[4])
{
    D3DXMATRIX matProj;
    POINT pt;
    D3DVIEWPORT9 vp;
    D3DXMATRIX *matWorld=NULL;
    D3DXMATRIX matView;

    GetCursorPos(&pt);
    ScreenToClient(hWnd, &pt);
    d3ddev->GetTransform(D3DTS_PROJECTION, &matProj);
    d3ddev->GetViewport(&vp);
    d3ddev->GetTransform(D3DTS_VIEW, &matView);

    D3DXVECTOR3 rayPos((float)pt.x, (float)pt.y,0); // near-plane position
    D3DXVECTOR3 rayDir((float)pt.x, (float)pt.y,1); // far-plane position

    BOOL hasHit;
    float distanceToCollision;
    for(int i=0; i<=1; i++)
    {
        matWorld=entity[i]->s;
        // Use inverse of matrix
        D3DXVec3Unproject(&rayPos,&rayPos,&vp,&matProj,&matView,matWorld);
        D3DXVec3Unproject(&rayDir,&rayDir,&vp,&matProj,&matView,matWorld);
        rayDir -= rayPos; // make a direction from the 2 positions
        D3DXVec3Normalize(&rayDir,&rayDir);

        if(FAILED(D3DXIntersect(entity[i]->pDrawMesh, &rayPos, &rayDir, &hasHit, NULL, NULL, NULL, &distanceToCollision, NULL, NULL)))
        {
            PostQuitMessage(0);
        };

        if(hasHit!=0)
        {
            entity[i]->draw=false;
        }
    }

    return hasHit;
}

Ответы [ 3 ]

2 голосов
/ 25 ноября 2010

вы должны исправить свой оператор for на:

int size = ... // detect the size of entity
for(int i=0; i <= size; i++)

теперь вы пишете 1>=i, это означает, что i меньше или равно 1. Таким образом, цикл работает так, как вы его кодировали.

1 голос
/ 26 ноября 2010

Я думаю, что вам нужно сбросить значение структур rayPos и ​​rayDir, потому что вы изменяете начальные значения внутри цикла:

for(int i=0; i<=1; i++)
{
    matWorld=entity[i]->s;
    // Use inverse of matrix
    D3DXVECTOR3 rayPos((float)pt.x, (float)pt.y,0); // near-plane position
    D3DXVECTOR3 rayDir((float)pt.x, (float)pt.y,1); // far-plane position  
    D3DXVec3Unproject(&rayPos,&rayPos,&vp,&matProj,&matView,matWorld);
    D3DXVec3Unproject(&rayDir,&rayDir,&vp,&matProj,&matView,matWorld);
    rayDir -= rayPos; // make a direction from the 2 positions
    D3DXVec3Normalize(&rayDir,&rayDir);

    if(FAILED(D3DXIntersect(entity[i]->pDrawMesh, &rayPos, &rayDir, &hasHit, NULL, NULL, NULL, &distanceToCollision, NULL, NULL)))
    {
        PostQuitMessage(0);
    };

    if(hasHit!=0)
    {
        entity[i]->draw=false;
    }
}
1 голос
/ 25 ноября 2010

Если hasHit - это переменная, которую вы проверяете, выбран ли объект, это не похоже на то, что вы проверяете переменную, специфичную для каждого объекта. Кажется, это просто переменная, которая никогда не обновляется в цикле for и всегда будет содержать одно и то же значение.

...