使用three.js,您将如何将全球世界投影到屏幕上的地图上?

使用three.js,您将如何将全球世界投影到屏幕上的地图上?,three.js,map-projections,Three.js,Map Projections,我对three.js的限制很好奇。下面的问题主要是作为一个挑战而提出的,不是因为我实际上需要立即了解具体的知识/代码 假设您有一个游戏/模拟世界模型,该模型围绕一个球体几何体,表示一个行星,就像游戏中的世界一样。当球体填充普通摄影机的视图时,多边形和纹理的分辨率足以使其看起来平滑。曲面上有已设置动画的宏观对象 面临的挑战是将从模型到全局地图投影的所有内容实时投影到屏幕上。您可以选择投影,但投影必须是无缝/连续的,用户必须能够旋转投影,将行星表面上的任何点放置在屏幕中心。(仅为可视化而维护世界的替

我对three.js的限制很好奇。下面的问题主要是作为一个挑战而提出的,不是因为我实际上需要立即了解具体的知识/代码

假设您有一个游戏/模拟世界模型,该模型围绕一个球体几何体,表示一个行星,就像游戏中的世界一样。当球体填充普通摄影机的视图时,多边形和纹理的分辨率足以使其看起来平滑。曲面上有已设置动画的宏观对象

面临的挑战是将从模型到全局地图投影的所有内容实时投影到屏幕上。您可以选择投影,但投影必须是无缝/连续的,用户必须能够旋转投影,将行星表面上的任何点放置在屏幕中心。(仅为可视化而维护世界的替代模型不是一个选项。)

允许的摄像机数量没有限制,但性能必须是“实时的”,比如两个数字FPS或更多

我不希望ayn以运行应用程序的形式进行证明(尽管那会很酷),但需要一些关于如何实现的解释


我自己最初的想法是在全球范围内的一组对象中放置大量摄影机,事实上,地图投影中的每个像素都有一个摄影机,该组对象连接到某种轨道控制(仅旋转),但我预计对象剔除操作的数量将成为一个巨大的性能问题。我相信一定会有更优雅(更快)的解决方案。:-)

为什么不使用一个球形摄像机模型(比如360°摄像机)并将其虚拟放置在球体的中心?所以这个相机(如果物理上可能的话)会被包裹在球体周围,从各个方向看向中心

该相机可以在着色器(而不是常规投影矩阵)中实现,并将生成行星表面的等矩形图像(或者实际上是您想要的任何其他投影,如球形墨卡托投影)

据我所知,顶点着色器可以实现您想要的任何投影,并且不需要表示物理上可能的摄影机。它只需要为所有顶点生成一致的剪辑空间坐标。用于照明的片段着色器仍然需要在原始坐标、法线等上操作,但这应该是可以实现的。所以顶点着色器只需要计算
(x,y,z)=>(φ,θ,r)
,然后继续


遮挡消隐需要禁用,但iirc three.js无论如何都不会这样做。

如果您需要从球体重新投影到贴图,我猜您做错了。当你们在球体上放置物体时,你们已经知道它们在地图上的位置(比如说,纬度/经度),所以你们可以从中形成平面地图。谢谢你们的回答。嗯,我意识到我需要更多关于顶点着色器的基本知识来理解这个答案。我正在考虑接受你的答案,因为乍一看,这似乎是一个由懂3D图形的人提出的可行方法。你对这种方法有信心吗,还是更像是一种有根据的猜测?这会实时执行吗?您以前是否使用顶点着色器进行过奇怪的投影,或者使用顶点着色器定义过自定义摄影机?好吧,有一个缺点是投影并不像常规投影矩阵那样真正描述视图体积变换。这带来了一个问题,即必须有一条横跨地球的缝线,该缝线将由地图的左边缘和右边缘表示。穿过这条线的三角形将跨越整个地图的宽度,需要首先丢弃。但这可能是可以通过某种方式解决的。这不是我实际编写的东西,但与常规渲染相比,它应该可以在不影响性能的情况下实现。