2012-09-18 184 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等打開它。此外,這是一個非常簡單的實現。

我會選擇這個,如果你的數據不會變得比這更復雜。

快樂編碼!