如何让相机跟随opengl中的3d对象?

Posted

技术标签:

【中文标题】如何让相机跟随opengl中的3d对象?【英文标题】:how to make camera follow a 3d object in opengl? 【发布时间】:2011-05-29 23:26:09 【问题描述】:

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

【问题讨论】:

您能否提供更多细节:汽车位置是如何定义的,您想要什么样的摄像头行为?通常,您需要获取汽车的位置以及可能“看”的方向,然后从中计算相机位置。 渲染代码更有助于提供有意义的答案。另外,你能描述一下目前正在发生的事情吗?汽车加速时摄像头是否固定?还是你还没走到那一步? 我的代码由显示函数组成,其中包含转换函数、更新函数和绘制 m2d 汽车和轨道的渲染场景函数。我在渲染之前和之前使用了代码,但它也不起作用。 ...关于汽车位置,我有一个向量,我可以在其中更改 onSpecialkey 函数。使用我的代码汽车加速,所以起初汽车比相机慢,然后相机变慢,汽车消失。我需要摄像头与汽车保持恒定距离。有什么建议吗? 【参考方案1】:

可能是这样的?

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

【讨论】:

【参考方案2】:

答案很简单。您有玩家控制的对象(汽车),因此您可以通过世界空间中的 ModelViewMatrix 获得其位置和方向(通常指向 3D 模型的中心) 要将其转换为正确的跟随 ProjectionMatrix,您必须:

    获取汽车ModelViewMatrix以加倍M[16] 将其平移/旋转到新位置(驾驶舱内或车后),使 Z 轴指向您想要查看的方向。 反转 M ... M=Inverse(M) 应用透视 M=M*PerspectiveMatrix 在渲染前将 M 存储为 ProjectionMatrix

有关您需要的其他内容,请在此处查看我的答案:https://***.com/a/18041433/2521214

【讨论】:

以上是关于如何让相机跟随opengl中的3d对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何使相机跟随unity3d C#中的对象?

根据 3D 对象的位置旋转相机

如何让物体跟随相机?

OpenGL:相机和对象

怎么用unity3d模拟吃鸡中的摄像机跟随

如何统一停止相机跟随Y