嘿嘿,
我目前正在做一个项目,我需要放置相机,以便在不移动相机的情况下可以看到角色的完整动作。我有角色开始的位置,以及角色在所有三个方向(X、Y 和 Z)上移动的最大距离。我也有视野(90度)。
是否有一个方程式可以确定我需要将相机放置在哪里,这样它就不必移动就能看到完整的动作?
注意:这是使用 OpenGL。
澄清:摄像机应该在动作中的角色“前面”,而不是在上面。
它也将沿着地平面移动。
如果您制作点的边界球,您需要做的就是将相机保持在大于或等于边界球半径/ sin(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)平面(即地面)内,并且眼睛沿Y轴在原点正上方10m处。
假设一个方形视口,在 90˚ 视野下,您可以沿 X 轴和 Z 轴从 ±10m 看到,但仅限于地面上的物体 (Y = 0)。一旦它们离开地面,您的视野就会缩小。如果距离地面 1m,那么您的 (X, Z) 范围仅为 ±9m。
很明显,一个真实的摄像机可以放置在场景中,面向任何方向。甚至相机的“滚动”角度也可以改变可见的程度。实际上有无限多个这样的相机点,因此您需要在一定程度上限制您的标准。
这取决于,例如,如果对象要在平面上移动,您可以将相机放置在限定其移动区域的球之外(这取决于 FOV 为 90 的事实,这是一个幸运的角度)。
如果对象要在 3D 中移动,那就更困难了。如果您指定对象移动的区域(立方体与球......)以及您希望从中看到它的方向,这将有所帮助。