приведенные ниже коды (переписанные на 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;
}
// ...