你好,
我目前正在进行一个项目,需要将相机放置在某个位置,以便能够查看角色的全部动作而无需移动相机。我已经确定了角色开始的位置,以及角色在三个方向(X,Y和Z)上最大移动距离。我还知道视野范围(为90度)。
是否有一个方程可以计算出我需要放置相机的位置,以便它不必移动就能看到整个动作?
注意:这是使用OpenGL。
澄清一下:相机应该在运动中的角色“前面”,而不是在上方。
它也将沿着地面平面移动。
如果你用这些点创建一个边界球,你只需要让相机保持在距离边界球半径的正弦值不小于FOV/2的距离之外。
例如,如果你有一个半径为Radius的边界球和指定的视野FOV,你的相机只需要在距离"Dist"处,指向边界球的中心。
计算距离的方程式为: Dist = Radius / sin( FOV/2 );
这适用于3D场景下的任何相机方向。
取起点到终点的线段。通过线段中点构造一个垂直于该线段的平面。然后将相机放置在该平面上某个距离交点更远的位置,朝向交点。相机的上向量必须在平面内,水平视野必须为90度。
distance = sqrt(dx^2 + dy^2 + dz^2) / 2
这些相机位置都将在视口的左侧或右侧边界上具有起点和终点,并且垂直居中。
另一种解决方案可能是编写一个函数,该函数接受起点、终点和两个点在屏幕上的期望位置。然后只需解决相机变换的投影方程。
仅仅拥有最大的 (X, Y, Z) 范围是不够的,因为视口本质上是金字塔形状,其金字塔顶点位于眼睛位置。
为了论证,我们假设所有运动都在 (X, Z) 平面上(即地面),而眼睛直接在原点以上 10 米处的 Y 轴。
假设视口是正方形的,你的 90˚ 视野能让你从 X 和 Z 轴的 ±10m 处看到,但只对在地面上的物体(Y=0)有效。一旦它们离开地面,你的视野就会减少。如果它距离地面 1 米,那么你的 (X, Z) 范围只有 ±9 米。
显然,真实的相机可以放置在场景中的任何位置,朝向任何方向。即使相机的“翻转”角度也会改变可见内容的范围。实际上有无限多个这样的相机点,因此你需要稍微约束一下你的标准。
这要看情况,比如说,如果物体只在平面内移动,你可以把摄像机放在一个球外面,这个球刚好包围了物体的运动区域(这取决于视场角是90度,这是一个幸运的角度)。
如果物体是在三维空间中移动,那就更难了。如果你能指定物体移动的区域(立方体还是球形...)以及你想从哪个方向观察它,那会有所帮助。