2

就像位图 (bmp) 只是代表白色/黑色或颜色的二维值数组一样 - 有人知道简单的 3 维位图的类似“结构”类型吗?换句话说,代表黑色/白色或颜色的 3 维值数组?

似乎有各种各样的问题可以通过这种“点云”类型的结构相对容易地解决。

换句话说,在不涉及整个 3d 渲染世界的情况下,一些问题似乎可以通过更简单的数据结构来解决,并且比通常有效管理 3d 对象(使用 OpenGL、DirectX、Axiom、GDI+ 等)所涉及的数学要少得多。

我知道这种结构在各种向量上不会“有效” - 但是......似乎可能存在某些问题似乎适合于这样一个 3d 对象的“模型”。

拥有一种算法来从其他 3d 文件类型(如 STL、Mesh、POV、BLEND 等)生成这样的点云也会很有帮助)。也许其中一个已经是这样的结构?(新手):)

非常感谢任何建议或信息。提前致谢。

4

3 回答 3

5

没有什么可以阻止您使用 3D 数字数组来存储像素数据,除了存储它的内存。像这样:

struct Pixel {
    int Red;
    int Green;
    int Blue;
}

public Pixel[,,] myPix3D = new Pixel[300, 300, 300];

那就是“位图的 3D 等价物”

或者,您可以存储每个像素及其位置,以节省内存。这样,您就不会在对象中存储任何空白空间。

struct Pixel {
    int Red;
    int Green;
    int Blue;
    double X;
    double Y;
    double Z;
}

如果您从诸如 MRI 或 CAT 扫描仪之类的设备进行非常详细的 3D 扫描,这些结构将很有用,事实上,此类扫描的“切片”集合基本上是相同的。大多数时候,我们只关心尽可能快地将可见像素放在屏幕上,并且存在更好的结构,例如矢量模型、三角形集合等。

存储 3D 图像的另一种方法,实际上经常使用,是深度图。对于每个像素,您存储一个值,指示它与“屏幕”或投影表面的距离有多近,并且在随后的绘图操作中,您会跳过任何深度大于当前像素的像素,因为它不会可见的。(也称为 Z 缓冲)

另请注意,当我们进行实际渲染 3D 对象的过程时,我们会首先在 3D 空间中创建它们 - 但我们通常不会对这些对象进行纹理映射,因此“内存中”表示暂时是您的对象类型谈论但位图总是包含所有像素,我们并不总是需要它,所以我们不会将实体对象渲染到 3D 空间中,只渲染线框。大多数图形引擎在将临时 3D 空间投影到 2D 之后应用纹理,并且已经应用​​了许多优化。

您可以使用该中间步骤在 3D 空间中创建您的点,但是当我们感兴趣的只是渲染 2D 图像时,这样做效率不高。如果您对 3D 位图有一些用途,它可以很容易地从已投影到 3D 空间的线框模型创建。

于 2013-05-03T22:08:16.677 回答
4

标准光栅化硬件和 API 原生支持 3D 纹理。请注意,“点云”不是指任何类型的 3D 栅格——相反,点云只是点的非结构化集合。

使用 3D 数据数组最常见的问题是它需要大量内存——即使数据适合可用内存,其庞大的大小也会使其计算速度变慢。有一些改进的方法:我相信 3D 纹理支持 MIP 贴图,并且在主处理器方面,八叉树可用于利用稀疏的 3D 数据。

但是,在许多应用中 3D 阵列是有意义的,而其他的则没有。例如,MRI 数据自然是密集的 3D 信息。

于 2013-05-03T22:39:20.357 回答
-1

AFAIK 不存在完善的栅格3D结构格式。虽然栅格数据经常用于现代图形,但仅限于纹理、凹凸贴图和高度场;结构始终以向量形式定义。

我敢打赌,这种情况的原因是数据量 x 模型比率,有时在 2D 中存在问题,但在 3D 中显然处于劣势。

于 2013-05-03T22:16:44.063 回答