繁体   English   中英

如何使相机跟随 opengl 中的 3d object?

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

我第一次使用 opengl 进行赛车比赛,我面临的第一个问题是如何让相机以恒定的距离跟随汽车。这是键盘 function.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

答案很简单。 你有玩家控制的 object(汽车),所以你有它的 position 和通过世界空间中的ModelViewMatrix的方向(通常指向 3D 模型的中心)要将其转换为正确的跟随ModelViewMatrix模型)

  1. 获得或构造汽车ModelMatrix作为double M[16]

  2. 将其翻译/旋转到新的 position(驾驶舱内或车后)

    所以Z轴指向你想看到的方向。 它通常具有跟随距离为 function 的速度

  3. 反转M所以M=Inverse(M)

  4. 使用M作为ModelViewMatrix

  5. 使成为

简而言之:

ModelViewMatrix = rendered_object_matrix * Inverse(following_object_matrix * local_view_offset)

有关您需要的其他内容,请在此处查看我的答案:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM