如何在OpenGL中让相机跟随3D对象移动?

5

我正在使用OpenGL第一次制作汽车赛道,我面临的第一个问题是如何使相机始终与汽车保持固定距离..以下是键盘函数的代码。V是汽车的速度。

void OnSpecial(int key, int x, int y) 
{
    float step = 5;

    switch(key) {

    case GLUT_KEY_LEFTa:
        carAngle = step;
        V.z = carAngle ;
        camera.Strafe(-step/2);
        break;

    case GLUT_KEY_RIGHT:
        carAngle = -step;
        V.z = carAngle ;
        camera.Strafe(step/2);
        break;

    case GLUT_KEY_UP:
        V.x += (-step);
        camera.Walk(step/2);

        break;
    case GLUT_KEY_DOWN:
        if(V.x<0)
        {
            V.x += step;
            camera.Walk(-step/2);
        }
        break;
    }
}

1
你能提供更多细节吗:汽车位置如何定义,你想要什么样的相机行为?通常,你需要获取汽车的位置和可能的“朝向”,然后从中计算出相机的位置。 - n0rd
1
渲染代码会更有帮助地提供有意义的答案。此外,您能描述一下目前正在发生什么吗?摄像机是否固定而汽车加速离开?或者您还没有做到那一步? - Kian
我的代码包含一个显示函数,其中包含转换函数、更新函数和渲染场景函数,该函数绘制m2d汽车和赛道。我在渲染前后使用了下面的代码,但它没有起作用...关于汽车位置,我有一个向量可以在onSpecialkey函数中更改。使用我的代码,汽车加速,因此一开始汽车比相机慢,然后相机变慢,汽车消失了。我需要相机与汽车保持恒定的距离。有什么建议吗? - memo
2个回答

5
可能是这样的吗?
vec3 cameraPosition = carPosition + vec3(20*cos(carAngle), 10,20*sin(carAngle));
vec3 cameraTarget = carPosition;
vec3 cameraUp = vec3(0,1,0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity()
gluLookAt(cameraPosition, cameraTarget, cameraUp);
glTranslate(carPosition);
drawCar();

如果你不再使用旧的、已弃用的OpenGL API(如glBegin和相关内容),那么你需要做类似以下的操作:
mat4 ViewMatrix = LookAt(cameraPosition, cameraTarget, cameraUp); // adapt depending on what math library you use

0
答案很简单。您拥有玩家控制的对象(汽车),因此您可以通过世界空间中的ModelViewMatrix获得其位置和方向(通常指向3D模型的中心)。 要将其转换为正确的跟随ModelViewMatrix,您必须执行以下操作:
  1. 获取或构建汽车ModelMatrix作为double M [16]

  2. 将其平移/旋转到新位置(在驾驶舱内或汽车后面)

    以便Z轴指向您想要看到的方向。通常将跟随距离作为速度函数。

  3. 反转M,使M = Inverse(M)

  4. 使用M作为ModelViewMatrix

  5. 渲染

因此,简而言之:

ModelViewMatrix = rendered_object_matrix * Inverse(following_object_matrix * local_view_offset)

如果您需要此内容的其他信息,请查看我在这里的答案:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接