2

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

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

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

4

1 回答 1

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 平面上非常简单:

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

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

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

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

所以这很简单,对;)。

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

认为:

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

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

于 2013-11-29T01:14:27.013 回答