如何在opengl中使相机跟随三维物体
how to make camera follow a 3d object in opengl?
我第一次使用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
,您必须:
-
获取或构建汽车
ModelMatrix
作为double M[16]
-
将其平移/旋转到新位置(驾驶舱内或车后)
所以Z轴指向你想要看到的方向。跟随距离通常是速度的函数
-
将
M
反转为M=Inverse(M)
-
使用
M
作为ModelViewMatrix
-
渲染
简而言之:
ModelViewMatrix = rendered_object_matrix * Inverse(following_object_matrix * local_view_offset)
关于你需要的其他东西,请看我的答案:
- https://stackoverflow.com/a/18041433/2521214
相关文章:
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 如何使用qt缩放三维网格
- 三维数组中的C/C++DWORD到BYTE和BYTE到DWORD的转换
- 使用vtkImageReslice重新切片三维原始图像
- 特征:创建一个具有函数的三维阵列
- 扩充矩阵的行缩减-三维样条曲线计算
- 使用pcl transformcloud将三维点平移并旋转到原点
- 用C++从三维矢量中删除元素
- 如何访问CGAL三维三角测量中的面
- 如何在Openscenegraph中从二维鼠标点击的屏幕坐标点计算三维点(世界坐标)
- std::将三维数组复制到三维向量中
- 显示结构的三维数组
- 如何将X 2维数组连接到一个三维阵列中
- 使用unique_ptr来管理三维数组
- 如何访问三维矩阵元素
- 无法访问三维数组中的特定位置
- 如何将 HDC 位图快速复制到三维阵列?
- 内存相关崩溃:Cocos2d游戏中的三维数组
- 如何使用opencv和c++实现三维sift算法
- 如何在opengl中使相机跟随三维物体