• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

直角坐标系转球坐标系 Equirectangular 理解 代码 Unity

武飞扬头像
目竞
帮助1

IBL相关,得到dir后需要从HDR图采样,但HDR图是Equirectangular Map,所以需要将dir转球坐标系(得到经纬)再转UV。

从定义到实现都有很多约定俗成的东西,记录一下。

由于代码实现需要固定phi的范围。发现需要按符号分类处理,分类其实挺麻烦的。于是到网上找“标准”做法。

学新通

学新通

学新通 这里不能用数学上的标准arctan函数,得改造一下用atan2,它长这样:

 学新通

 学新通

幸好,hlsl实现了atan2。

所以代码是:

  1.  
    //x: phi [0,2PI)
  2.  
    //y: theta [0,PI]
  3.  
    //z: r
  4.  
    //https://www.gamedev.net/forums/topic/602211-fast-way-to-get-spherical-coordinates/
  5.  
    float3 CartesianToSpherical(in float3 xyz)
  6.  
    {
  7.  
    float r = length(xyz);
  8.  
    xyz *= 1.f / r;
  9.  
    float theta = acos(xyz.z);
  10.  
     
  11.  
    float phi = atan2(xyz.y, xyz.x); //atan2 [-PI,PI]
  12.  
    phi = (phi < 0) ? 2 * PI : 0;
  13.  
     
  14.  
    return float3(phi, theta, r);
  15.  
    }
学新通

由于Unity的坐标系和数学常用的坐标系不同,又因为我们要以垂直方向为极轴,获得Equirectangular Map的UV。所以转球系之前,得先把坐标从Unity系转一下到标准系:

学新通

  1.  
    float3 XYZ_StandardFromUnity(float3 p)
  2.  
    {
  3.  
    p.z = -p.z;
  4.  
    p.xyz = p.xzy;
  5.  
    return p;
  6.  
    }
  7.  
     
  8.  
    float2 EquirectangularToUV(float3 dir)
  9.  
    {
  10.  
    float2 uv = 0;
  11.  
    dir = normalize(dir);
  12.  
    dir = XYZ_StandardFromUnity(dir);
  13.  
    //!!!
  14.  
    //由于转球系是需要有x,y,z规定的,
  15.  
    //所以要先转成标准方向
  16.  
    // get theta phi from x, y comp (phi [0,2PI) theta [0,PI] )
  17.  
    float3 sphereCoord = CartesianToSpherical(dir);
  18.  
    ...
  19.  
    }
学新通

 合

最后归一化经纬,就得到UV了。

  1.  
    float2 EquirectangularToUV(float3 dir)
  2.  
    {
  3.  
    ...
  4.  
    uv.x = sphereCoord.x;
  5.  
    uv.x /= 2 * PI;
  6.  
     
  7.  
    uv.y = sphereCoord.y;
  8.  
    uv.y /= PI;
  9.  
     
  10.  
    uv = saturate(uv);
  11.  
    uv.y = 1 - uv.y;
  12.  
    return uv;
  13.  
    }

最后看下结果,nice。

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfieija
系列文章
更多 icon
同类精品
更多 icon
继续加载