0

押されたキーに基づいてカメラの位置を更新することに問題があります。簡単に言えば、矢印キーを使用してカメラを左、右、前方、後方に動かそうとしています。プログラムが実行されると、カメラは正しい位置で起動します。さらに、キーが押されると、プログラムはキーが押されたことを登録しますが、カメラはそれに応じて更新されません。

どちらかといえば、アクションがループのelseステートメント内で実行されていないため、問題が発生しています(回転キューブが存在する場所)。私の最大の障害は、カメラの位置を更新できるように、押されたキーの値をループに入れることです。次にどこを見るべきかについてのアイデアや提案はありますか?

コードは次のとおりです。

Render.cpp

Render *renderDraw = new Render(renderWinWidth, renderWinHeight);
Camera *camera = new Camera();

void Render::renderScreen(Camera *cam)
    {
        ...
        gluLookAt(cam->getCameraX(), cam->getCameraY(), cam->getCameraZ(),
        objPos[0], objPos[1], objPos[2], VECTOR_UP[0], VECTOR_UP[1], VECTOR_UP[2]);
        ...
        glFlush();
    }

カメラ.cpp

void Camera::setkeyPressed(WPARAM wParam, HWND hWnd, bool isPressed)
{
    keyPressed[wParam] = isPressed;

    switch(wParam)
        {
    case VK_UP:
        //MessageBox(hWnd, L"key up", L"Key pressed", MB_OK | MB_ICONASTERISK);
        newPos_ = getCameraX();
        newPos_ -= 2.0f;
        setCameraX(newPos_);
        break;
    case VK_DOWN:
        //MessageBox(hWnd, L"key down", L"Key pressed", MB_OK | MB_ICONASTERISK);
        newPos_ = getCameraX();
        newPos_ += 2.0f;
        setCameraX(newPos_);
        break;
    case VK_LEFT:
        //MessageBox(hWnd, L"key left", L"Key pressed", MB_OK | MB_ICONASTERISK);
        newPos_ = getCameraZ();
        newPos_ += 2.0f;
        setCameraZ(newPos_);
        break;
    case VK_RIGHT:
        //MessageBox(hWnd, L"key right", L"Key pressed", MB_OK | MB_ICONASTERISK);
        newPos_ = getCameraZ();
        newPos_ -= 2.0f;
        setCameraZ(newPos_);
        break;
        }
}

main.cpp

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
        ...
        // Main Loop
        while (isRunning)
            {
               if (PeekMessage (&msg, hWnd, 0, 0, PM_REMOVE))
                {
                    if (msg.message == WM_QUIT)
                            isRunning = false;

                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }
               else
                  {
                     renderDraw->renderScreen(camera); <-Contains gyrating cube
                     SwapBuffers(*hDC);
                  }
            }

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        ....
        switch (message)
        {
        case WM_KEYDOWN:
            switch (wParam)
                {
                    camera->setkeyPressed(wParam, hWndChild, true);
                                    break;
                }
            break;
                     ....
        }
    }
4

2 に答える 2

0

カメラ位置の変更は、シーンをレンダリングするまで適用されないため、Camera::setKeyPressed でカメラを更新した後、再描画を強制する必要があります。::setkeyPressed の最後に InvalidateRect() を呼び出すことで、これを実行できるはずです。

于 2013-06-16T20:37:17.763 に答える
0

while ループで重要なイベントを処理していますか? また、while ループは、アプリケーションがキーの押下をリッスンすることを許可せずに、すべてのプロセッサ時間を取得していませんか?

これを試して、キーを聞いていないときにシーンをレンダリングしてください

while( uMsg.message != WM_QUIT )
{
    if( PeekMessage( &uMsg, NULL, 0, 0, PM_REMOVE ) )
    { 
        TranslateMessage( &uMsg );
        DispatchMessage( &uMsg );
    }
    else
        render();
}

directX の例だけを見て、メッセージ ループで重要なイベントを処理する方法を確認してください。ロジックは、openGL と同じである必要があります。

于 2013-06-14T10:09:44.573 に答える