使用两个浮点数存储 3D 法向量的有效方法
Efficient way to store 3D normal vector using two floats
我需要存储 3D 法向量,即 (x, y, z)
满足 x^2 + y^2 + z^2 = 1
的向量。但是由于 space 限制,我只能使用 2 个浮点数来存储它。
因此,通过仅存储 x
和 y
,第三个分量可以计算为 sqrt(1 - x^2 - y^2)
,即一个平方根、两个乘积和两个减法。
存储向量的最有效方法是什么,以便尽可能快地读取它们,并且尽可能不偏向一个空间方向?
编辑
现在将值 (a, b)
与 a = x - y
和 b = x + y
一起使用。
您可以通过球坐标存储向量来满足您的 space 约束。众所周知,单位球面上的每个点,即每个单位向量,至少有一对球坐标来表征它。
或者如果你想要一些复杂的东西:复杂的平方函数将单位圆盘映射到它的双覆盖。所以你可以用左半圆盘做上半球,右半圆盘做下半球。
SphereFromDisk(a,b)
a2=a*a; b2=b*b; r2=a2+b2; // assert r2 <= 1
x = a2 - b2;
y = 2*a*b
z = sqrt(1-r2*r2)
if(a<0 or (a=0 and b<0) z=-z
return (x,y,z)
我需要存储 3D 法向量,即 (x, y, z)
满足 x^2 + y^2 + z^2 = 1
的向量。但是由于 space 限制,我只能使用 2 个浮点数来存储它。
因此,通过仅存储 x
和 y
,第三个分量可以计算为 sqrt(1 - x^2 - y^2)
,即一个平方根、两个乘积和两个减法。
存储向量的最有效方法是什么,以便尽可能快地读取它们,并且尽可能不偏向一个空间方向?
编辑
现在将值 (a, b)
与 a = x - y
和 b = x + y
一起使用。
您可以通过球坐标存储向量来满足您的 space 约束。众所周知,单位球面上的每个点,即每个单位向量,至少有一对球坐标来表征它。
或者如果你想要一些复杂的东西:复杂的平方函数将单位圆盘映射到它的双覆盖。所以你可以用左半圆盘做上半球,右半圆盘做下半球。
SphereFromDisk(a,b)
a2=a*a; b2=b*b; r2=a2+b2; // assert r2 <= 1
x = a2 - b2;
y = 2*a*b
z = sqrt(1-r2*r2)
if(a<0 or (a=0 and b<0) z=-z
return (x,y,z)