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

Math 用于计算相机x、y、z位置的公式,以强制3D点显示在屏幕左侧和地球上最右侧的位置,math,3d,camera,geometry,Math,3d,Camera,Geometry,我需要一个公式来计算以下情况下相机的3D位置和方向: 摄像机的起始位置是直视地球中心。绿线直达天空 相机需要移动到的位置如下所示 起始位置可能不重要,但问题是: 如何在给定地球上任意点的三维坐标的情况下计算摄像机的位置和方向。在摄影机最终位置,与地球的距离始终固定。从所需的相机角度来看,所选的点应该出现在地球仪的最右边。我认为相机位置所需的是一个平面交点上的点,该点平行于该位置的切平面,但距离中心稍远,还有一个球体,表示相机距中心的固定距离。交点将是一个圆,因此有无限多个摄影机位置可以工作

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

摄像机的起始位置是直视地球中心。绿线直达天空

相机需要移动到的位置如下所示

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

我认为相机位置所需的是一个平面交点上的点,该点平行于该位置的切平面,但距离中心稍远,还有一个球体,表示相机距中心的固定距离。交点将是一个圆,因此有无限多个摄影机位置可以工作

相机方向将由位置决定,1/2由图片中你想要多少地球决定

假设(0,0,0)是地球的中心,Re是地球的半径,(a,b,c)是你想看的地球上的位置。如果是纬度和经度,你应该转换成笛卡尔坐标,这很简单。你的相机应该在一个垂直于矢量(a,b,c)的平面上,并且在离地球kRe的高度,k>1是你可以调整的数值。平面的方程式为ax+by+cz=d,其中d=kRe^2。请注意,平面通过空间中的点(ka、kb、kc),这是我们想要的

由于您希望相机位于地球上方的某个高度,例如h*Re,其中1 (0,0,1)的“水平分量”为

如果愿意,可以将向量规格化为长度1,但不需要。但是,您确实需要计算并存储向量长度的平方,即

|u|^2 = ((ac)^2 + (bc)^2 + (Re^2-c^2))/Re^4
我们可以通过取(0,0,1)和前一个向量的叉积,得到正交系统中的第三个向量,然后得到相机所在平面和球体交点的参数方程,从而使问题进一步复杂化,但如果你只想得到最简单的答案,我们不会这样做

现在我们需要解决t,这样的问题

|(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度,我不确定


如果这不起作用,可能是我出错了。让我知道它是如何工作的,我会检查。

我使用笛卡尔坐标系。屏幕的大约1/7应该是地球,但不一定要精确。圆圈,这可能并不重要,我更喜欢最简单的计算
(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)