2次元グリッド上のイメージングユニットの3ベクトルデータです。ベクトルはデカルトである。私はこれらのベクトルを平面上の矢印の全長の中央点を中心とする3dの矢印として表示したいと思います。私の考えは、 - (vector/2)に等しい翻訳の別の行列を作成し、グリフを移動する(または各ベクトルの原点を変更するなど)。私は、グリフへの翻訳としてこれらの新しいベクトルをポイントワイズに適用したいと考えました。私は失敗し、助けが必要です。すべてのVTKグリフを大きなデータセットで個別に翻訳
翻訳では、ベクトルの大きさを維持する必要があります。おそらくこれを行う他の方法はありますか?私はMayavi2がチェックボタンでこれを行うことができますが、私が必要とする他の機能は持っていないことに注意してください。
私は今週、Pythonと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()
'Stable.vts'を共有することはできますか? –
データセットが大きすぎますが、2次元格子点に(0.49766603112220764、-0.8000770807266235,0.349705636501312)のような3つのベクトルが付いています。 – Charlie