3D等效位图(bmp)

本文关键字:bmp 位图 3D | 更新日期: 2023-09-27 18:11:59

以同样的方式,位图(bmp)只是一个代表白色/黑色或颜色的2维值数组-有人知道类似类型的"结构"为一个简单的3维位图吗?换句话说,一个三维数组的值表示黑/白或颜色?

似乎有很多问题可以用这种"点云"类型的结构相对容易地解决。

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

我明白这个结构在各种向量上不是"有效的"——但是……似乎存在某些问题,似乎会借给自己这样一个3d对象的"模型"。

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

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

3D等效位图(bmp)

除了内存之外,没有什么可以阻止您使用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;
}

如果你有一个非常详细的3D扫描,如MRI或CAT扫描仪,这些结构将是有用的,事实上,从这样的扫描中收集的"切片"基本上是一样的。大多数时候,我们只关心尽可能快地将可见像素放到屏幕上,并且存在更好的结构,例如矢量模型,三角形集合等。

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

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

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

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

使用3D数据数组最常见的问题是它占用了非常多的内存——即使数据适合可用内存,其绝对大小也会使其计算速度变慢。有一些方法可以改进这一点:我相信MIP贴图支持3D纹理,在主处理器端,八叉树可以用来利用稀疏的3D数据。

然而,在许多应用中,3D数组是有意义的,而其他的都没有意义。例如,MRI数据是天然致密的3D信息。

我敢说,根本不存在完善的栅格3D结构格式。虽然栅格数据经常用于现代图形,但它仅限于纹理,凹凸贴图和高度字段;结构总是用向量项定义的。

我敢打赌,这种情况的原因是数据量与模型的比率,有时在2D中有问题,但在3D中显然是不利的。