Graphics 透视投影后球体的轮廓?

Graphics 透视投影后球体的轮廓?,graphics,3d,geometry,computational-geometry,Graphics,3d,Geometry,Computational Geometry,我正在开发一个3D贴图应用程序,我需要做一些工作,比如从空间中的给定点计算出球体(地球)的可见区域,比如剪裁贴图区域等等 如果我可以将地球的轮廓投影到屏幕空间,在那里剪裁多边形,然后投影回地球表面(lat/lon),有几件事情会变得更容易,但我不知道如何做到这一点 是否有一种合理的方法来计算透视投影后球体的轮廓,然后再将物体投影回球体?您可以在3D中剪裁多边形。球体的轮廓-投影到3D中-将始终是平面上的一个圆。透视投影不会改变这一点。因此,可以在平面上剪裁所有多边形 计算飞机并不难。如果考虑球面

我正在开发一个3D贴图应用程序,我需要做一些工作,比如从空间中的给定点计算出球体(地球)的可见区域,比如剪裁贴图区域等等

如果我可以将地球的轮廓投影到屏幕空间,在那里剪裁多边形,然后投影回地球表面(lat/lon),有几件事情会变得更容易,但我不知道如何做到这一点


是否有一种合理的方法来计算透视投影后球体的轮廓,然后再将物体投影回球体?

您可以在3D中剪裁多边形。球体的轮廓-投影到3D中-将始终是平面上的一个圆。透视投影不会改变这一点。因此,可以在平面上剪裁所有多边形

计算飞机并不难。如果考虑球面的中心原点,则平面可以用正常形式表示为:

dot(n, x) = d
n
是正常情况。这个很简单。它只是从圆心到观察者的单位方向向量

d
是到球体中心的距离。这有点难,但不是太难。如果
l
是观察者到球体中心的距离,
r
是球体半径,则

d = r^2 / l
这是可用于在3D中剪裁多边形的平面。如果需要圆的半径,可以使用以下公式:

r_c = r / sqrt(1 - r^2/(l-d)^2)

可以在3D中剪裁多边形。球体的轮廓-投影到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

这是经度/纬度坐标中的曲线。你可以将
u
作为
v
的函数来求解,或者反过来求解。

让我们在球坐标
中取一个点(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

这是经度/纬度坐标中的曲线。您可以将
u
作为
v
的函数进行求解,或者反过来进行求解。

在3D中进行剪裁可能更容易。如何表示多边形?多边形将仅是lat/lon中的国家形状。我需要将这些国家剪辑到全球可见区域,这样我就可以将它们投影到屏幕空间和光栅中。我使用的是软件,而不是OpenGL或类似软件。在3D中进行剪辑可能更容易。如何表示多边形?多边形将仅是lat/lon中的国家形状。我需要将这些国家剪辑到全球可见区域,这样我就可以将它们投影到屏幕空间和光栅中。我是用软件而不是OpenGL或类似软件来实现的。我明白了,所以你说的是用3D而不是2D来剪裁平面上的多边形。这个平面和地球的交点会给我一个可见的地平线多边形,对吗?是的,对。剪辑将是2D/3D的混合。对于穿过平面的多边形,您还必须考虑圆(作为轮廓),这基本上是二维剪裁。好的,我认为这是有意义的,我将给它编码一个镜头,谢谢!还有:既然地球在技术上不是一个球体,你有没有想过如何将你的方程式应用到地球的参考椭球体上?@MerseyViking,它是一样的
d
。但我不知道为什么我会这样写。更新了一个更简单的公式。我明白了,所以你说的是在三维平面上而不是二维平面上裁剪多边形。这个平面和地球的交点会给我一个可见的地平线多边形,对吗?是的,对。剪辑将是2D/3D的混合。对于穿过平面的多边形,您还必须考虑圆(作为轮廓),这基本上是二维剪裁。好的,我认为这是有意义的,我将给它编码一个镜头,谢谢!还有:既然地球在技术上不是一个球体,你有没有想过如何将你的方程式应用到地球的参考椭球体上?@MerseyViking,它是一样的
d
。但我不知道为什么我会这样写。更新了一个更简单的公式。