我目前正在为一个网站开发一个简单的 3D 全景图查看器。出于移动性能原因,我使用 Three.js CSS 3 渲染器。这需要一个立方体贴图,分成六个单独的图像。
我正在使用 Google Photo Sphere 或创建 2:1 等距柱状全景图的类似应用程序在 iPhone 上录制图像。然后,我使用此网站调整大小并将它们转换为立方体贴图:http: //gonchar.me/panorama/ (Flash)
最好,我想 _自己进行转换,如果可能的话,可以在 Three.js 中即时进行,也可以在 Photoshop 中进行。我找到了 Andrew Hazelden 的 Photoshop 动作,它们看起来有点接近,但不能直接转换。有没有一种数学方法来转换这些,或者某种脚本呢?如果可能的话,我想避免使用像 [Blender](https://en.wikipedia.org/wiki/Blender%28software%29) 这样的 3D 应用程序。
也许这是一个远景,但我想我会问。我对 JavaScript 有很好的经验,但我对 Three.js 还很陌生。我也对依赖 WebGL 功能犹豫不决,因为它在移动设备上看起来不是很慢就是有问题。支持也仍然参差不齐。
原文由 oelna 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果你想在服务器端做,有很多选择。 ImageMagick 有一堆命令行工具,可以将您的图像切成碎片。您可以将执行此操作的命令放入脚本中,并在每次有新图像时运行它。
很难说清楚程序中使用了什么算法。我们可以尝试通过将正方形网格输入程序来对正在发生的事情进行逆向工程。我使用了 维基百科的网格:
这使:
这给了我们关于盒子是如何构造的线索。
想象一个上面有经纬度线的球体,以及一个围绕它的立方体。现在从球体中心的点进行投影会在立方体上产生扭曲的网格。
在数学上,取极坐标 r, θ, ø,对于球体 r=1, 0 < θ < π, -π/4 < ø < 7π/4
将这些集中投影到立方体。首先我们按纬度划分为四个区域-π/4 < ø < π/4, π/4 < ø < 3π/4, 3π/4 < ø < 5π/4, 5π/4 < ø < 7π/4。这些将投射到顶部或底部的四个侧面之一。
假设我们在第一边 -π/4 < ø < π/4。 (sin θ cos ø, sin θ sin ø, cos θ) 的中心投影将是 (a sin θ cos ø, a sin θ sin ø, a cos θ) 当
所以
投影点是
如果 | cot θ / cos ø | < 1,这将在正面。否则,它将投影在顶部或底部,您将需要一个不同的投影。更好的顶部测试使用 cos ø 的最小值将是 cos π/4 = 1/√2 的事实,因此如果 cot θ / (1/√2) > 1 或投影点始终位于顶部tan θ < 1/√2。计算结果为 θ < 35º 或 0.615 弧度。
将它们放在 Python 中:
projection
函数采用theta
和phi
值并返回立方体中每个方向从 -1 到 1 的坐标。 cubeToImg 获取 (x,y,z) 坐标并将它们转换为输出图像坐标。上面的算法似乎使用 白金汉宫的图像 得到了正确的几何图形。我们得到:
这似乎使铺路中的大部分线条正确。
我们得到了一些图像人工制品。这是因为没有一对一的像素映射。我们需要做的是使用逆变换。我们不是循环遍历源中的每个像素并找到目标中的对应像素,而是循环遍历目标图像并找到最接近的对应源像素。
结果是:
如果有人想反过来,请参阅 此 JS Fiddle 页面。