Image processing 将鱼眼映射到球体-360度视图

Image processing 将鱼眼映射到球体-360度视图,image-processing,unity3d,transform,Image Processing,Unity3d,Transform,我正在尝试使用统一的天空球体将鱼眼图像映射到360度视图。场景位于球体内部。我非常接近,但我看到一些轻微的扭曲。我计算UV坐标如下: Vector3 v = currentVertice; // unit vector from edge of sphere, -1, -1, -1 to 1, 1, 1 float r = Mathf.Atan2(Mathf.Sqrt(v.x * v.x + v.y * v.y), v.z) / (Mathf.PI * 2.0f); float phi = Ma

我正在尝试使用统一的天空球体将鱼眼图像映射到360度视图。场景位于球体内部。我非常接近,但我看到一些轻微的扭曲。我计算UV坐标如下:

Vector3 v = currentVertice; // unit vector from edge of sphere, -1, -1, -1 to 1, 1, 1
float r = Mathf.Atan2(Mathf.Sqrt(v.x * v.x + v.y * v.y), v.z) / (Mathf.PI * 2.0f);
float phi = Mathf.Atan2(v.y, v.x);
textureCoordinates.x = (r * Mathf.Cos(phi)) + 0.5f;
textureCoordinates.y = (r * Mathf.Sin(phi)) + 0.5f;
以下是变形和三角形:

整个球体的其余部分看起来很棒,就在这一点我得到了扭曲

以下是源鱼眼图像:

同一个球体顶部带有UV测试纹理,显示相同的变形区域。完整的UV测试纹理在右边,是一个正方形,但为了我的屏幕截图,在右边被拉伸成一个矩形

上面的失真是使用球体贴图而不是鱼眼贴图。以下是使用鱼眼贴图的UV纹理:


数学不是我的强项,我在这里做错了什么吗?或者这种映射不是100%可能的吗?

你看到的地方是r非常接近1的情况。正如您在源图像中看到的,这是非常扭曲的图像数据和黑色之间的边界区域

这个区域非常扭曲,但这不是主要问题。查看结果,您可以看到UV方向存在问题

我在你的源图像中添加了几行文字来说明我的意思。其中r是小的(黄线),您可以看到UV坐标可以在四边形的角之间插值(假设四边形而不是三边形)。但是,如果r较大(红色角点),插值UV坐标将使它们穿过r远小于1(红线)的源图像区域,从而在UV空间中造成扭曲。实际上,这些红线不应该是直的,但它们应该沿着源图像数据的边界移动

你可以通过在你的天空球体区域中有一个更高的polycount来改善这一点,其中r接近1,但只要你的UV以线性方式插值,它就永远不会是完美的


我还发现了另一个问题。如果你仔细观察这个点,你会发现完整的源图像以小的形式出现在那里。这是因为UV坐标在该点环绕。当渲染在查看器周围进行时,uv坐标从0向1移动。在点1处,相邻顶点处于0.001或其他位置,导致整个源图像在两者之间渲染。要解决这个问题,您需要在skysphere的接缝处有两个独立的顶点,一个是球体曲面的起点,另一个是球体曲面的终点。在对象空间中,它们是相同的,但在uv空间中,一个在0,另一个在1。

接缝沿着球体而不是赤道向上延伸,是吗?我应该提到的是,我使用的是一个八角球体,带有三角形而不是四边形,尽管三角形之间确实共享顶点。我还为我的问题添加了一个uv测试纹理,如果这改变了事情或有帮助的话。有两个接缝,一个在u形边界上,一个在v形边界上。不管是三元组还是四元组都不重要,问题应该是一样的。你绝对确定你的第二个截图,即使用uv测试纹理的截图,显示的区域与第一个截图中扭曲的区域相同吗?因为它确实应该显示相同的uv方向问题…增加顶点数确实有助于失真。谢谢你的帮助。