我想从立方体贴图[图1]转换成等矩形全景图[图2]。
图1
图2
可以从球形到立方(通过以下方式):Convert 2:1 equirectangular panorama to cube map),但失去了如何扭转它。
图2将使用Unity渲染成一个球体。
我想从立方体贴图[图1]转换成等矩形全景图[图2]。
图1
图2
可以从球形到立方(通过以下方式):Convert 2:1 equirectangular panorama to cube map),但失去了如何扭转它。
图2将使用Unity渲染成一个球体。
3条答案
按热度按时间dffbzjpn1#
假设输入图像为以下cubemap格式:
目标是将图像投影为等矩形格式,如下所示:
转换算法相当简单。为了计算等距矩形图像中每个像素的颜色的最佳估计,给定一个有6个面的立方体图:
请记住,在给定归一化坐标的情况下,有多种方法可以估计等距矩形图像中像素的颜色(u,v)。最基本的方法是一个非常原始的近似,为了简单起见,将在这个答案中使用,其他更高级的方法可以计算几个相邻像素的平均值。
算法的实现将根据上下文而有所不同。我在Unity3D C#中做了一个快速实现,展示了如何在真实的世界的场景中实现算法。它在CPU上运行,有很大的改进空间,但很容易理解。
为了利用GPU,我创建了一个着色器来进行相同的转换。它比在CPU上逐像素运行转换要快得多,但不幸的是Unity对立方体贴图施加了分辨率限制,因此它的用处在使用高分辨率输入图像的情况下受到限制。
通过在转换期间采用更复杂的方法来估计像素的颜色或通过对结果图像进行后处理(或实际上两者),可以大大提高结果图像的质量。例如,可以生成较大尺寸的图像以应用模糊滤波器,然后将其下采样到所需的尺寸。
我创建了一个简单的Unity项目,其中包含两个编辑器向导,展示了如何正确使用C#代码或上面显示的着色器。https://github.com/Mapiarz/CubemapToEquirectangular
请记住在Unity中为输入图像设置正确的导入设置:
kq0g1dla2#
cube2sphere自动执行整个过程。示例:
jei2mxaa3#
Bartosz的答案是可行的,但是当编译器优化将单位向量除法转换为逆乘法时,他的代码中存在数值不稳定性。该操作的结果可能不完全是1.0,导致IF失败(众所周知,浮点数不喜欢在数学运算后使用==)。
此问题的修复方法是将IF更改为与+/- a进行比较。
此外,对于优化,
sin(theta)
和cos(theta)
可以在内循环外部预先计算。另一个问题是,这段代码不做插值。我建议实现它,以便有更好的图像质量。我使用双三次插值,除了边缘的瓷砖。工作得很好。