2013-05-03 40 views
1

与位图(bmp)仅仅是表示白色/黑色或颜色的值的二维数组一样 - 任何人都知道类似“结构”类型的简单3二维位图?换句话说,代表黑/白或颜色的三维数组值?3D等效位图(bmp)

看起来好像存在各种各样的问题,可能可能用这种“点云”类型的结构相对容易地解决。换句话说,没有进入整个3d渲染世界,一些问题似乎可以用更简单的数据结构解决,并且数学远远低于通常涉及有效管理3D对象的数学问题(使用OpenGL,DirectX,Axiom,GDI +等)。

我知道这个结构不会沿着各种载体“高效” - 但是......似乎可能会有某些问题似乎适用于3D对象的这种“模型”。

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

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

+2

正如你所说,一个位图的像素是白色黑色or.color,没有透明度..所以每一个3D位图是一个立方体 – Sayse 2013-05-03 22:15:37

+1

@Sayse好点,可以使像素ARGB的根本RGB,例如代替'System.Drawing.Color'类,或者像素显示为半透明。 – 2013-05-03 22:55:44

回答

4

没有什么能够阻止您使用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空间中创建它们 - 但我们通常不会纹理映射这些对象,因此“in内存“表示暂时是您正在讨论的对象的类型,但位图总是包含所有像素,并且我们并不总是需要这样做,所以我们不会将实体对象渲染到3D空间中,而只是渲染线框。大多数图形引擎在临时3D空间投影到2D之后应用纹理,并且已应用了许多优化。

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

+1

我认为多维数组会比锯齿状数组更有意义,因为每个尺寸在每个维中都是相同的(出于同样的原因,2D位图每行和每列都有像素):'public Pixel [,,] myPix3D =新像素[300,300,300];'。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/9b9dty7d.aspx – 2013-05-03 22:51:25

+0

噢,是的,我很抱歉,我经常需要检查该语法。 – Jasmine 2013-05-04 00:55:40

-2

AFAIK没有这样的东西,一个精心设计的光栅3D结构格式。虽然栅格数据通常用于现代图形,但仅限于纹理,凹凸贴图和高度场;结构总是用向量来定义的。

我的选择是,对于这种情况的原因是数据量X模型比,有时在2D有问题的,但很明显,在三维的缺点。

+2

OpenGL有一个texture3D采样器并支持3D纹理,包括mipmapping。我会假设Direct3D具有相同的数据类型。 – user1118321 2013-05-03 22:25:11

+0

虽然我同意3D纹理可用,并且在体积图形(是的,可通过Direct3D访问)中很有用,但这一点仍然存在 - AFAIK没有建立3D **结构**格式。 – OnoSendai 2013-05-03 22:36:17

4

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

使用3D数据阵列最常见的问题是,它需要大量的内存 - 太大的尺寸可能会使计算速度变慢,即使数据适合可用内存。有很多方法可以改进这一点:我相信MIP贴图支持3D纹理,并且在主处理器方面,octrees可以用来利用稀疏的3D数据。

不过,也有许多应用三维阵列意义,没有别的一样。例如,MRI数据是自然密集的3D信息。

+0

感谢大家的帮助。这完全是我在找的东西! – eejai42 2013-05-04 18:28:39

+0

谢谢 - 大家! – eejai42 2013-05-04 19:26:52