如何在opengl中使相机跟随三维物体

how to make camera follow a 3d object in opengl?

本文关键字:跟随 三维 相机 opengl      更新时间:2023-10-16

我第一次使用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;
    }
}

也许是这样的?

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&stuff),你将不得不做一些类似的事情

mat4 ViewMatrix = LookAt(cameraPosition, cameraTarget, cameraUp); // adapt depending on what math library you use

答案很简单。你有玩家控制的对象(汽车),所以你可以通过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)

关于你需要的其他东西,请看我的答案:

  • https://stackoverflow.com/a/18041433/2521214