如何将球面坐标投影到canvas上

我有坐标面坐标系统(高度alt和azmiuth az)的对象。 我想把这些投影到我的canvas上(128 x 128像素²)和分辨率(约6 px /°)。

canvas从内部看球体,可以在alt,az和正常球体周围旋转。 canvas法线方向与对象在同一坐标系中是已知的,并且视图以canvas中心为中心。

如何在canvas上find对象的x和y位置? 我知道这与正交(或类似)地图投影几乎相同,但是我发现的例子都有一个固定在alt = 0的视图。这不是我在这里所知道的,我很难理解这一点。

我不能使用任何现成的投影工具,因为我在编程一个embedded式系统。 gamedev的现有问题似乎围绕着提供这种function的框架。


正如DMGregory指出的,我需要一个简单的透视投影matrix来进行全局投影 。 维基百科也有一篇关于透视(照相机)投影的文章,我会试着实现它,看看它是否做我需要的东西。

    在游戏中,我们经常使用各种坐标空间。 几何在模型空间中定义。 不同的对象不必共享相同的模型空间。 然后使用变换matrix将坐标转换为世界空间 。 通常这只是平移和/或旋转matrix的组合,但也可以包括比例缩放,甚至非仿射变换。

    通常场景中的所有东西都被认为存在于相同的笛卡尔世界空间中。 然后使用另一个变换,称为视图变换,表示相机的位置和方向。 这导致了眼睛空间 (也称为相机空间),即Z轴表示相机正在“看”的方向的笛卡尔空间。

    直到现在,我们还没有考虑到相机或眼睛镜头的性质。 照相机通常试图以与人眼相同的方式使用称为直线透视投影的东西来对世界进行成像。 我们在这一步使用另一个matrix,称为投影变换 。 现在,透视投影不能仅仅使用4×4变换matrix来实现。 我们还需要另外一个步骤,称为透视分界 ,用W来分隔X,Y和Z坐标,使远处的物体变小。 这给了我们所谓的标准化设备坐标 (NDC),通常乘以canvas的宽度和高度以产生屏幕空间 (在技术上这被称为视口变换 )。

    除此之外,在游戏中我们还有其他的事情需要担心。 法线可能需要与点和切线不同地进行变形,而我们经常需要能够扭转上述的所有操作,例如知道玩家点击什么。 名单可以继续,但没有一个听起来像适用于你的情况。

    如果你希望它看起来像是在一个看着它在表面内的球体*,那么模型转换就从球面转换到笛卡尔世界坐标(你不能用变换matrix来做这个,但是这里可以使用公式) 。 视图变换旋转相机,投影变换处理透视计算。 后两者可以合并成一个4×4matrix。 然后,在转换为笛卡尔坐标之后,将每个顶点的matrix相乘 – 但不要忘记透视分割和视口计算!


    *在这种情况下,这被称为Gnomonic投影 。 (感谢DMGregory!)