透视投影后球体的轮廓?
Outline of a sphere after perspective projection?
我正在开发一个 3D 地图应用程序,我必须做一些事情,比如从 space 中的给定点找出球体(地球)的可见区域比如裁剪映射区域等等。
如果我可以将地球的轮廓投射到屏幕上 space,在那里剪裁多边形,然后投射回地球表面 (lat/lon),很多事情会变得更容易,但是我'我不知道该怎么做。
有没有一种合理的方法来计算透视投影后球体的轮廓,然后将事物投影回球体?
您可以在 3D 中裁剪多边形。球体的轮廓 - back-projected 到 3D - 将始终是平面上的圆。透视投影不会改变这一点。因此,您可以在平面上剪切所有多边形。
计算平面并不难。如果您将球体的中心视为原点,则该平面可以正常形式表示为:
dot(n, x) = d
n
是正常的。这个很简单。就是球心到观察者的单位方向向量。
d
是距球心的距离。这有点难,但不是太难。如果l
是观察者到球体中心的距离,r
是球体半径,则
d = r^2 / l
这是您可以用来在 3D 中裁剪多边形的平面。如果需要圆的半径就可以了,可以用下面的公式:
r_c = r / sqrt(1 - r^2/(l-d)^2)
让我们在球坐标 (cos(u)sin(v),sin(u)sin(v),cos(v))
和任意投影中心 (x,y,z)
.
中取一个球体上的点
我们用直线的方向与球体原点的向量的垂直条件表示一条投影线与球体相切:
(x-cos(u)sin(v))cos(u)sin(v) + (y-sin(u)sinv))sin(u)sin(v) + (z-cos(v)) cos(v) = 0
这简化为
x cos(u)sin(v) + y sin(u)sin(v) + z cos(v) = 1
这是longitude/latitude坐标中的一条曲线。您可以将 u
作为 v
的函数求解,或者相反。
我正在开发一个 3D 地图应用程序,我必须做一些事情,比如从 space 中的给定点找出球体(地球)的可见区域比如裁剪映射区域等等。
如果我可以将地球的轮廓投射到屏幕上 space,在那里剪裁多边形,然后投射回地球表面 (lat/lon),很多事情会变得更容易,但是我'我不知道该怎么做。
有没有一种合理的方法来计算透视投影后球体的轮廓,然后将事物投影回球体?
您可以在 3D 中裁剪多边形。球体的轮廓 - back-projected 到 3D - 将始终是平面上的圆。透视投影不会改变这一点。因此,您可以在平面上剪切所有多边形。
计算平面并不难。如果您将球体的中心视为原点,则该平面可以正常形式表示为:
dot(n, x) = d
n
是正常的。这个很简单。就是球心到观察者的单位方向向量。
d
是距球心的距离。这有点难,但不是太难。如果l
是观察者到球体中心的距离,r
是球体半径,则
d = r^2 / l
这是您可以用来在 3D 中裁剪多边形的平面。如果需要圆的半径就可以了,可以用下面的公式:
r_c = r / sqrt(1 - r^2/(l-d)^2)
让我们在球坐标 (cos(u)sin(v),sin(u)sin(v),cos(v))
和任意投影中心 (x,y,z)
.
我们用直线的方向与球体原点的向量的垂直条件表示一条投影线与球体相切:
(x-cos(u)sin(v))cos(u)sin(v) + (y-sin(u)sinv))sin(u)sin(v) + (z-cos(v)) cos(v) = 0
这简化为
x cos(u)sin(v) + y sin(u)sin(v) + z cos(v) = 1
这是longitude/latitude坐标中的一条曲线。您可以将 u
作为 v
的函数求解,或者相反。