【问题标题】:3d Camera Position given some points给定一些点的 3d 相机位置
【发布时间】:2009-04-16 07:33:33
【问题描述】:

喂,

我目前正在做一个项目,我需要放置相机,以便在不移动相机的情况下看到角色的完整动作。我有角色开始的位置,以及角色在所有三个方向(X、Y 和 Z)上移动的最大距离。我也有视野(90度)。

是否有一个方程式可以确定我需要将相机放置在哪里,这样它就不必移动就能看到完整的动作?

注意:这是使用 OpenGL。

澄清:摄像机应该在动作中的角色“前面”,而不是上方。

它也会沿着地平面移动。

【问题讨论】:

    标签: opengl 3d 3dcamera


    【解决方案1】:

    如果您制作点的边界球,您需要做的就是将相机保持在大于或等于边界球半径/sin(FOV/2)的距离处。

    例如,如果您有一个半径为 Radius 的边界球体和一个指定的视野 FOV,那么您的相机只需位于“Dist”之外的一点,指向边界球体的中心。

    计算距离的公式是: Dist = 半径 / sin( FOV/2 );

    这适用于 3D,适用于任何方向的相机。

    【讨论】:

    • 这行得通,但它是一种悲观的方法 - 例如。如果对象在一条线上接近您,您可以将相机放在端点处。
    • 他提到一切都在 3D 中移动,所以我猜它不会是完全线性的......
    • @Reed:正确,运动可以向左移动 5 个单位,向右移动 3 个单位,向上移动 6 个单位,向下移动 4 个单位,等等。
    • @Reed(再次!):所以一种方法是将半径设置为最大 X、最大 Y、最大 Z 距离的最大值?又名: max(maxX, maxY, maxZ)?
    • @reed - 这不太正确 - 观察金字塔会在边缘与球体相交。
    【解决方案2】:

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

    为了论证起见,我们假设所有运动都在 (X, Z) 平面(即地面)内,并且眼睛沿 Y 轴位于原点正上方 10m 处。

    假设一个方形视口,在 90˚ 的视野范围内,您可以在 X 轴和 Z 轴的 ±10m 范围内看到,但仅限于地面上的物体 (Y = 0)。一旦它们离开地面,您的视野就会缩小。如果距离地面 1m,那么您的 (X, Z) 范围只有 ±9m。

    显然,一个真实的摄像机可以放置在场景中,面向任何方向。即使是相机的“滚动”角度也可以改变可见的程度。实际上有无数这样的相机点,因此您需要对您的标准进行一些限制。

    【讨论】:

      【解决方案3】:

      取从起点到终点的线段。通过线段的中点构造一个与该线段正交的平面。然后将相机放置在该平面中的某个位置,距离平面和直线的交点的距离大于以下距离。相机的向上矢量必须在平面内,水平视野必须为 90 度。

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

      这个摄像头位置的起点和终点都在视口的左右边界,垂直居中。

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

      【讨论】:

        【解决方案4】:

        这取决于,例如,如果对象要在平面上移动,您可以将相机放在球外,并限制其移动区域(这取决于 FOV 为 90,这是一个幸运的角度)。

        如果对象要以 3D 形式移动,则要困难得多。如果您指定对象移动的区域(立方体与球......)以及您希望从哪个方向看到它,这将有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-23
          • 1970-01-01
          • 1970-01-01
          • 2022-01-06
          • 1970-01-01
          相关资源
          最近更新 更多