2012-09-18 96 views
4

我有一个C代码中的3D数据结构,我想将其视为三维空间中的框和点。所以我有一堆坐标,一些用于点和一些用于盒子,我想用3D绘制这些坐标以可视化数据结构。任何人都有经验做类似这样的事情吗?我开始尝试使用paraview。我的计划是生成paraview statefile(xml类型文件),然后用paraview打开它。问题在于那些状态文件庞大而复杂。为了试图找出xml结构,我在paraview中创建了Boxes和Point源,然后查看它生成的状态文件。它看起来很糟糕。可视化三维数据结构

我只想说能够用简单的方式显示一个带有这些坐标的框和一个带有这些坐标的点。有人有主意吗?不必一定要用C或paraview来表示,因为我可以输出坐标和输入来生成最终产品。如果它能正常工作,Python + Matlab也可以工作。

+0

我认为paraview将是我的选择。你有没有尝试使用VTK文件?他们真的不那么复杂。你可以编写二进制文件,这对大型数据集很有用。 – angainor

+0

想要显示的框,是指将坐标系设置为该“框”,或绘制一个框并在3D中绘制一个点? – macduff

+0

没有尝试vtk文件。可以查看导入vtk文件? – user926914

回答

3

所以我想出了一个很好的折衷。我开始与git的代码如下所述:

http://www.shocksolution.com/microfluidics-and-biotechnology/visualization/python-vtk-paraview/

这只是一个Python文件。要点是代码允许您为点提供x,y,z位置和半径,并输出VTK格式的XML文件。所以要做粒子,我只把它交给x,y,z位置,然后对所有粒子的半径进行一个常量。然后我只在数据集上制作一个球形字形。

对于我使用完全相同的代码的框。对于每个盒子,我仍输出x,y,z坐标,其中x,y,z值是盒子中心的坐标。然后,对于“半径”参数,我使用立方体的边长。这是有效的,因为在paraview中我再次为这些盒子标出数据点。我使用框标志符号,并通过标量以标量为半径的比例进行缩放。如果您不定位方框字形并将标量因子设置为1,则会得到期望的结果。这里有一个简单的例子,一切统一:

Simple Uniform Tree

所以我只输出在我的C数据结构到CSV文件,然后在文件蟒蛇拉,并使用代码的链接,打开与结果的坐标paraview包。以下是我如何使用链接上的代码:

from vtktools import VTK_XML_Serial_Unstructured 
import sys 

if len(sys.argv) > 2: 
    treeFile = sys.argv[1] 
    bodyFile = sys.argv[2] 
else: 
    print 'No input files' 
    exit(4) 

x = [] 
y = [] 
z = [] 
r = [] 

f = open(treeFile, 'r') 
for line in f: 
    v = line.split(',') 
    x.append(float(v[0].strip())) 
    y.append(float(v[1].strip())) 
    z.append(float(v[2].strip())) 
    r.append(float(v[3].strip())) 
f.close() 

temp = treeFile.split('/') 
if (len(temp) == 1): 
    temp = temp[0] 
else: 
    temp = temp[-1] 
tree_writer = VTK_XML_Serial_Unstructured() 
tree_writer.snapshot(temp.split('.',1)[0] + '.vtu', x, y, z, [], [], [], [], [], [], r) 
tree_writer.writePVD("octree.pvd") 
x = [] 
y = [] 
z = [] 
r = [] 

f = open(bodyFile, 'r') 
for line in f: 
    v = line.split(',') 
    x.append(float(v[0].strip())) 
    y.append(float(v[1].strip())) 
    z.append(float(v[2].strip())) 
    r.append(float(v[3].strip())) 
f.close() 

temp = bodyFile.split('/') 
if (len(temp) == 1): 
    temp = temp[0] 
else: 
    temp = temp[-1] 
body_writer = VTK_XML_Serial_Unstructured() 
body_writer.snapshot(temp.split('.',1)[0] + '.vtu', x, y, z, [], [], [], [], [], [], r) 
body_writer.writePVD("distribution.pvd") 
0

如果你的算法是纯粹的C,它产生静态或罐头动画数据,你可能想导出为XML格式或专有格式,这将打开许多选项。

Collada是一种XML格式,用于以软件不可知的方式表示3D对象,当然值得一看。然后你可以打开多个应用程序来查看它,甚至Max和Maya,这意味着无需查看它的编码。还有一些引擎可以在本地读取这些导出。

至于其他具体的可视化方法,这可能是一个完全开放的答案,所以取决于你试图想象多少项目,你需要多少意见这里有一些建议,但我知道这只是冰山一角。

Matlab似乎非常擅长绘制数学图形,但我相当久远的记忆是操作非常缓慢和麻烦。

如果它是简单的gouraud阴影纹理的东西,你想完全控制只是去一个本地的OpenGL程序,因为这些日子里没有什么可怕的。这也意味着你可以保持你的C代码。缺点是确实需要更长时间,特别是如果您需要处理相机控制或“像素质量”问题。即如果你正在寻找阴影,动画,着色器效果等...请继续阅读...

如果它需要一些用户交互,独立的应用程序,更复杂的渲染和数据集并不广泛或你可以将它编译为C#(即没有使用指针),你可以看看Unity。它将3D渲染简化了一个数量级,您只需编写C#来生成要渲染的网格/粒子,并在一些简单的相机控件中(或导入您的collada文件)。棘手的是,如果你是新手,需要一两天才能熟悉为你的目的生成网格。

或者,您可以通过HTML5或更好的方式在WebGL中对其进行编码,或者使用其他人的WebGL系统为您做到这一点!

如果您选择此路线,那里有几件物品值得一看。我最喜欢的是PlayCanvas,如果你只需要生成它们,我相信它也会带上你的collada文件。

还有SceneJS.org这是更原始的,并没有亲自尝试,但提到它应该吸引太多。

2

由于您的数据似乎并不复杂......为什么不将它导出为CSV文件?

您可以从ParaViewMATLAB等打开它。此外,这是一个非常简单的实现。

我会选择这个,如果你的数据不会变得比这更复杂。

快乐编码!