математика нормального сжатия - PullRequest
0 голосов
/ 29 октября 2018

приведенные ниже коды (переписанные на C #) используются для сжатия нормального вектора единицы из Wild Magic 5.17 , может кто-нибудь объяснить какие-то математические соображения или поделиться некоторыми связанными ссылками? Я могу понять настройку битов октанта, но упаковка и распаковка мантиссы кажутся сложными ...

Суть кода

некоторые коды здесь

// ...

public static ushort CompressNormal(Vector3 normal)
{
    var x = normal.x;
    var y = normal.y;
    var z = normal.z;
    Debug.Assert(MathUtil.IsSame(x * x + y * y + z * z, 1));

    // Determine octant.
    ushort index = 0;

    if (x < 0.0)
    {
        index |= 0x8000;
        x = -x;
    }
    if (y < 0.0)
    {
        index |= 0x4000;
        y = -y;
    }
    if (z < 0.0)
    {
        index |= 0x2000;
        z = -z;
    }

    // Determine mantissa.
    ushort usX = (ushort)Mathf.Floor(gsFactor * x);
    ushort usY = (ushort)Mathf.Floor(gsFactor * y);
    ushort mantissa = (ushort)(usX + ((usY * (255 - usY)) >> 1));
    index |= mantissa;

    return index;
}

// ...

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Я спросил мистера Эберли (автора «Дикой магии»), и он дает ссылку, вкратце, приведенные выше коды пытаются сопоставить (x, y) с индексом треугольного массива (индекс от 0 до N * (N + 1) / 2 - 1)

enter image description here

подробности в документе здесь, Кстати, другое решение здесь с другим методом сжатия.

0 голосов
/ 30 октября 2018

Автор хотел использовать 13 бит.
Тривиальный способ: 6 битов для компонента x + 6 битов для y - занимает всего 12 битов, поэтому он изобрел подход для назначения ~ 90 (lsb) единиц для x и и ~ 90 (msb) единиц для y ( 90 * 90 ~ 2 ^ 13).

Я понятия не имею, почему он использует квадратичную формулу для y-компонента - этот способ дает немного другое распределение аппроксимированных значений между меньшими и большими значениями - но почему конкретно для y?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...