我正在尝试使用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' :
??????????????????
答案 0 :(得分:3)
目前还不清楚上面所有的事情发生在哪里,因为你没有发布所有代码,而且它在奇怪的地方被切断了。但如果你想左右移动相机,那应该相当容易。 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);
对于左右,deltaX将为+或 - 某个量,deltaY和deltaZ可能为0。
答案 1 :(得分:0)
对于你想要做的事,你需要摄像机位置(pos),向上矢量(向上)和摄像机外观方向(dir)。一旦你有了这些载体,剩下的就非常简单了。首先,你需要计算正确的向量,这样你就可以向右或向左移动,这可以通过以下方式实现:
strafe = Cross(up,dir); //Being cross the cross product of two vectors
一旦你有了strafe,你只需要将它添加到位置:
pos += strafe * strafeSpeed; //Strafe to one side.
pos -= strafe * strafeSpeed; //Strafe to the other.
user11 ...'帖子不起作用,除非你总是用相同的向上向量看同一个方向。