【问题标题】:HEALPix with texture UV mapping带有纹理 UV 映射的 HEALPIx
【发布时间】:2021-02-05 12:43:03
【问题描述】:

我找到了一个 HEALpix 算法的实现this is the dokumentation 而且输出看起来很不错。

下图显示了经纬度到 HEALpix 区域的转换。 x 轴从 0 变为 2 * pi。 y 轴从 0 到 pi。灰色表示以灰色编码的 HEALpix 像素。

Nside = 1

Nside = 2

Nside = 4

Nside = 8

不同的灰度值是我必须使用的纹理的 ID。这意味着,每个 HEALpix 像素代表一个纹理。缺少的部分是每个 HEALpix 像素内的 UV 映射,如下所示:

nSide = 1 带 UV 映射

现在我正在使用该功能:

void ang2pix_ring( const long nside, double theta, double phi, long *ipix)

这给了我正确的纹理 ID。但我不知道如何计算每个 HEALpix 像素的 UV 映射。 有没有办法计算 HEALpix 像素的纬度/经度坐标中的所有四个角?还是直接计算 UV 坐标更好?

顺便说一句:我正在使用 RING 方案。但如果 NESTED 方案计算起来更简单,我也会改成这样。

【问题讨论】:

    标签: uv-mapping


    【解决方案1】:

    经过大量研究,我找到了解决这个问题的方法:

    首先,我已将方案更改为 NESTED。使用 NESTED 方案和非常高的 nSide 值(8192),从

    void ang2pix_ring( const long nside, double theta, double phi, long *ipix)
    

    函数返回一个长值,可以通过以下方式读取 UV 坐标:

    位 26 到 30 表示级别 0(仅 12 个 HEALPix 像素)。

    通过使用更高的级别,从 30 到 26 的位(级别 * 2)代表 HEALPix 像素。

    剩余的 26 - (level * 2) - 1 直到 bit 1 以下列方式对 UV 纹理坐标进行编码:

    每第二个奇数位收缩在一起表示 U 坐标,偶数一次表示 V 坐标。 为了标准化这些 UV 坐标,响应的收缩值需要除以 pow(2, (26 - level * 2) / 2) 的值。

    代码超过 1000 个单词:

    unsigned long ignoreEverySecondBit(unsigned long value, bool odd, unsigned int countBits)
    {
        unsigned long result = 0;
        unsigned long mask = odd == true ? 0b1 : 0b10;
        countBits = countBits / 2;
        for (int i = 0; i < countBits; ++i)
        {
            if ((value & mask) != 0)
            {
                result += std::pow(2, i);
            }
            mask = mask << 2;
        }
    
        return result;
    }
    
    
    //calculate the HEALPix values:
    latLonToHealPixNESTED(nSide, theta, phi, &pix);
    
    result.level = level;
    result.texture = pix >> (26 - level * 2);
    result.u = static_cast<float>(ignoreEverySecondBit(pix, true, 26 - level * 2));
    result.v = static_cast<float>(ignoreEverySecondBit(pix, false, 26 - level * 2));
    
    result.u = result.u / pow(2, (26 - level * 2) / 2);
    result.v = result.v / pow(2, (26 - level * 2) / 2);
    

    还有一些图片可以显示结果。蓝色值代表textureID,红色值代表U坐标,绿色值代表V坐标:

    0级

    1 级

    2级

    3 级

    4级

    我希望这个解决方案也能对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-12-21
      • 2018-07-14
      • 1970-01-01
      • 2019-08-08
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 2014-12-14
      相关资源
      最近更新 更多