3D / FPS 相机问题 - SDL2

Posted

技术标签:

【中文标题】3D / FPS 相机问题 - SDL2【英文标题】:3D / FPS Camera Issues - SDL2 【发布时间】:2014-04-06 17:33:01 【问题描述】:

我的代码有问题,我正在尝试制作第一人称 3D 相机。 我使用 SDL_GetKeyboardState(NULL) 来获取按下的键。

当我按下定义的键之一时,没有任何反应,为什么?

相机(控制):

void Control(float movevel, float mousevel, bool mi, SDL_Window* window)

if (mi)  //if the mouse is in the screen

    int MidX = 640 / 2;   //middle of the screen
    int MidY = 480 / 2;
    SDL_ShowCursor(SDL_DISABLE);    //we don't show the cursor
    int tmpx, tmpy;
    SDL_GetMouseState(&tmpx, &tmpy); //get the current position of the cursor
    camYaw += mousevel*(MidX - tmpx);   //get the rotation, for example, if the mouse current position is 315, than 5*0.2, this is for Y
    camPitch += mousevel*(MidY - tmpy); //this is for X
    lockCamera();
    //SDL_WarpMouse(MidX, MidY);       //move back the cursor to the center of the screen
    SDL_WarpMouseInWindow(window, MidX, MidY);

    const Uint8* kstate = SDL_GetKeyboardState(NULL);

    if (kstate[SDLK_w])
    
        if (camPitch != 90 && camPitch != -90)
               //if we are facing directly up or down, we don't go forward, it will be commented out, when there will be gravity
            moveCamera(movevel, 0.0);        //move forward
        

        moveCameraUp(movevel, 0.0);      //move up/down
    

    if (kstate[SDLK_s])
    
        //same, just we use 180 degrees, so we move at the different direction (move back)
        if (camPitch != 90 && camPitch != -90)
        
            moveCamera(movevel, 180.0);
        

        moveCameraUp(movevel, 180.0);
    

    if (kstate[SDLK_a])
           //move left
        moveCamera(movevel, 90.0);
    

    if (kstate[SDLK_d])
      //move right
        moveCamera(movevel, 270);
    


glRotatef(-camPitch, 1.0, 0.0, 0.0);
glRotatef(-camYaw, 0.0, 1.0, 0.0);

主(循环)

while (running)

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    SDL_Event ev;
    while (SDL_PollEvent(&ev))
    
        switch (ev.type)
        
            case SDL_QUIT:
                running = false;
                break;
            case SDL_KEYDOWN:
                int x, y;

                SDL_GetMouseState(&x, &y);
                Main::handleKeys(ev.key.keysym.scancode, x, y);
                break;
        
    

    Main::update(window);
    Main::render(window);

    SDL_GL_SwapWindow(window);

主要(更新):

void Main::update(SDL_Window* window)

Control(0.2, 0.2, mousein, window);
UpdateCamera(0.2); //move the camera to the new location

【问题讨论】:

在大多数情况下,在您的键盘处理程序中调用 glRotatef 是一个非常糟糕的主意。这些矩阵可能会在您的渲染函数中被覆盖。 我改了,还是没有成功:/ 你用的是什么类型的矩阵? 你到底是什么意思? 【参考方案1】:

您应该在平移相机之前调用 glRotatef 函数,否则它将围绕原点而不是其位置旋转

【讨论】:

好吧,由于某种原因,这不是问题所在,当我将相机链接到事件键盘处理程序时,它工作正常(唯一的问题是我不能同时按住多个键。)但是当我让它使用'SDL_GetKeyboardState'时,它什么也不做。生病改变了顺便说一句,谢谢:D【参考方案2】:

使用 SDL_PumpEvents() 更新状态数组。 (来自 SDL_GetKeyboardState() wiki)。 我相信如果你这样做:

SDL_PumpEvents();
SDL_GetKeyboardState(NULL);

你应该得到你正在寻找的结果。 (显然,每个循环都需要 SDL_PumpEvents 以及 SDL_GetKeyboardState)

(编辑) 另一种选择:

    case SDL_KEYDOWN:
        switch(event.key.keysym.sym)
            case SDLK_w
                (... code)
                break;
            case SDLK_s:
                (... code)
                break;
            case SDLK_a:
                (... code)
                break;
            case SDLK_d:
                (... code)
                break;

您也可以将 event.key.keysym.sym 发送到函数并在他们的课程中使用它。

【讨论】:

谢谢,但是,由于某种原因,它没有做任何事情,它没有改变:/ Idk 为什么,但是可能有其他方法来获取键盘输入吗? (没有过剩) 这应该可以!你能告诉我handleKeys() 代码吗?如果有帮助,我给你留了另一种方法。 更新密钥现在是空的,但我尝试了你给我的方式,它有效..但是。这样你就不能同时按下多个键。 :// 您可以同时按下多个键,因为您应该在循环中使用“while (SDL_PollEvent(&ev))”。如果您将上面的代码放在 if 中,在我向您展示的代码的 case 中,它应该可以工作。 :) 一个赞将不胜感激 :) 我需要能够发表评论 :P 需要为此获得 50 个代表。很高兴我帮忙!

以上是关于3D / FPS 相机问题 - SDL2的主要内容,如果未能解决你的问题,请参考以下文章

FPS 角色全身或手 Unity 3d

(UNITY3d android 游戏)当我不触摸屏幕时,我的 fps 比我触摸时低

SDL2和3D渲染

FPS风格的相机

FPS 相机上不需要的滚动

具有基本矩阵变换 (WebGL) 的类似 FPS 的相机移动