3d 星形球体&x2013;将点从球体投影到二维

3d 星形球体&x2013;将点从球体投影到二维,3d,geometry,projection,3d,Geometry,Projection,我正在尝试创建一个基本的“星空”体验,需要将点从球体表面投影到2D视口。我一直在尝试做一些研究,但3D投影的主题相当复杂;另一方面,使用一个成熟的3D库似乎有些过火 天空被表示为一个(半球)球体,恒星位于其表面,观测者“坐”在球体的中心。我有恒星的坐标和视图方向(都是3D的,作为球体表面上的点[赤纬:0-90=地平线北极,方位:0-360])。我还有视口的大小(2D)。当视图方向等于恒星的坐标时,恒星会投影到视口的中心,但对于所有其他点,如果它们位于球面上,则会有一些“变形” 根据恒星在球体上的

我正在尝试创建一个基本的“星空”体验,需要将点从球体表面投影到2D视口。我一直在尝试做一些研究,但3D投影的主题相当复杂;另一方面,使用一个成熟的3D库似乎有些过火

天空被表示为一个(半球)球体,恒星位于其表面,观测者“坐”在球体的中心。我有恒星的坐标和视图方向(都是3D的,作为球体表面上的点[赤纬:0-90=地平线北极,方位:0-360])。我还有视口的大小(2D)。当视图方向等于恒星的坐标时,恒星会投影到视口的中心,但对于所有其他点,如果它们位于球面上,则会有一些“变形”


根据恒星在球体上的坐标和视图的方向计算恒星在视口中的位置的公式是什么?(我想还需要一些额外的参数…)

一种方法是将视口固定在位置上,我们旋转天空,使视图中的中心星直接位于您的前方。假设您朝北看,则意味着首先将天空旋转中心星方位角的负数,使其直接位于您的前方。然后向下旋转天空(围绕东西轴)将中心星放置在你前方的地平线上

通过将这两个旋转应用于天空中的所有恒星,我们可以为它们获得新的位置,您可以简单地计算它们落在视口中的位置

那么怎么做呢?让我们把一些坐标放在适当的位置。对于三维空间,假设你面向“北”,我们将称之为正x方向。它们的y轴指向东,z轴指向直上。你的眼睛位于(0,0,0)。对于二维视口,我们将说视口的中心位于(0,0),s轴指向右侧,t轴指向上方。我本可以将其称为三维视口x轴和y轴,但由于三维空间具有x、y和z轴,轴名称的重复使用很快就会令人困惑。因此只需将三维空间视为(x、y、z),将二维空间视为(s、t)

视口本身平行于三维空间的yz平面放置,因此垂直于其x轴,并且在(e,0,0)处与x轴相交,因此基本上e是视口与眼睛的距离

将(x,y,z)处的恒星投影到2D平面上非常简单:

视口坐标=(-ey/x,ez/x)

因为你只能看到前面的星星,(x>0),所以只能投射x>0的星星。“e”现在只是一个比例因子;增加它“放大”

如果要将其映射到计算机屏幕,可能需要:

  • 缩放以使视口的宽度和高度与像素宽度和高度匹配
  • 将像素宽度和高度的一半添加到(s,t)坐标中。这样,视口的中心(0,0)映射到屏幕的中心(宽度/2,高度/2)
  • 翻转y坐标(因为屏幕的(0,0)在左上角,而不是左下角)
这很简单,对吧;)

困难的部分是计算出每颗恒星的坐标,以及当你旋转你前面的中心恒星时,它们映射到什么位置

假设:

  • 中心星“c”已经消失了
    • 方位角=azc
    • 偏角
  • 要将“p”投影到二维视口上的星星已
    • 方位角=azp
    • 偏角=dep
那么,单位球面上恒星“p”的(x,y,z)坐标是:

  • x=cos(dec)cos(azp-azc)cos(dep)+sin(dec)sin(dep)
  • y=sin(azp-azc)cos(dep)
  • z=-sin(dec)cos(azp-azc)cos(dep)+cos(dec)sin(dep)
我是用3D矩阵推导出来的。如果你感兴趣的话,我可以把它展示出来,以后再加上。 获得(x、y、z)后,可以使用上面的公式在二维视口上投影


此外,这让我对尝试在CSS中使用3d变换感到好奇。我设置了一个演示它如何工作的程序。没有3d数学!

IMHO,这方面的数学很难,你可以使用3d库,特别是如果你想让相机绕自己的轴旋转的话。如果水平轴是如果屏幕与地面(或天球赤道)平行-以你的参考系为准。是后者,相机只上下左右移动,保持与地面平行。此外,它停止向上看,而不是倒置。我会对推导感兴趣。或者,这方面的文献。