2012-09-18 4 views
4

3D 공간에서 상자와 점으로 시각화하려는 C 코드의 3D 데이터 구조가 있습니다. 그래서 나는 좌표들, 점들을위한 것들 그리고 상자들을위한 것들을 가지고 있으며 그것들을 3D로 플롯하여 데이터 구조를 시각화하려고합니다. 누구나 이와 비슷한 일을 경험 한 사람이 있습니까? 나는 파라 뷰를 사용하기 시작했다. 내 계획 paraview statefile (xml 형식 파일) 생성하고 paraview 함께 열어. 문제는 그 상태 파일이 방대하고 복잡하다는 것입니다. xml 구조를 이해하기 위해 필자는 Paraview에서 Box 및 Point 소스를 작성한 다음 생성 된 상태 파일을 조사했습니다. 끔찍한데.3D 데이터 구조 시각화

이 좌표가있는 상자와이 좌표가있는 점을 최소한의 방법으로 표시하고 싶을뿐입니다. 누구든지 아이디어가 있습니까? 좌표를 출력하고 최종 제품을 생성하기 위해 무엇을 입력해도 필연적으로 C 또는 병렬 뷰일 필요는 없습니다. Python + Matlab도 제대로 작동합니다.

+0

나는 paraview가 나의 선택 일 것이라고 생각합니다. VTK 파일을 사용해 보셨습니까? 그들은 그다지 복잡하지 않습니다. 또한 바이너리 파일을 작성할 수 있으므로 대용량 데이터 세트에 유용합니다. – angainor

+0

표시하려는 상자는 좌표계를 해당 "상자"로 설정하거나 상자를 그리고 3D로 점을 그립니다. – macduff

+0

vtk 파일을 시도하지 않았습니다. vav 파일을 가져올 수 있습니까? – user926914

답변

3

그래서 나는 좋은 타협을 알아 냈습니다.

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

그것은 하나 개의 파이썬 파일입니다 : 여기에 설명 된 바와 같이 나는 자식 코드로 시작했다. 요점은 포인트에 x, y, z 위치와 반경을 부여하고 VTK 형식의 XML 파일을 출력하는 코드입니다. 그래서 입자를하기 위해서 저는 그것을 단지 x, y, z 위치로 넘겨 준 다음 모든 입자의 반경에 대한 상수를줍니다. 그런 다음 데이터 세트에서 구형 글리프를 만듭니다.

상자의 경우 동일한 코드를 사용합니다. 각 상자마다 여전히 x, y, z 좌표를 출력합니다. 여기서 x, y, z 값은 상자 중심의 좌표입니다. 그런 다음 "반지름"매개 변수에 대해 큐브의 가장자리 길이를 사용합니다. 이것은 paraview에서 다시 작동하기 때문에 상자에 대한 데이터 포인트를 그립니 다. 박스 글립을 사용하고 스칼라가 반지름 인 곳에 스칼라에 의해 스케일을 적용합니다. 상자 상형 문자의 방향을 지정하지 않고 스칼라 인수를 1로 설정하면 원하는 결과를 얻을 수 있습니다. 여기에 모든 유니폼과 간단한 예는 다음과 같습니다

Simple Uniform Tree

그래서 나는 단지 출력 CSV 파일로 내 C의 자료 구조에서 다음 파일 파이썬 풀과 링크에서 코드를 사용하고 함께 결과를 열 좌표 파라 뷰. 링크에서 코드를 사용한 방법은 다음과 같습니다.

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는 3D 개체를 소프트웨어와 무관 한 방식으로 표현하고 확실하게 볼만한 XML 형식입니다. 그러면 Max, Maya를 볼 수있는 수많은 애플리케이션에서 열 수 있습니다. 즉, Max와 Maya는 코딩을 요구하지 않습니다. 이러한 수출을 기본적으로 읽을 수있는 엔진도 있습니다.

시각화를위한 다른 특정 방법은 시각적으로 표시하려고하는 항목의 수와 여기에 얼마나 많은 수의 삽입이 필요한지에 따라 완전히 공개 된 답변 일 수 있지만 몇 가지 제안이 있지만 이것이 바로 빙산의 일각.

Matlab은 수학 그래픽을 플로팅하는 데 아주 좋았지 만 다소 시간이 오래 걸리던 기억은 매우 느리고 조작하기 까다 로웠습니다.

단순한 gouraud 음영 처리 된 질감의 물건이라면 요즘에는 그다지 무서운 것이 없으므로 완전한 OpenGL 프로그램을 사용하고 싶을 것입니다. 또한 C 코드를 유지할 수 있음을 의미합니다. 단점은 특히 카메라 컨트롤이나 '픽셀 품질'문제를 처리해야하는 경우 더 오래 걸리는 것입니다. 나는. 그림자 처리, 애니메이션, 쉐이더 효과 등을 찾고 있다면 ...

사용자 상호 작용이 필요한 경우, 독립 실행 형 응용 프로그램,보다 정교한 렌더링 및 데이터 세트가 광대하지 않거나 C#으로 컴파일 할 수 있습니다 (예 : 포인터가 사용되지 않음). Unity를 살펴보고 싶을 수도 있습니다. 그것은 당신을 위해 3D 렌더링을 단순하게 단순화합니다. 렌더링하려는 메쉬/파티클을 생성하고 간단한 카메라 컨트롤을 고정 시키거나 (또는 ​​collada 파일을 가져 오기 위해) C#으로 작성하면됩니다. 까다로운 점은, 처음 사용하는 사람이라면 목적에 맞는 메쉬 생성에 익숙해지기까지 1-2 일이 걸릴 것입니다.

HTML5 이상을 통해 WebGL에 코드를 작성할 수 있지만 다른 사람의 WebGL 시스템을 사용하여 대신 할 수 있습니다.

이 경로를 선택하면 볼만한 가치가있는 항목이 몇 가지 있습니다. 필자가 가장 좋아하는 것은 PlayCanvas이며 콜라다 파일을 생성해야하는 경우에도이 파일을 사용하게 될 것입니다.

원시인이면서도 개인적으로 시도하지 않은 SceneJS.org도 있지만 그 점에 대해서도 언급해야합니다.

2

데이터가 복잡하지 않으므로 ... CSV 파일로 내보내시겠습니까?

ParaView, MATLAB 등에서 열 수 있습니다.게다가, 그것은 정말로 간단한 구현입니다.

데이터가 그보다 더 복잡하지 않으면이 옵션을 선택합니다.

해피 코딩!