星球 - 从球体到2D的投影点

时间:2013-11-15 10:50:28

标签: 3d geometry projection

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

天空表示为(半)球,星星位于其表面,观察者坐在"在球体的中心。我有星星的坐标和视图方向(全部在3D中,作为球体表面上的点[赤纬:0-90 =地平线 - 北极,方位角:0-360])。我也有视口(2D)的大小。当视图方向等于星形坐标时,星形投影到视口的中心,但是对于所有其他点,会出现一些变形"变形"鉴于他们是在球面上。

根据球体坐标和视图方向计算视口中星形位置的公式是什么? (我想那里还会涉及一些额外的参数......)

1 个答案:

答案 0 :(得分:2)

查看此内容的一种方法是将视口固定在适当的位置,然后旋转天空,使视图中的中心星直接位于您的前方。假设您向北看,那意味着首先通过中心星的方位角的负面旋转天空将其直接放在您面前。然后向下旋转天空(围绕东西轴),将中心星放在你面前的地平线上。

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

那怎么样?让我们放置一些坐标。对于3D空间,让我们说你正面临“北方”,我们会说这是正x方向。它们y轴指向东方,z轴指向上方。你的眼睛在(0,0,0)。对于2D视口,我们将说视口的中心位于(0,0),s轴指向右侧,t轴指向上方。我可以将这些3D视口称为x和y轴,但是3D空间具有x,y和z轴,重新使用轴名称会非常快速地混淆。因此,只需将3D空间视为(x,y,z),将2D空间视为(s,t)。

视口本身平行于3D空间的yz平面,因此垂直于其x轴,并且它与x轴相交(例如,e,0,0),因此基本上e是视口的距离你的眼睛。

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

viewport coords =( - yy / x,ez / x)。

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

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

  • 缩放,使视口的宽度和高度与像素宽度和高度相匹配。
  • 将一半像素宽度和高度添加到(s,t)坐标。这样,视口(0,0)的中心映射到屏幕的中心(宽度/ 2,高度/ 2)。
  • 翻转y坐标(因为屏幕左上角有(0,0),而左下角有)。这只是y = height - y;

所以这很简单,对吧;)。

困难的部分是弄清楚每个恒星的坐标以及当你旋转那个中央恒星时它们映射到的位置。

假设:

  • 中央明星“c”有
    • azimuth = azc
    • declination = dec
  • 将“p”投影到2D视口上的星标
    • azimuth = azp
    • declination = 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),就可以使用上面的公式在2D视口上投影。

此外,这让我对尝试在CSS中使用3d变换感到好奇。我设置star web page来演示它是如何工作的。没有3D数学!

相关问题