使用gluLookAt()横向移动; C++

Kar*_*rog 5 opengl lookup 3d camera glut

我正在尝试使用openGl C++中的"gluLookAt()"执行一项简单的任务:"基于摄像机的运动".我想要的是允许cam在以下方案中通过键移动:

方向键:

←=向左转

→=向右转

↑=向上看

↓=向下看

W,S,A,D

W =前进

S =向后移动

A =左移(侧身)

D =向右移动(侧身)

Q,E

Q =左旋

E =右旋

到目前为止,我设法完成了我需要的所有类型的机芯,除了侧面使用键"A"和"D".无论我尝试多少都没关系,当我按下其中一个按键时,凸轮永远不会按照我希望它移动的方式移动.有人告诉我,我需要执行某种类型的"交叉产品",但是,尽管有一些试验,我真的迷路了.

//variables

float x1 = 0.0f, x2 = 0.0f, x3 = 0.0f, y1 = 1.0f, y2 = 1.0f, y3 = 1.0f, z1 = 5.0f, z2 = -1.0f, z3 = 0.0f;

//the camera

gluLookAt( x1, y1, z1, x1+x2, y2, z1+z2, x3, y3, z3);

//methods 

void special(int key, int xx, int yy)
{

    switch (key) {
        case GLUT_KEY_LEFT :
            camAngle -= 0.09f;
            x2 = sin(camAngle);
            z2 = -cos(camAngle);
            break;
        case GLUT_KEY_RIGHT :
            camAngle += 0.09f;
            x2 = sin(camAngle);
            z2 = -cos(camAngle);
            break;
///////////////////////////////////////////////////////

void normal(unsigned char key, int x, int y)
{

    float part = 0.9f;

    switch (key) {
        case 'w' :
            x1 += x2 * part ;
            z1 += z2 * part ;
            break;
        case 's' :
            x1 -= x2 * part ;
            z1 -= z2 * part ;
            break;
        case 'a' :
                        ??????????????????
            break;
        case 'd' :
            ??????????????????
Run Code Online (Sandbox Code Playgroud)

use*_*321 3

目前尚不清楚您上面的所有事情发生在哪里,因为您没有发布所有代码并且它在奇怪的地方被切断。但如果你想左右移动相机,那应该相当容易。的定义gluLookAt()是:

gluLookAt (cameraX, cameraY, cameraZ, lookAtX, lookAtY, lookAtZ, upX, upY, upZ);
Run Code Online (Sandbox Code Playgroud)

左右移动相机而不改变其角度称为“卡车移动”,有时第一人称射击者将其称为角色向左或向右扫射。为此,您需要将相机和观察点移动相同的距离,如下所示:

gluLookAt (cameraX + deltaX, cameraY + deltaY, cameraZ + deltaZ, lookAtX + deltaX, lookAtY + deltaY, lookAtZ + deltaZ, upX, upY, upZ);
Run Code Online (Sandbox Code Playgroud)

对于左和右,deltaX 可能是 + 或 - 某个值,而 deltaY 和 deltaZ 可能是 0。