Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将球体上的点映射到鱼眼图像上的像素位置_C#_Opengl_Image Processing_Graphics - Fatal编程技术网

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

C# 将球体上的点映射到鱼眼图像上的像素位置,c#,opengl,image-processing,graphics,C#,Opengl,Image Processing,Graphics,如何将标准化球体(半径为0.5,中心为0,0,0)上的点映射到鱼眼纹理图像?我使用的是C语言和OpenGL。结果应该是图像的UV坐标。球体只是球体每个垂直方向的3D坐标列表,因此每个坐标都会在图像中获得UV坐标 最终结果将是一个完整的球体,当对球体进行纹理处理时,鱼眼图像将环绕360度 鱼眼图像示例: 映射到球体没有单一的方法。文章中的纹理看起来像是指定世界平面中的接缝。将其与典型的skydome类型纹理进行比较,其中球体通常在底部连接(相机无法看到连接)。 可以使用如下着色器代码基于UV映射点

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

最终结果将是一个完整的球体,当对球体进行纹理处理时,鱼眼图像将环绕360度

鱼眼图像示例:


映射到球体没有单一的方法。文章中的纹理看起来像是指定世界平面中的接缝。将其与典型的skydome类型纹理进行比较,其中球体通常在底部连接(相机无法看到连接)。 可以使用如下着色器代码基于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

我插入了AngleFromPoint,但得到的图像非常扭曲。AngleFromPoint的输入只是球体上的一个顶点吗?AngleFromPoint将以弧度返回角度。如果只设置输出颜色,则可以确认坐标:color=float4(φ,θ,0,1);它应该显示红色到绿色到黄色,而不是黑色或黄色的大片