【问题标题】:How to calculate azimut & elevation relative to a camera direction of view in 3D ...?如何计算相对于 3D 相机视角的方位角和仰角......?
【发布时间】:2012-06-10 07:52:44
【问题描述】:

我这里有点生疏了。

我有一个向量 (camDirectionX, camDirectionY, camDirectionZ) 代表我的相机视图方向。 我有一个 (camX, camY, camZ) 这是我的相机位置。

然后,我在 (objectX, objectY, objectZ) 放置了一个对象

如何从相机的角度计算对象的方位角和仰角??

【问题讨论】:

    标签: vector 3d camera elevation azimuth


    【解决方案1】:

    为了简化问题,我要做的第一件事是转换坐标空间,使相机位于 (0, 0, 0) 并直接指向其中一个轴(所以方向是 (0, 0 , 1))。翻译使相机位于 (0, 0, 0) 非常简单,所以我不会深入讨论。旋转使相机方向为 (0, 0, 1) 有点棘手...

    一种方法是构建相机的完整正交基,然后将其粘贴到旋转矩阵中并应用它。相机的“标准正交基”是指从相机指向前方、上方和右侧的三个向量的一种奇特方式。它们都应该彼此成 90 度(这是正交位的含义),并且它们的长度都应该是 1(这是正常位的含义)。

    您可以通过一些叉积技巧获得这些向量:两个向量的叉积与两者垂直(成 90 度)。

    要获得向右的向量,我们可以将相机方向向量与 (0, 1, 0) (一个指向正上方的向量)进行叉积。您需要对从叉积中得到的向量进行归一化。

    要获得相机的向上矢量,我们可以将相机方向矢量与我们刚刚计算的向右矢量进行交叉乘积。假设两个输入向量都已归一化,则不需要进行归一化。

    我们现在有了相机的正交基。如果我们将这些向量粘贴到 3x3 矩阵的行中,我们会得到一个旋转矩阵,它将转换我们的坐标空间,因此相机直接指向其中一个轴(哪个轴取决于您粘贴向量的顺序)。

    现在计算对象的方位角和仰角相当容易。

    要获得方位角,只需在对象的 x/z 坐标上执行 atan2

    要获得高程,请将对象坐标投影到 x/z 平面上(只需将 y 坐标设置为 0),然后执行:

    acos(dot(normalise(object coordinates), normalise(projected coordinates)))
    

    这将始终给出一个正角度——如果对象的 y 坐标小于 0,您可能想要否定它。

    所有这些的代码如下所示:

    fwd = vec3(camDirectionX, camDirectionY, camDirectionZ)
    cam = vec3(camX, camY, camZ)
    obj = vec3(objectX, objectY, objectZ)
    
    # if fwd is already normalised you can skip this
    fwd = normalise(fwd)
    
    # translate so the camera is at (0, 0, 0)
    obj -= cam
    
    # calculate the orthonormal basis of the camera
    right = normalise(cross(fwd, (0, 1, 0)))
    up = cross(right, fwd)
    
    # rotate so the camera is pointing straight down the z axis
    # (this is essentially a matrix multiplication)
    obj = vec3(dot(obj, right), dot(obj, up), dot(obj, fwd))
    
    azimuth = atan2(obj.x, obj.z)
    
    proj = vec3(obj.x, 0, obj.z)
    elevation = acos(dot(normalise(obj), normalise(proj)))
    if obj.y < 0:
        elevation = -elevation
    

    需要注意的一点是,当您的相机正面朝上或朝下时,原始相机向量与 (0, 1, 0) 的叉积将返回零长度向量。为了完全定义相机的方向,我假设它始终是“笔直的”,但这并不意味着当它正面朝上或朝下时——你需要另一个规则。

    【讨论】:

    • 非常感谢您的回答。我在实施它时遇到了一些困难。我得到了关于通过平移和旋转来简化的第一部分。但在那之后我迷路了。确实,“我们现在有了标准正交基”意味着我必须使用它作为对象的参考?我怎样才能做到这一点?因为x/z中的方位角计算都是x,z进新的基本吧..?
    • @gluon 我已经用一些伪代码更新了答案。希望这会让事情更清楚
    • 我猜关键是...四元数。我想我必须有一个全新的方法来使用四元数。
    • 面朝下的情况是云台锁对吗?为了避免这种情况,我需要为方位角和仰角计算提供更多信息吗?我猜是四元数。在那种情况下会怎么计算? (任何线索都会很棒)
    • @gluon 我认为您只需要某种方式来决定在直视向上/向下的情况下相机的方向。您还为相机存储了哪些其他信息?还是只是位置和 vec3 方向?你还在用相机做什么?例如,如果您正在渲染相机的视图,您必须已经有一种方法可以决定在所有情况下哪种方式适合相机?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多