我很好奇three.js的限制。以下问题主要被视为挑战,而不是因为我实际上需要立即获得特定的知识/代码。
假设你有一个围绕代表行星的球体几何体的游戏/模拟世界模型,就像游戏Populous的世界一样。当地球填充普通相机的视图时,多边形和纹理的分辨率足以看起来平滑。表面上有动画宏观物体。
挑战在于实时投影从模型到屏幕上的全局地图投影的所有内容。投影的选择是你的,但它必须是无缝的/连续的,并且用户必须能够旋转投影,将行星表面上的任何点放置在屏幕的中心。 (仅仅为了可视化而维护世界的替代模型不是一种选择。)
对于允许的摄像机数量没有限制,但性能必须是“实时”,比如两个FPS或更高。
我不希望以正在运行的应用程序的形式提供ayn证明(尽管这很酷),但是可以解释它是如何完成的。
我自己最初的想法是在地球投影中的每个像素上放置大量相机,实际上是一个相应于某种轨道控件(仅限旋转)的Group对象中的一个,但是我预计对象剔除操作的数量将成为一个巨大的性能问题。我相信必须存在更优雅(和更快)的解决方案。 : - )
答案 0 :(得分:1)
为什么不使用球形相机模型(想想360°相机)并将其虚拟地放在球体的中心?因此,这个相机(如果它在物理上是可能的)将被包裹在整个球体周围,从各个方向看向中心。
这个相机可以用着色器(而不是常规投影矩阵)实现,并且会产生行星表面的等角图像(或者实际上你想要的任何其他投影,如球形墨卡托投影)。
据我所知,顶点着色器可以实现您想要的任何投影,并且它不需要代表物理上可能的相机。它只需要为所有顶点生成一致的剪辑空间坐标。用于照明的片段着色器仍然需要在原始坐标,法线等上操作,但这应该是可实现的。所以顶点着色器只需要计算(x,y,z) => (phi,theta,r)
并继续使用它。
需要禁用遮挡剔除,但无论如何iirc three.js都不会这样做。