1

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

カメラを向けるという観点から、マウスのコールバックを処理するときにどのアルゴリズムを使用する必要があるかについて、誰かがヒントをくれれば幸いです。

ありがとう!

4

1 に答える 1

5

マウスが上下に移動->ピッチ、マウスが右/左に移動->ヨー。

「a」キーと「d」キーをヨーイングするのは正確ではないと思います。

実際、幾何学的な観点から、私は座標を(x、y、z)と見なしているので、セットアップ全体は私には少し奇妙です。sとwを、「進む」と「戻る」(y)ではなく、「上」と「下」(z)に設定します。私はそれをテーブルの上に平らに置かれた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

この座標規則に従う必要はないことは理解していますが、私にとってはより直感的に思えます。

これがお役に立てば幸いです。

于 2009-04-24T02:11:58.420 に答える