Vector 如何计算方位角&;相对于三维视图中摄影机方向的高程。。。?

Vector 如何计算方位角&;相对于三维视图中摄影机方向的高程。。。?,vector,3d,camera,elevation,azimuth,Vector,3d,Camera,Elevation,Azimuth,我这里有点生疏了 我有一个向量(camDirectionX,camDirectionY,camDirectionZ),它代表我的相机的观察方向。 我有一个(camX,camY,camZ)是我的相机位置 然后,我将一个对象放置在(objectX,objectY,objectZ) 如何从摄影机的角度计算对象的方位角和仰角???为了简化问题,我要做的第一件事是变换坐标空间,使摄影机位于(0,0,0)并直接指向其中一个轴(因此方向是(0,0,1))。将相机转换为(0,0,0)是非常简单的,所以我不想讨论

我这里有点生疏了

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

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


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

为了简化问题,我要做的第一件事是变换坐标空间,使摄影机位于(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
fwd=vec3(camDirectionX、camDirectionY、camDirectionZ)
凸轮=vec3(凸轮轴、凸轮轴、凸轮轴)
obj=vec3(objectX、objectY、objectZ)
#如果fwd已正常化,则可以跳过此操作
fwd=正常化(fwd)
#平移,使摄影机位于(0,0,0)
obj-=凸轮
#计算相机的正交基
右=法线化(交叉(前进,(0,1,0)))
向上=交叉(右,前进)
#旋转,使相机直接指向z轴
#(这本质上是矩阵乘法)
obj=vec3(点(obj,右),点(obj,向上),点(obj,向前))
方位角=atan2(obj.x,obj.z)
项目=向量3(对象x,0,对象z)
高程=acos(点(法线化(obj)、法线化(proj)))
如果对象y<0:
标高=-标高

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

为了简化问题,我要做的第一件事是变换坐标空间,使相机位于(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
fwd=vec3(camDirectionX、camDirectionY、camDirectionZ)
凸轮=vec3(凸轮轴、凸轮轴、凸轮轴)
obj=vec3(objectX、objectY、objectZ)
#如果fwd已正常化,则可以跳过此操作
fwd=正常化(