如何让相机跟随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对象?的主要内容,如果未能解决你的问题,请参考以下文章