使用 three.js,您将如何将地球世界投影到屏幕上的地图上?
Using three.js, how would you project a globe world to a map on the screen?
我很好奇three.js的极限。以下问题主要是作为挑战提出的,而不是因为我实际上需要马上就得到特定的 knowledge/code。
假设您有一个 game/simulation 世界模型,它围绕着一个代表行星的球体几何体,就像游戏 Populous 中的世界一样。当球体充满普通相机的视野时,多边形和纹理的分辨率足以看起来很平滑。表面有动态的宏观物体。
挑战在于将模型中的所有内容实时投影到屏幕上的全球地图投影。投影的选择是你的,但它必须是 seamless/continuous,并且用户必须可以旋转它,将行星表面上的任何点放置在屏幕的中心。 (仅出于可视化目的维护世界的替代模型不是一种选择。)
对允许的摄像头等数量没有限制,但性能必须达到 "realtime",比如两位数 FPS 或更高。
我不希望以 运行 应用程序的形式提供 ayn 证明(尽管那会很酷),但会提供一些关于如何完成的解释。
我自己最初的想法是放置很多相机,实际上是地图投影中的每个像素一个,在全球范围内,在附加到某种轨道控件(仅旋转)的组对象中,但我预计对象剔除操作的数量将成为一个巨大的性能问题。我确信必须存在更优雅(和更快)的解决方案。 :-)
为什么不直接使用球形相机模型(想想 360° 相机)并将其虚拟地放在球体的中心?所以这个相机会(如果物理上可行的话)环绕球体,从各个方向看向中心。
这个相机可以在着色器中实现(而不是常规的投影矩阵)并且会产生行星表面的等距柱状图像(或者实际上你想要的任何其他投影,比如球形墨卡托投影)。
据我所知,顶点着色器可以实现您想要的任何投影,并且它不需要表示物理上可能的相机。它只需要为所有顶点生成一致的 clip-space 坐标。用于照明的片段着色器仍然需要在原始坐标、法线等上运行,但这应该是可以实现的。所以顶点着色器只需要计算 (x,y,z) => (phi,theta,r)
并继续计算。
需要禁用遮挡剔除,但 iirc three.js 不会那样做。
我很好奇three.js的极限。以下问题主要是作为挑战提出的,而不是因为我实际上需要马上就得到特定的 knowledge/code。
假设您有一个 game/simulation 世界模型,它围绕着一个代表行星的球体几何体,就像游戏 Populous 中的世界一样。当球体充满普通相机的视野时,多边形和纹理的分辨率足以看起来很平滑。表面有动态的宏观物体。
挑战在于将模型中的所有内容实时投影到屏幕上的全球地图投影。投影的选择是你的,但它必须是 seamless/continuous,并且用户必须可以旋转它,将行星表面上的任何点放置在屏幕的中心。 (仅出于可视化目的维护世界的替代模型不是一种选择。)
对允许的摄像头等数量没有限制,但性能必须达到 "realtime",比如两位数 FPS 或更高。
我不希望以 运行 应用程序的形式提供 ayn 证明(尽管那会很酷),但会提供一些关于如何完成的解释。
我自己最初的想法是放置很多相机,实际上是地图投影中的每个像素一个,在全球范围内,在附加到某种轨道控件(仅旋转)的组对象中,但我预计对象剔除操作的数量将成为一个巨大的性能问题。我确信必须存在更优雅(和更快)的解决方案。 :-)
为什么不直接使用球形相机模型(想想 360° 相机)并将其虚拟地放在球体的中心?所以这个相机会(如果物理上可行的话)环绕球体,从各个方向看向中心。
这个相机可以在着色器中实现(而不是常规的投影矩阵)并且会产生行星表面的等距柱状图像(或者实际上你想要的任何其他投影,比如球形墨卡托投影)。
据我所知,顶点着色器可以实现您想要的任何投影,并且它不需要表示物理上可能的相机。它只需要为所有顶点生成一致的 clip-space 坐标。用于照明的片段着色器仍然需要在原始坐标、法线等上运行,但这应该是可以实现的。所以顶点着色器只需要计算 (x,y,z) => (phi,theta,r)
并继续计算。
需要禁用遮挡剔除,但 iirc three.js 不会那样做。