3D等效位图(bmp)

时间:2013-05-03 21:59:36

标签: c# graphics 3d

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

似乎存在各种问题,可能可能通过这种“点云”类型的结构相对容易地解决。

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

据我所知,这种结构在各种矢量上都不会“高效” - 但似乎可能存在一些似乎适合3d对象的“模型”的问题。

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

任何建议或信息都非常感谢。在此先感谢。

3 个答案:

答案 0 :(得分:5)

没有什么能阻止您使用3D数组来存储除存储器之外的像素数据。像这样:

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

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

这就是" 3D等价的Bitmap"

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

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

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

存储3D图像的另一种方法是深度图,该3D图像实际上经常使用。对于每个像素,您存储一个值,表示它与"屏幕的接近程度。或者你的投影表面是什么,并且在随后的绘图操作中,你跳过任何深度比当前像素更深的像素,因为它不会被看到。 (也称为Z缓冲)

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

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

答案 1 :(得分:4)

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

使用3D数据阵列时最常见的问题是它需要大量内存 - 即使数据适合可用内存,超大尺寸也会使计算速度变慢。有很多方法可以改进:我相信3D纹理支持MIP贴图,而在主处理器端,可以使用八叉树来利用稀疏的3D数据。

然而,有许多应用程序,3D阵列是有意义的,没有别的。例如,MRI数据是自然密集的3D信息。

答案 2 :(得分:-1)

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

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