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

Posted

技术标签:

【中文标题】使用 gluLookAt() 横向移动; C++【英文标题】:Moving sideways using gluLookAt(); C++ 【发布时间】:2013-08-10 21:30:49 【问题描述】:

我正在尝试在 openGl C++ 中使用“gluLookAt()”来完成一项简单的任务:“基于相机的运动”。我想要的是允许凸轮通过以下方案中的键移动:

方向键:

← = 左转

→ = 右转

↑ = 向上看

↓ = 向下看

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' :
            ??????????????????

【问题讨论】:

【参考方案1】:

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

gluLookAt (cameraX, cameraY, cameraZ, lookAtX, lookAtY, lookAtZ, upX, upY, upZ);

在不改变角度的情况下左右移动相机称为“拖车”,有时第一人称射击游戏将其称为向左或向右扫射的角色。为此,您需要将相机和观察点移动相同的量,如下所示:

gluLookAt (cameraX + deltaX, cameraY + deltaY, cameraZ + deltaZ, lookAtX + deltaX, lookAtY + deltaY, lookAtZ + deltaZ, upX, upY, upZ);

对于 left 和 right,deltaX 可能是 + 或 - 一些量,而 deltaY 和 deltaZ 可能是 0。

【讨论】:

我们为什么要这样做 -'lookAtX + deltaX,lookAtY + deltaY,lookAtZ + deltaZ' 哦,我想一旦相机侧向移动,观察点也需要平移,否则相机将继续观察最初的观察点 是的,完全正确!这使一切保持一致。【参考方案2】:

您需要相机位置 (pos)、向上矢量 (up) 和相机观察方向 (dir)。一旦你有了这些向量,剩下的就很简单了。首先你需要计算右向量,所以你可以向右或向左扫射,这是通过以下方式实现的:

strafe = Cross(up,dir); //Being cross the cross product of two vectors

一旦你有扫射,你只需要将它添加到位置:

pos += strafe * strafeSpeed; //Strafe to one side.
pos -= strafe * strafeSpeed; //Strafe to the other.

user11... 的帖子不会起作用,除非您始终以相同的向上向量朝同一个方向看。

【讨论】:

以上是关于使用 gluLookAt() 横向移动; C++的主要内容,如果未能解决你的问题,请参考以下文章

带有 gluLookAt 的 FPS 武器

gluLookAt() 的问题 - 旋转

OpenGL gluLookat 不适用于着色器

注意事项APP左右横滑设计

在 OpenGL 上绘制点的意外 gluLookAt 行为

当我更改 gluLookAt 时,我只能看到一个点