C# 位图(bmp)的3D等价物

C# 位图(bmp)的3D等价物,c#,graphics,3d,C#,Graphics,3d,正如位图(bmp)只是代表白色/黑色或颜色的二维值数组一样,有人知道简单的三维位图有类似类型的“结构”吗?换句话说,表示黑/白或颜色的三维值数组 似乎有各种各样的问题可以通过这种“点云”类型的结构相对容易地解决 换句话说,在不涉及整个3d渲染世界的情况下,一些问题似乎可以通过更简单的数据结构解决,并且比有效管理3d对象(使用OpenGL、DirectX、Axiom、GDI+等)所涉及的数学要少得多 我知道这种结构在很多向量上都不是“有效的”,但是。。。似乎有一些问题似乎适合这样一个3d对象的“模

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

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

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

我知道这种结构在很多向量上都不是“有效的”,但是。。。似乎有一些问题似乎适合这样一个3d对象的“模型”

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


非常感谢您的建议或信息。提前感谢。

除了存储像素数据的内存之外,没有任何东西可以阻止您使用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缓冲)

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


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

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


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

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

使用3D数据数组最常见的问题是它需要非常多的内存——如此之多,以至于即使数据适合可用内存,也会导致计算速度变慢。有一些方法可以改进这一点:我相信三维纹理支持MIP贴图,在主处理器端,八叉树可以用来利用稀疏的三维数据


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

正如您所说,位图像素为黑白或.color,没有透明度。。所以每个3d位图都是一个cube@Sayse很好的一点是,可以使像素为ARGB而不是简单的RGB,例如
System.Drawing.Color
类,或者使像素以半透明的方式显示。OpenGL有一个texture3D采样器,支持3D纹理,包括mipmapping。我假设Direct3D有一个等效的数据类型。虽然我同意3D纹理在体积图形中是可用的,并且非常有帮助(是的,可以通过Direct3D访问),但这一点仍然存在,因为没有既定的3D结构格式。我认为多维数组比锯齿数组更有意义,由于每个尺寸在每个维度上都是相同的(原因相同,2D位图在每行和每列中都有像素):
public Pixel[,]myPix3D=new Pixel[300300]。有关更多信息,请参阅。哦,是的,对不起,我必须经常检查语法。谢谢大家的帮助。这正是我要找的!