gpt4 book ai didi

使用 gluLookAt() 的 OpenGL FPS 相机

转载 作者:行者123 更新时间:2023-12-02 00:14:37 25 4
gpt4 key购买 nike

所以,我正在尝试创建一个 FPS 风格的相机来探索我的场景,它似乎工作正常。目前无法改变相机的俯仰角。我正在尝试创建一个允许我将相机设置为某些预定义视点的功能,但是当尝试在使用 setPosition() 函数将其设置为新视点后旋转相机时,我遇到的不是在位置而是在方向上的跳跃当第一次按下旋转按钮时。

这是我的相机类实现。

Camera::Camera(void)
{
angleX = 0.0;
angleY = 0.0;
directionX = 0.0;
directionZ = -5.0;
directionY = 0.0;
xPos = 0.0;
zPos = 1.0;
yPos = 2.0;
}

void Camera::setPosition(float xDir, float yDir, float zDir, float posX, float posZ, float posY)
{
directionX = xDir;
directionZ = zDir;
directionY = yDir;
xPos = posX;
zPos = posZ;
yPos = posY;
}

Camera::~Camera(void)
{
}

以下是我的特殊键回调函数,省略了相机移动以外的功能。

void specialKeys(int key, int xx, int yy)
{
float fraction = 0.3f;

switch(key)
{
// Camera Controls
case GLUT_KEY_LEFT:
camera.angleY -= 0.05f;
camera.directionX = sin(camera.angleY);
camera.directionZ = -cos(camera.angleY);
break;
case GLUT_KEY_RIGHT:
camera.angleY += 0.05f;
camera.directionX = sin(camera.angleY);
camera.directionZ = -cos(camera.angleY);
break;
case GLUT_KEY_UP:
camera.xPos += camera.directionX * fraction;
camera.zPos += camera.directionZ * fraction;
camera.yPos += camera.directionY * fraction;
break;
case GLUT_KEY_DOWN:
camera.xPos -= camera.directionX * fraction;
camera.zPos -= camera.directionZ * fraction;
camera.yPos -= camera.directionY * fraction;
break;
}
}

显示回调函数然后使用 gluLookAt 具有以下代码:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(camera.xPos, camera.yPos, camera.zPos, camera.xPos+camera.directionX, camera.yPos+camera.directionY, camera.zPos+camera.directionZ, 0, 1, 0);

我不明白为什么我会遇到这个问题。我相信这与设置相机和用于旋转它的数学之间的相互作用有关。谁能看到如何防止这种方向跳跃?

我是在键盘回调函数中设置相机位置,代码如下:

    if(key == '1') // Default View
camera = Camera();
if(key == '2') // Ferris Wheel View
camera.setPosition(-0.8, 0.0, -0.6, 3.6, 3.6, 6.5);
if(key == '3') // Fountain Water View
camera.setPosition(0.9, 0.0, -0.4, -0.59, -6.4, 0.6);

最佳答案

跳跃是因为你如何初始化你的 directionZ 变量,看:

   angleX = 0.0;
angleY = 0.0;
directionX = 0.0;
directionZ = -5.0;
directionY = 0.0;

但稍后您将 directionX 和 directionZ 定义为:

camera.directionX = sin(camera.angleY);
camera.directionZ = -cos(camera.angleY);

cos 以区间 [-1, 1] 为界,并且由于 angleY 为 0.0f,因此 directionZ 将设置为 -1。如果您更改初始化代码以设置 directionZ = -1.0;,您应该摆脱跳跃。

不要明确设定方向。以下是设置角度和从该角度计算方向的示例:

void Camera::setPosition(float angle, float posX, float posZ, float posY)
{
xPos = posX;
zPos = posZ;
yPos = posY;

//compute instead of set based on angle
angleY = angle;
camera.directionX = sin(angleY);
camera.directionZ = -cos(angleY);
}

关于使用 gluLookAt() 的 OpenGL FPS 相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13862246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com