2017-11-30 35 views
0

2 차원 격자의 이미 징 단위 3 벡터 데이터입니다. 벡터는 직교 좌표입니다. 이 벡터들을 비행기의 화살표 총점의 중간 지점을 중심으로 한 3d 화살표로 표시하고 싶습니다. 내 생각은 - (vector/2)와 같은 다른 변환 행렬을 작성한 다음 글리프를 이동 (또는 각 벡터 원점을 변경하거나 작동 할 것)합니다! 따라서 나는이 새로운 벡터를 글리프에 대한 번역으로 pointwise 적용하려고했습니다. 나는 실패하고 도움이 필요하다.큰 데이터 집합에서 모든 VTK 글리프를 개별적으로 번역

번역은 벡터의 크기를 보존해야합니다. 아마도 이것을하는 다른 방법이있을 것입니다. 나는 Mayavi2가 체크 버튼으로 이것을 할 수 있지만 필요한 다른 기능을 가지고 있지 않음을 주목한다.

필자는 이번 주에 파이썬과 VTK를 사용하기 시작 했으므로 코드에있는 임의의 바보 같은 점을 지적하십시오. 작업 코드 :

import vtk 
import math 
import sys #Just to break flow 

# The source file 
file_name = "Stable.vts" 

# Read the source file. 
reader = vtk.vtkXMLStructuredGridReader() 
reader.SetFileName(file_name) 
reader.Update() 
output = reader.GetOutput() 
numPoints = output.GetNumberOfPoints() 
dimensions = output.GetDimensions() 

#Tuple to hold spherical polar coords 
mpolar = vtk.vtkFloatArray() 
mpolar.SetNumberOfTuples(numPoints) 
mpolar.SetNumberOfComponents(3) 
mpolar.SetNumberOfValues(3*numPoints) 
mpolar.SetName("mpolar") 

#Tuple to hold translations 
mtrans = vtk.vtkFloatArray() 
mtrans.SetNumberOfTuples(numPoints) 
mtrans.SetNumberOfComponents(3) 
mtrans.SetNumberOfValues(3*numPoints) 
mtrans.SetName("mtrans") 

#Tuple copy of cartesian data 
mxyz = vtk.vtkFloatArray() 
mxyz = output.GetPointData().GetAbstractArray(0) 
mxyz.SetName("mxyz") 

#Loop through input data and convert to spherical polar 
#Also set points equal to input points 
#Also create vector transform for each vector 
for x in range(numPoints): 
    azi = math.atan2(output.GetPointData().GetAbstractArray(0).GetTuple(x)[0],output.GetPointData().GetAbstractArray(0).GetTuple(x)[1]) 
    pol = math.acos(output.GetPointData().GetAbstractArray(0).GetTuple(x)[2]) 
    rad = 1 
    mpolar.SetTuple3(x, azi, pol, rad) 
    mtrans.SetTuple3(x, -output.GetPointData().GetAbstractArray(0).GetTuple(x)[0]/2, \ 
     -output.GetPointData().GetAbstractArray(0).GetTuple(x)[1]/2, \ 
     -output.GetPointData().GetAbstractArray(0).GetTuple(x)[2]/2) 

#Define new structured grid 
skrGrid = vtk.vtkStructuredGrid() 
skrGrid.SetDimensions(dimensions) 
skrGrid.SetPoints(output.GetPoints()) 
skrGrid.GetPointData().AddArray(mpolar) 
skrGrid.GetPointData().AddArray(mxyz) 
skrGrid.GetPointData().AddArray(mtrans) 

#Write new structured grid 
#writer = vtk.vtkXMLStructuredGridWriter() 
#writer.SetFileName("skrGrid.vts") 
#writer.SetInputData(skrGrid) 
#writer.Write() 

#Subsample grid 
subs = 11 
extract = vtk.vtkExtractGrid() 
extract.SetInputData(skrGrid) 
extract.SetSampleRate(subs, subs, 1) 
extract.Update() 
#extract.IncludeBoundaryOn() #Get boundary even if not sampled 

#Cast data into PolyData format for Glyphs 
pd = vtk.vtkPolyData() 
pd.SetPoints(extract.GetOutput().GetPoints()) 
pd.GetPointData().SetVectors(extract.GetOutput().GetPointData().GetAbstractArray(1)) 

arrowSource = vtk.vtkArrowSource() 

glyph3D = vtk.vtkGlyph3D() 
glyph3D.SetSourceConnection(arrowSource.GetOutputPort()) 
glyph3D.SetVectorModeToUseVector() 
glyph3D.SetInputData(pd) 
glyph3D.SetScaleFactor(1e-07) 
glyph3D.Update() 

# Create a mapper and actor 
mapper = vtk.vtkPolyDataMapper() 
mapper.SetInputConnection(glyph3D.GetOutputPort()) 

actor = vtk.vtkActor() 
actor.SetMapper(mapper) 

# Visualize 
camera = vtk.vtkCamera() 
camera.SetPosition(5e-07, -15e-07, 1e-06) 
camera.SetFocalPoint(5e-07, 5e-07, 0) 

# Create a renderer, render window, and interactor 
renderer = vtk.vtkRenderer() 
renderer.SetActiveCamera(camera) 

renderWindow = vtk.vtkRenderWindow() 
renderWindow.AddRenderer(renderer) 
renderWindowInteractor = vtk.vtkRenderWindowInteractor() 
renderWindowInteractor.SetRenderWindow(renderWindow) 

# Add the actor to the scene 
renderer.AddActor(actor) 
renderer.SetBackground(1, 1, 1) # Background color white 
renderer.ResetCameraClippingRange() # Call because without it you need window input to make render display! 

# enable user interface interactor 
# Render and interact 
renderWindow.SetSize(800,600) 
renderWindowInteractor.Initialize() 
renderWindow.Render() 
renderWindowInteractor.Start()  
+0

'Stable.vts'를 공유 할 수 있습니까? –

+0

데이터 세트가 너무 큽니다. 그러나 2 차원 격자 점에 (0.49766603112220764, -0.8000770807266235, 0.3349705636501312)와 같은 단위 3 벡터가 첨부됩니다. – Charlie

답변

0

여기에 필요한 것은 워프 벡터입니다. 변위가 이미 mtrans로 계산되었으므로이를 새로운 구성으로 왜곡하기 위해 점 집합에 적용 할 수 있습니다. 점 집합은 글리프의 원점입니다. 아래는 서브 샘플 그리드 아래의 코드 섹션입니다.

#Cast data into PolyData format for warping 
pd = vtk.vtkPolyData() 
pd.SetPoints(extract.GetOutput().GetPoints()) 
pd.GetPointData().SetVectors(extract.GetOutput().GetPointData().GetAbstractArray(2)) 

#Warp vector origins 
warpVector = vtk.vtkWarpVector() 
warpVector.SetInputData(pd) 
warpVector.SetScaleFactor(1e-07) 
warpVector.Update() 

#Cast warped points and original vectors into PolyData for rendering 
warped = vtk.vtkPolyData() 
warped.SetPoints(warpVector.GetOutput().GetPoints()) 
warped.GetPointData().SetVectors(extract.GetOutput().GetPointData().GetAbstractArray(1)) 

arrowSource = vtk.vtkArrowSource() 

glyph3D = vtk.vtkGlyph3D() 
glyph3D.SetSourceConnection(arrowSource.GetOutputPort()) 
glyph3D.SetVectorModeToUseVector() 
glyph3D.SetInputData(warped) 
glyph3D.SetScaleFactor(1e-07) 
glyph3D.Update()