Pergunta

I have a 3D datastructure in C code that I want to visualize as boxes and points in 3D space. So I have a bunch of coordinates, some for points and some for boxes and I want to plot these in 3D to visualize the data structure. Anyone have experience doing anything similar to this? I started trying to use paraview. My plan being to generate a paraview statefile (xml-type file) and then just open it with paraview. The problem is those state files are massive and complex. To try and figure out the xml structure I was creating Boxes and Point sources in paraview and then looking at the state files it generated. It looks awful.

I just want to be able to say display a box with these coordinates and a point with these coordinates in a minimalistic way. Anyone have any ideas? Doesn't have to be in C or paraview necessarily as I can output the coordinates and input in whatever to generate the final product. Python + Matlab would work just as well if it works.

Foi útil?

Solução

So I figured out a nice compromise. I started with the git code as described here:

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

It's only one python file. The gist is the code there lets you give x,y,z positions and radius for points and outputs an XML file that is in VTK format. So to do the particles I just hand it the x,y,z positions and then a constant for the radius for all particles. Then I just make a spherical glyph on the datasets.

For the boxes I use the exact same code. For each box I still output x,y,z coordinates where the x,y,z values are the coordinates of the center of the box. Then for the "radius" parameter I use the edge length of the cube. This works because again in paraview I just glyph the datapoints for the boxes. I use the box glyph, and scale by scalar where the scalar is the radius. If you don't orient the box glyphs and set the scalar factor to 1 you get the desired result. Here's a simple example with everything uniform:

Simple Uniform Tree

So I just output the coordinates in my C datastructure to CSV files and then in python pull in the files and use the code at the link and open the result with paraview. Here's how I used the code at the link:

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")

Outras dicas

Since your data doesn't seem to be complex... Why don't you export it to a CSV file?

You'll be able to open it from ParaView, MATLAB, etc... Besides, it is a really straightforward implementation.

I would choose this if your data is not going to get more complex than that.

Happy coding!

If your algorithm is pure C and it's producing static or canned animated data you may like to export to an XML format or proprietary format that will open up many options.

Collada is an XML format designed for representing 3D objects in a software agnostic fashion and certainly worth a peek. You can then open in in a multitude of applications to view it, even Max and Maya which means no coding required to view it. There are also engines available that will read these exports natively.

As for other specific ways to visualize it this could be a totally open ended answer so depending on how many items you're trying to visualize and how much interatction you need here are a few suggestions but I know this is just the tip of the iceberg.

Matlab seems very good at plotting mathematical graphics but my rather dated memory of it was it was very slow and cumbersome to manipulate.

If it's simple gouraud shaded textured stuff and you want full control just go for a native OpenGL program as there's nothing too scary in there these days. It also means you get to keep you C code. Downside is it does take longer, especially if you need to handle camera controls or 'pixel quality' matters. I.e. if you're looking for shadowing, animation, shader effects, etc... please read on...

If it requires some user interaction, a stand alone app, more sophisticated rendering and the dataset isn't vast or you can compile it as C# (i.e. no pointers used) you may like to take a look at Unity. It simplifies 3D rendering for you by an order of magnitude and you just need to write C# to generate the mesh/particles you want to render and chuck some simple camera controls in (or import your collada file). The tricky bit is if you're new to it it'll take a day or two to get familiar with generating their meshes for your purpose.

Alternatively you could code it up in WebGL via HTML5 or better yet use someone else's WebGL system to do it for you!

There are a few items out there worth a peek if you opt for this route. My favourite is PlayCanvas and I believe it'll take your collada files too if you just need to generate them.

There's also SceneJS.org which is more raw and not personally tried that yet but mentioning it should that appeal too.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top