用于计算相机x,y,z位置以强制3D点出现在屏幕左侧和地球上最右侧位置的公式

时间:2015-04-30 16:49:43

标签: math 3d camera geometry

我需要一个公式来计算以下情况下相机的3D位置和方向或方向:

相机起始位置正直视地球中心。绿线直行到天空

enter image description here

相机需要移动的位置看起来像这样

enter image description here

起始位置可能不重要,但问题是: 如何在给定地球上任何点的3D坐标的情况下计算摄像机位置和方向。在摄像机的最终位置,距离地球的距离始终是固定的。从所需的摄像机角度来看,所选点应出现在地球仪的最右侧。

1 个答案:

答案 0 :(得分:0)

我认为你想要的相机位置是平行于该位置切平面的平面的交点上的一个点,但距离中心稍远一点,并且一个球体表示相机应该距离中心的固定距离。交叉点将是一个圆,因此有无数的相机位置可以工作。

摄像机方向将由位置确定1/2,1/2取决于图片中您想要多少地球。

假设(0,0,0)是地球的中心,Re是地球的半径,(a,b,c)是你想要看的地球上的位置。如果它在纬度和经度方面你应该转换为直接的笛卡尔坐标。您的相机应位于垂直于矢量(a,b,c)的平面上,并且高度为k Re高于地球,其中k> 1是您可以调整的某个数字。然后,平面的等式是ax + by + cz = d,其中d = k Re ^ 2。请注意,飞机穿过太空中的点(ka,kb,kc),这就是我们想要的。

由于您希望相机处于地球上方的某个高度,请说h * Re,其中1< k< h,你需要在ax +上找到点+ + cz = d,其中x ^ 2 + y ^ 2 + z ^ 2 = h ^ 2 * Re ^ 2。所以我们需要平面和球体的交点。如果我们在平面上有一个坐标系,我们可以更容易管理,我们从包括(a,b,c)的标准正交系统得到。正交系统中第二个向量的一个很好的候选者是z轴的投影(极轴,我假设)。投影(0,0,1)到(a,b,c),

proj_(a,b,c)(0,0,1) = (a,b,c).(0,0,1)/|(a,b,c)|^2 (a,b,c)
= c/Re^2 (a,b,c)

然后是"水平分量" (0,0,1)是

u = proj_Plane(0,0,1) = (0,0,1) - c/Re^2 (a,b,c) 
= (-ac/Re^2,-bc/Re^2,1-c^2/Re^2)

如果您愿意,可以将矢量标准化为长度1,但不需要。但是,您需要计算并存储矢量长度的平方,即

|u|^2 = ((ac)^2 + (bc)^2 + (Re^2-c^2))/Re^4

我们可以通过取(0,0,1)和前一个矢量的叉积来得到正交系统中的第三个矢量,然后获得平面和球体的交点的参数方程,从而进一步复杂化。相机谎言,但如果你只想要最简单的答案我们就不会那样做。

现在我们需要解决这个问题

|(ka,kb,kc)+t(-ac/Re^2,-bc/Re^2,1-c^2/Re^2)|^2 = h^2 Re^2
|(ka,kb,kc)|^2 + 2t (a,b,c).u + t^2 |u|^2 = h^2 Re^2

由于(a,b,c)和u是垂直的,中间项会消失,你有

t^2 = (h^2 Re^2 - k^2 Re^2)/|u|^2.

将t的值代入

(ka,kb,kc)+t(-ac/Re^2,-bc/Re^2,1-c^2/Re^2)

给出了相机在太空中的位置。

至于方向,你必须尝试一下。一些看起来像

的矢量
(a,b,c) + s(-ac/Re^2,-bc/Re^2,1-c^2/Re^2)

应该有效。说先验很难,因为它取决于相机的放大倍数,视图屏幕的宽度等。我不确定你是否需要s的正值或负值。您可能还需要旋转摄像机视口,可能旋转90度,我不确定。

如果这没有成功,我可能会犯错误。让我知道它是如何工作的,我会检查。