莫顿代码存储3D浮动位置
Morton code to store 3D float postitions
我正在尝试实现本文中解释的内容:http://devblogs.nvidia.com/parallelforall/thinking-parallel-part-iii-tree-construction-gpu/
// Expands a 10-bit integer into 30 bits
// by inserting 2 zeros after each bit.
unsigned int expandBits(unsigned int v)
{
v = (v * 0x00010001u) & 0xFF0000FFu;
v = (v * 0x00000101u) & 0x0F00F00Fu;
v = (v * 0x00000011u) & 0xC30C30C3u;
v = (v * 0x00000005u) & 0x49249249u;
return v;
}
// Calculates a 30-bit Morton code for the
// given 3D point located within the unit cube [0,1].
unsigned int morton3D(float x, float y, float z)
{
x = min(max(x * 1024.0f, 0.0f), 1023.0f);
y = min(max(y * 1024.0f, 0.0f), 1023.0f);
z = min(max(z * 1024.0f, 0.0f), 1023.0f);
unsigned int xx = expandBits((unsigned int)x);
unsigned int yy = expandBits((unsigned int)y);
unsigned int zz = expandBits((unsigned int)z);
return xx * 4 + yy * 2 + zz;
}
当我用提供的示例尝试Morton3D函数时,(0.1010, 0.0111, 0.1100)它返回1479990而不是101011110010。
我是否错过了这里没有解释的东西?
谢谢!- d
你漏掉了两个要点:
-
文章中给出的样本数(0.1010,0.0111,0.1100)实际上是以二进制形式写的。这意味着0.1010 实际上是0.5 + 0.125 = 0.625 , 0.0111是0.25 + 0.125 + 0.0625 = 0.4375 和 0.5 + 0.25 = 0.1100 0.75 。把这些放进去,你会看到
-
示例图中每个组件仅使用4位,在Morton编码中总共使用12位,而实际代码中每个组件使用10位,总共使用30位。所以,在你得到的结果中,忽略结果的前2位,看看其余的位,看看你是否能算出来。
顺便说一下,文章中的代码是正确的,并且做了它所说的。
相关文章:
- 将值指定给向量(2D)的向量中的某个位置
- 使用Unreal C++获取VR耳机的世界位置/方向
- 无法将结构注册为增强几何体3D点
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- OpenGL大的3D纹理(>2GB)非常慢
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 无法获取webot::PositionSensor对象中位置传感器的值
- 如何计算 3d 数组中的索引值在内存中的位置?如何计算字符**中的索引值在内存中的位置?
- 如何根据物体位置和速度,玩家位置和向前矢量计算左耳和右耳的音量?(3D声音)
- 如何在3D世界中获得对象相对于父母的绝对位置
- OPENCV(C ) - 从已知的3D对象和相机位置计算图像的2D坐标
- 在3D世界中的显示器上固定位置绘制2D文本-OpenGL
- 在单目视觉里程计中使用 3D-2D 运动估计的相机位置
- 使用 GLUT 在 3D OpenGL 世界中显示固定位置的 2D 文本
- 3D 几何:从相机位置、最小和最大视角长度、指向角度和视角查找观看边界
- 莫顿代码存储3D浮动位置
- 制作 3D 图形引擎,我的平移矩阵不适用于等于 0 的位置
- 在3D场景中存储模型位置的好方法是什么?