 |
파이썬 마을 우리나라 파이썬 사용자들의 이야기 마을
|
|
| 이전 주제 보기 :: 다음 주제 보기 |
| 글쓴이 |
메시지 |
jrcho
가입: 올린 글: 56
|
올려짐: 2004 5월 12 8:35 pm 주제: [VTK강좌] 4.7. Streamlines ... under construction |
|
|
...이번 절은 완성되지 않은 겁니다. Streamline은 유체역학에서 사용되는 것입니다. 예전에 대학 전공 수업으로 유체역학을 배웠지만 전혀 기억이 나질 않는 군요. 기억나는 것은 streamline이 있고, 이와 비슷한 streak line, trajectory가 있다는 정도 입니다. 따라서 VTK의 streamline을 계산하는 필터(vtkStreamLine)이 이해가 안되더군요. 앞으로 수정할 수 있으면 하겠습니다(??). 대신 이번절에서 vtkTubeFilter는 선을 튜브형태로 만들어 주기 때문에 가끔 사용되는 유용한 필터 입니다. 사용법을 눈여겨 봐 주십시오.
4.7. Streamlines ... under construction
이 예제는 vtkStreamLine 필터를 이용해 streamline을 생성하는 방법과 vtkTubeFilter를 이용해 보기 좋게 장식하는 방법을 보이고 있다. 먼저, office.binary.vtk 파일에 저장된 사무실의 공기흐름에 대한 CFD(Computational Fluid Dynamics) 해석 결과를 vtkStructuredGridReader로 읽고, Update()를 호출한다. Update()를 미리 호출하는 이유는 rendering전에 데이터로부터 length 등의 값을 얻어야 하기 때문이다. Reader로 읽은 데이터를 이용해 vtkStreamLine 필터로 streamline을 생성하고, 다시 강조하기 위 vtkTubeFilter를 사용한다. 마지막으로 vtkStructuredGridOutlineFilter를 이용해 데이터의 outline을 나타낸다. 이 예제의 원본은 VTKExample/VisualizationAlgorithm에 있는 OfficeTube.py로, 테이블, 창 등은 사무실 내 풍경을 vtkStructuredGridGeometryFilter를 이용하여 나타내어 표시하는데 여기에서는 코드량을 줄이기 위해 이부분을 삭제하여 편집한 것이다.
리스트 4.7.1 StreamLineEx.py
| 코드: |
from vtk import *
from vtk.util.misc import vtkGetDataRoot
from vtk.util.colors import *
VTK_DATA_ROOT = vtkGetDataRoot()
reader = vtkStructuredGridReader()
reader.SetFileName(VTK_DATA_ROOT + "/Data/office.binary.vtk")
reader.Update()
# streamline generation
length = reader.GetOutput().GetLength()
maxVelocity =reader.GetOutput().GetPointData().GetVectors().GetMaxNorm()
maxTime = 35.0*length/maxVelocity
integ = vtkRungeKutta4()
streamer = vtkStreamLine()
streamer.SetInput(reader.GetOutput())
streamer.SetStartPosition(0.1, 2.1, 0.5)
streamer.SetMaximumPropagationTime(500)
streamer.SetStepLength(0.5)
streamer.SetIntegrationStepLength(0.05)
streamer.SetIntegrationDirectionToIntegrateBothDirections()
streamer.SetIntegrator(integ)
# make streamline with tube
streamTube = vtkTubeFilter()
streamTube.SetInput(streamer.GetOutput())
streamTube.SetRadius(0.02)
streamTube.SetNumberOfSides(12)
streamTube.SetVaryRadiusToVaryRadiusByVector()
mapStreamTube = vtkPolyDataMapper()
mapStreamTube.SetInput(streamTube.GetOutput())
mapStreamTube.SetScalarRange(reader.GetOutput().GetPointData().GetScalars().GetRange())
streamTubeActor = vtkActor()
streamTubeActor.SetMapper(mapStreamTube)
streamTubeActor.GetProperty().BackfaceCullingOn()
# outline
outline = vtkStructuredGridOutlineFilter()
outline.SetInput(reader.GetOutput())
mapOutline = vtkPolyDataMapper()
mapOutline.SetInput(outline.GetOutput())
outlineActor = vtkActor()
outlineActor.SetMapper(mapOutline)
outlineActor.GetProperty().SetColor(0, 0, 0)
# grahic stuff
ren = vtkRenderer()
renWin = vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
ren.AddActor(outlineActor)
ren.AddActor(streamTubeActor)
ren.SetBackground(slate_grey)
aCamera = vtkCamera()
aCamera.SetClippingRange(0.726079, 36.3039)
aCamera.SetFocalPoint(2.43584, 2.15046, 1.11104)
aCamera.SetPosition(-4.76183, -10.4426, 3.17203)
aCamera.SetViewUp(0.0511273, 0.132773, 0.989827)
aCamera.SetViewAngle(18.604)
aCamera.Zoom(1.2)
ren.SetActiveCamera(aCamera)
renWin.SetSize(500, 300)
iren.Initialize()
renWin.Render()
iren.Start()
|
그림 4.7.1 StreamLineEx.py의 실행 모습
다음 예제는 streamline을 생성하여 vtkRuledSurfaceFilter로 강조한 예제이다.
리스트 4.7.2 StreamSurfaceEx.py
| 코드: |
import vtk
from vtk.util.misc import vtkGetDataRoot
VTK_DATA_ROOT = vtkGetDataRoot()
# Read the data and specify which scalars and vectors to read.
pl3d = vtk.vtkPLOT3DReader()
pl3d.SetXYZFileName(VTK_DATA_ROOT + "/Data/combxyz.bin")
pl3d.SetQFileName(VTK_DATA_ROOT + "/Data/combq.bin")
pl3d.SetScalarFunctionNumber(100)
pl3d.SetVectorFunctionNumber(202)
pl3d.Update()
# We use a rake to generate a series of streamline starting points
# scattered along a line. Each point will generate a streamline. These
# streamlines are then fed to the vtkRuledSurfaceFilter which stitches
# the lines together to form a surface.
rake = vtk.vtkLineSource()
rake.SetPoint1(15, -5, 32)
rake.SetPoint2(15, 5, 32)
rake.SetResolution(21)
rakeMapper = vtk.vtkPolyDataMapper()
rakeMapper.SetInput(rake.GetOutput())
rakeActor = vtk.vtkActor()
rakeActor.SetMapper(rakeMapper)
integ = vtk.vtkRungeKutta4()
sl = vtk.vtkStreamLine()
sl.SetInput(pl3d.GetOutput())
sl.SetSource(rake.GetOutput())
sl.SetIntegrator(integ)
sl.SetMaximumPropagationTime(0.1)
sl.SetIntegrationStepLength(0.1)
sl.SetIntegrationDirectionToBackward()
sl.SetStepLength(0.001)
# The ruled surface stiches together lines with triangle strips.
# Note the SetOnRatio method. It turns on every other strip that
# the filter generates (only when multiple lines are input).
scalarSurface = vtk.vtkRuledSurfaceFilter()
scalarSurface.SetInput(sl.GetOutput())
scalarSurface.SetOffset(0)
scalarSurface.SetOnRatio(2)
scalarSurface.PassLinesOn()
scalarSurface.SetRuledModeToPointWalk()
scalarSurface.SetDistanceFactor(30)
mapper = vtk.vtkPolyDataMapper()
mapper.SetInput(scalarSurface.GetOutput())
mapper.SetScalarRange(pl3d.GetOutput().GetScalarRange())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
# Put an outline around for context.
outline = vtk.vtkStructuredGridOutlineFilter()
outline.SetInput(pl3d.GetOutput())
outlineMapper = vtk.vtkPolyDataMapper()
outlineMapper.SetInput(outline.GetOutput())
outlineActor = vtk.vtkActor()
outlineActor.SetMapper(outlineMapper)
outlineActor.GetProperty().SetColor(0, 0, 0)
# Now create the usual graphics stuff.
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
ren.AddActor(rakeActor)
ren.AddActor(actor)
ren.AddActor(outlineActor)
ren.SetBackground(1, 1, 1)
renWin.SetSize(300, 300)
iren.Initialize()
renWin.Render()
#iren.Start()
|
그림 4.7.2 StreamSurfaceEx.py |
|
| 위로 |
|
 |
|
|
새로운 주제를 올릴 수 없습니다 답글을 올릴 수 없습니다 주제를 수정할 수 없습니다 올린 글을 삭제할 수 없습니다 투표를 할 수 없습니다
|
|