【问题标题】:How can I make my mouse control the camera like a FPS using OpenGL/SDL?如何使用 OpenGL/SDL 让鼠标像 FPS 一样控制相机?
【发布时间】:2009-04-24 01:58:45
【问题描述】:

我使用 OpenGL/SDL 创建了这个基本的 3D 演示。我处理了键盘回调,因此我可以使用 'a' 和 's' 左右“扫射”,并使用 's' 和 'w' 前后移动。

但是,我现在想实现它,这样我就可以根据我的鼠标移动来控制我的相机“看”的方向。就像在 FPS 射击游戏中一样,当您在它周围移动鼠标时,相机会向各个方向看。

有谁知道当我移动鼠标时如何利用鼠标回调正确“指向”相机类?

#include "SDL.h"
#include "Camera.h"

Camera cam;
Scene scn;

//<<<<<<<<<<<<<<<<<myKeyboard>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void myKeyboard(unsigned char key, int x, int y)
{
  switch(key)
    {
    case 's': cam.slide(0.0, 0.0, 0.2); break;
    case 'w': cam.slide(0.0, 0.0, -0.2); break;
    case 'a': cam.yaw(-1.0); break;
    case 'd': cam.yaw(1.0); break;


    case 27: exit(0);
    }
  glClear(GL_COLOR_BUFFER_BIT);
  glutPostRedisplay();
}

void displaySDL( void )
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    scn.drawSceneOpenGL();
    glFlush();
    glutSwapBuffers();
}

int main( int argc, char* argv[] )
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(640, 480);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("SDL Sence With Camera");
    glutKeyboardFunc(myKeyboard);
    glutDisplayFunc(displaySDL);
    glShadeModel(GL_SMOOTH);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_NORMALIZE);
    glViewport(0, 0, 640, 480);
    scn.read("fig5_63.dat");
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    scn.makeLightsOpenGL();

    cam.set(2.3, 1.3, 2.0, 0, 0.25, 0, 0, 1, 0);
    cam.setShape(30.0f, 64.0f/48.0f, 0.5f, 50.0f);

    glutMainLoop();
    return 0;
}

这是一个包含我的 SDL 文件、我在上面粘贴的文件和我的 Camera 类的 tar。 http://www.filedropper.com/fpsdemotar

如果有人能给我一些提示,告诉我在处理鼠标回调时应该使用什么算法,我会很感激。

谢谢!

【问题讨论】:

    标签: c++ opengl camera sdl


    【解决方案1】:

    鼠标向上/向下移动 -> 俯仰,鼠标向右/向左移动 -> 偏航。

    我不相信让你的 'a' 和 'd' 键偏航是准确的。

    实际上,您的整个设置对我来说有点奇怪,因为从几何的角度来看,我将坐标视为 (x, y, z)。您将 s 和 w 设置为“向上”和“向下”(z),而不是“向前”和“向后”(y)。我把它看作是一个平放在桌子上的 xy 图形,你从上面看它。靠近它会减小从平面出来的 z。

    这是我的设置方式:

    w -> slide(0, 0.2, 0); // y
    s -> slide(0, -0.2, 0);
    a -> slide(-0.2, 0, 0); // x
    d -> slide(0.2, 0, 0);
    
    //The following goes in your mouse event handler or something:
    pitch(newMouseLocation.y - oldMouseLocation.y); // mouse y is related to pitch
    yaw(newMouseLocaiton.x - oldMouseLocation.x); // mouse x is related to yaw
    

    我知道您不需要遵循这个坐标约定,但它对我来说似乎更直观。

    我希望这会有所帮助。

    【讨论】:

    • 感谢您输入 CookieOfFortune。我偶然发现的一些指南建议将鼠标置于屏幕中心。你认为我应该这样做吗?
    • 我正在考虑的一件事是,每个鼠标回调处理音高,像你建议的那样偏航,然后迫使鼠标移回中心,这样你就永远不会到达壁架。你怎么看?
    • 嗯... mousemove 如果碰到边缘,是否会停止注册更改?如果是这种情况(我相信确实如此),那么是的,您应该将鼠标居中(但前提是您有焦点!!,不希望有人使用 alt-tab 键然后无法移动他们的鼠标! )。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2014-06-26
    相关资源
    最近更新 更多