如何将标准化球体(半径0.5,中心0,0,0)上的点映射到鱼眼纹理图像?我使用的是C#语言和OpenGL。结果应该是图像的UV坐标。球体只是球体每个顶点的3D坐标列表,因此每个顶点都会得到一个UV坐标到图像中。
最终结果将是一个完整的球体,鱼眼图像在球体上纹理化时会一直缠绕360度。
鱼眼图像示例:
答案 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