3D相机位置确定基于一些点

3

你好,

我目前正在进行一个项目,需要将相机放置在某个位置,以便能够查看角色的全部动作而无需移动相机。我已经确定了角色开始的位置,以及角色在三个方向(X,Y和Z)上最大移动距离。我还知道视野范围(为90度)。

是否有一个方程可以计算出我需要放置相机的位置,以便它不必移动就能看到整个动作?

注意:这是使用OpenGL。

澄清一下:相机应该在运动中的角色“前面”,而不是在上方。

它也将沿着地面平面移动。

4个回答

1

如果你用这些点创建一个边界球,你只需要让相机保持在距离边界球半径的正弦值不小于FOV/2的距离之外。

例如,如果你有一个半径为Radius的边界球和指定的视野FOV,你的相机只需要在距离"Dist"处,指向边界球的中心。

计算距离的方程式为: Dist = Radius / sin( FOV/2 );

这适用于3D场景下的任何相机方向。


这个方法是可行的,但它是一种悲观的方法 - 例如,如果物体正在沿着一条直线向你靠近,你可以将相机放置在终点处。 - jpalecek
他提到一切都在三维空间中移动,所以我猜这不会完全是线性的... - Reed Copsey
@Reed:没错,这个运动可以向左移动5个单位,向右移动3个单位,向上移动6个单位,向下移动4个单位等等。 - Will Mc
@reed - 这不完全正确 - 视锥体与球体会在边缘交叉。 - Alnitak
@Reed:即使它不完全是线性的,它仍然是悲观的 - 例如,您可以使用90度(~70度足矣)的视野从其一个角落调查一个立方体,这比您建议的距离更近(FOV 90的sqrt(2)倍)。 - jpalecek
显示剩余4条评论

0

取起点到终点的线段。通过线段中点构造一个垂直于该线段的平面。然后将相机放置在该平面上某个距离交点更远的位置,朝向交点。相机的上向量必须在平面内,水平视野必须为90度。

distance = sqrt(dx^2 + dy^2 + dz^2) / 2

这些相机位置都将在视口的左侧或右侧边界上具有起点和终点,并且垂直居中。

另一种解决方案可能是编写一个函数,该函数接受起点、终点和两个点在屏幕上的期望位置。然后只需解决相机变换的投影方程。


0

仅仅拥有最大的 (X, Y, Z) 范围是不够的,因为视口本质上是金字塔形状,其金字塔顶点位于眼睛位置。

为了论证,我们假设所有运动都在 (X, Z) 平面上(即地面),而眼睛直接在原点以上 10 米处的 Y 轴。

假设视口是正方形的,你的 90˚ 视野能让你从 X 和 Z 轴的 ±10m 处看到,但只对在地面上的物体(Y=0)有效。一旦它们离开地面,你的视野就会减少。如果它距离地面 1 米,那么你的 (X, Z) 范围只有 ±9 米。

显然,真实的相机可以放置在场景中的任何位置,朝向任何方向。即使相机的“翻转”角度也会改变可见内容的范围。实际上有无限多个这样的相机点,因此你需要稍微约束一下你的标准。


0

这要看情况,比如说,如果物体只在平面内移动,你可以把摄像机放在一个球外面,这个球刚好包围了物体的运动区域(这取决于视场角是90度,这是一个幸运的角度)。

如果物体是在三维空间中移动,那就更难了。如果你能指定物体移动的区域(立方体还是球形...)以及你想从哪个方向观察它,那会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接