我有一个C代码的3D数据结构,我想将其可视化为3D空间中的框和点。所以我有一堆坐标,一些是点的,一些是长方体的,我想在3D中绘制这些坐标,以可视化数据结构。有人做过类似的事情吗?我开始尝试使用paraview。我的计划是生成一个paraview statefile (xml类型的文件),然后用paraview打开它。问题是这些状态文件既庞大又复杂。为了尝试弄清楚xml结构,我在paraview中创建了Boxes和Point sources,然后查看它生成的状态文件。看起来糟透了。
我只想以一种简约的方式显示一个带有这些坐标的框和一个带有这些坐标的点。有谁有什么想法吗?不一定要用C或paraview,因为我可以输出坐标和输入,生成最终的产品。如果Python + Matlab能正常工作,它也能工作得很好。
发布于 2012-09-20 21:46:47
所以我想出了一个很好的折衷方案。我从下面描述的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值是长方体中心的坐标。然后,对于"radius“参数,我使用立方体的边缘长度。这之所以有效,是因为在paraview中,我只是为盒子的数据点添加了字形。我使用方框字形,并按标量缩放,其中标量是半径。如果不调整方框字形的方向,并将标量因子设置为1,则会得到所需的结果。下面是一个简单的例子,所有的东西都是一样的:

因此,我只是将C数据结构中的坐标输出到CSV文件,然后在python中拉入这些文件,并在链接中使用代码,然后使用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")发布于 2012-09-19 18:32:41
因为你的数据看起来并不复杂...为什么不将其导出为CSV文件?
你可以从ParaView,MATLAB等打开它。此外,这是一个非常简单的实现。
如果你的数据不会变得更复杂,我会选择这个。
祝你编码愉快!
发布于 2012-09-19 05:32:08
如果您的算法是纯C语言,并且它正在生成静态或固定的动画数据,那么您可能希望将其导出为XML格式或专有格式,这将打开许多选择。
Collada是一种XML格式,设计用于以软件不可知的方式表示3D对象,当然值得一看。然后,您可以在多个应用程序中打开以查看它,甚至是Max和Maya,这意味着查看它不需要编码。也有一些引擎可以在本地读取这些导出。
至于其他具体的可视化方法,这可能是一个完全开放的答案,所以根据你试图可视化的项目数量和需要多少交互,这里有一些建议,但我知道这只是冰山一角。
Matlab似乎非常擅长绘制数学图形,但我对它的记忆相当陈旧,因为它操作起来非常慢和繁琐。
如果它是简单的,gouraud,阴影,纹理的东西,你想要完全的控制,只需要一个原生的OpenGL程序,因为这些天里面没有太可怕的东西。这也意味着你可以保留你的C代码。缺点是它确实需要更长的时间,特别是当你需要处理相机控制或“像素质量”问题时。例如,如果你正在寻找阴影,动画,阴影效果,等等。请继续阅读..。
如果它需要一些用户交互,一个独立的应用程序,更复杂的渲染,数据集不是很大,或者你可以将它编译为C# (即不使用指针),你可能会想看看Unity。它为你简化了一个数量级的3D渲染,你只需要编写C#来生成你想要渲染的网格/粒子,并丢弃一些简单的相机控制(或导入你的collada文件)。棘手的一点是,如果你是新手,需要一两天的时间来熟悉为你的目的生成网格。
或者,您可以通过HTML5用WebGL编写代码,或者更好的做法是使用其他人的WebGL系统为您编写代码!
如果你选择这条路线,有几样东西值得一看。我最喜欢的是PlayCanvas,如果你只需要生成collada文件,我相信它也会把你的collada文件取走。
还有SceneJS.org,它更原始,还没有亲自尝试过,但提到它也应该有吸引力。
https://stackoverflow.com/questions/12484101
复制相似问题