看待这一点的一种方法是,您的视口位置固定,我们旋转天空,使您视野中的中央恒星直接在您面前。假设您正在向北看,那么这意味着首先将天空旋转中心恒星方位角的负值,使其直接位于您的面前。然后向下旋转天空(围绕东西轴),将中心恒星放在你面前的地平线上。
通过将这两个旋转应用到天空中的所有星星,我们得到了它们所有的新位置,您可以简单地计算它们落在视口上的位置。
又怎样?让我们放置一些坐标。对于 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”有
-
- 将“p”投影到 2D 视口的星星有
-
那么,单位球面上的星“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 数学!