将球体上的点映射到鱼眼图像上的像素位置

时间:2016-04-17 21:01:52

标签: c# opengl image-processing graphics

如何将标准化球体(半径0.5,中心0,0,0)上的点映射到鱼眼纹理图像?我使用的是C#语言和OpenGL。结果应该是图像的UV坐标。球体只是球体每个顶点的3D坐标列表,因此每个顶点都会得到一个UV坐标到图像中。

最终结果将是一个完整的球体,鱼眼图像在球体上纹理化时会一直缠绕360度。

鱼眼图像示例:

enter image description here

1 个答案:

答案 0 :(得分:0)

没有一种方法可以映射到球体。你的帖子中的纹理看起来就像接缝会在指定的世界平面上。将其与典型的天幕类型纹理进行比较,其中球体通常连接在底部(相机无法看到连接)。 您可以使用这样的着色器代码来映射基于UV的点:

float3 PointOnSphere(float phi, float theta, float radius)
{
    float3 pos = float3(0, 0, 0);

    pos.x = radius * cos(phi) * sin(theta);
    pos.y = radius * sin(phi) * sin(theta);
    pos.z = radius * cos(theta);

    return pos;
}

或者反过来从表面上的点获取UV:

float2 AngleFromPoint(float3 pos)
{
    float phi = atan(pos.y / pos.x);
    float theta = atan(pos.y / pos.z / sin(phi));
    return(float2(phi, theta));
}

哪种方式起来,接缝连接的地方是你必须自己锻炼的东西。如果纹理看起来是压缩的,因为它是非线性的,您可能需要尝试类似:

texcoord = pow(texcoord, 0.5f);

编辑:显然,将纹理坐标的角度标准化为0 - 1