【发布时间】:2009-04-16 07:33:33
【问题描述】:
喂,
我目前正在做一个项目,我需要放置相机,以便在不移动相机的情况下看到角色的完整动作。我有角色开始的位置,以及角色在所有三个方向(X、Y 和 Z)上移动的最大距离。我也有视野(90度)。
是否有一个方程式可以确定我需要将相机放置在哪里,这样它就不必移动就能看到完整的动作?
注意:这是使用 OpenGL。
澄清:摄像机应该在动作中的角色“前面”,而不是上方。
它也会沿着地平面移动。
【问题讨论】:
喂,
我目前正在做一个项目,我需要放置相机,以便在不移动相机的情况下看到角色的完整动作。我有角色开始的位置,以及角色在所有三个方向(X、Y 和 Z)上移动的最大距离。我也有视野(90度)。
是否有一个方程式可以确定我需要将相机放置在哪里,这样它就不必移动就能看到完整的动作?
注意:这是使用 OpenGL。
澄清:摄像机应该在动作中的角色“前面”,而不是上方。
它也会沿着地平面移动。
【问题讨论】:
如果您制作点的边界球,您需要做的就是将相机保持在大于或等于边界球半径/sin(FOV/2)的距离处。
例如,如果您有一个半径为 Radius 的边界球体和一个指定的视野 FOV,那么您的相机只需位于“Dist”之外的一点,指向边界球体的中心。
计算距离的公式是: Dist = 半径 / sin( FOV/2 );
这适用于 3D,适用于任何方向的相机。
【讨论】:
仅具有 (X, Y, Z) 的最大范围是不够的,因为观察口本质上是金字塔形的,金字塔的顶点位于眼睛位置。
为了论证起见,我们假设所有运动都在 (X, Z) 平面(即地面)内,并且眼睛沿 Y 轴位于原点正上方 10m 处。
假设一个方形视口,在 90˚ 的视野范围内,您可以在 X 轴和 Z 轴的 ±10m 范围内看到,但仅限于地面上的物体 (Y = 0)。一旦它们离开地面,您的视野就会缩小。如果距离地面 1m,那么您的 (X, Z) 范围只有 ±9m。
显然,一个真实的摄像机可以放置在场景中,面向任何方向。即使是相机的“滚动”角度也可以改变可见的程度。实际上有无数这样的相机点,因此您需要对您的标准进行一些限制。
【讨论】:
取从起点到终点的线段。通过线段的中点构造一个与该线段正交的平面。然后将相机放置在该平面中的某个位置,距离平面和直线的交点的距离大于以下距离。相机的向上矢量必须在平面内,水平视野必须为 90 度。
distance = sqrt(dx^2 + dy^2 + dz^2) / 2
这个摄像头位置的起点和终点都在视口的左右边界,垂直居中。
另一种解决方案可能是编写一个函数,该函数获取屏幕上两个点的起点、终点和所需位置。然后只需求解相机变换的投影方程即可。
【讨论】:
这取决于,例如,如果对象要在平面上移动,您可以将相机放在球外,并限制其移动区域(这取决于 FOV 为 90,这是一个幸运的角度)。
如果对象要以 3D 形式移动,则要困难得多。如果您指定对象移动的区域(立方体与球......)以及您希望从哪个方向看到它,这将有所帮助。
【讨论】: