VTk通過資料流實作變資訊為圖形資料的。
資料流一般為:source—filter——mapper——actor——render——renderwindow——interactor。
#!/usr/bin/env python
"""
示範回調的使用。
"""
import vtk
def main():
# 決定使用什麼方法。
use_function_callback = True
colors = vtk.vtkNamedColors()
# 建立渲染器、渲染視窗和渲染視窗互動器。
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
# 使用一個圓錐作為源。
source = vtk.vtkConeSource()
source.SetCenter(0, 0, 0)
# 設定圓錐的基本半徑。
source.SetRadius(1)
# 使用黃金比例的高度。
source.SetHeight(1.6180339887498948482)
# 設定用來表示圓錐的面數。
source.SetResolution(128)
source.Update()
# 管道
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(source.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetColor(colors.GetColor3d("peacock"))
# 照明
#設定/擷取環境照明系數
actor.GetProperty().SetAmbient(0.3)
# 設定 / 擷取漫射照明系數。
actor.GetProperty().SetDiffuse(0.0)
# 設定/擷取高光照明系數。
actor.GetProperty().SetSpecular(1.0)
# 設定/擷取高光能量。
actor.GetProperty().SetSpecularPower(20.0)
# 擷取上下文資料集的概要。
# vtkOutlineFilter是一個過濾器,可生成任何資料集或複合資料集的線框輪廓。
# 輪廓由資料集邊界框的十二條邊組成。存在用于生成面而不是線框輪廓的選項。
outline = vtk.vtkOutlineFilter()
outline.SetInputData(source.GetOutput())
outlineMapper = vtk.vtkPolyDataMapper()
outlineMapper.SetInputConnection(outline.GetOutputPort())
outlineActor = vtk.vtkActor()
# 輪廓線顔色
outlineActor.GetProperty().SetColor(colors.GetColor3d("Black"))
outlineActor.SetMapper(outlineMapper)
# 添加演員到渲染器,設定背景和大小。
ren.AddActor(actor)
ren.AddActor(outlineActor)
# 設定背景顔色
ren.SetBackground(colors.GetColor3d("AliceBlue"))
# 設定背景大小
renWin.SetSize(512, 512)
# 設定一個的相機位置。
camera = vtk.vtkCamera()
# 以世界坐标設定錄影機的位置
camera.SetPosition(4.6, -2.0, 3.8)
# 在世界坐标中設定照相機的焦距
camera.SetFocalPoint(0.0, 0.0, 0.0)
# 設定沿投影方向的遠近裁剪平面位置
camera.SetClippingRange(3.2, 10.2)
# 設定錄影機的向上視圖方向。
camera.SetViewUp(0.3, 1.0, 0.13)
# 指定這個渲染器使用的相機。
ren.SetActiveCamera(camera)
renWin.Render()
renWin.SetWindowName("CallBack")
# 設定一個坐标系,随着父圖像一起旋轉
axes1 = MakeAxesActor()
# 方向标記工具
om1 = vtk.vtkOrientationMarkerWidget()
# 設定标記
om1.SetOrientationMarker(axes1)
# 在視口的左下角。
om1.SetViewport(0, 0, 0.2, 0.2)
om1.SetInteractor(iren)
om1.EnabledOn()
om1.InteractiveOn()
# 設定回調
if use_function_callback:
# 在觸發事件時輸出錄影機位置,是以添加了添加了活動攝像頭作為屬性。
GetOrientation.cam = ren.GetActiveCamera()
# 用觀察的對象注冊回調。
iren.AddObserver('EndInteractionEvent', GetOrientation)
else:
# 将動态相機裝入渲染視窗
iren.AddObserver('EndInteractionEvent', OrientationObserver(ren.GetActiveCamera()))
# Or:
# observer = OrientationObserver(ren.GetActiveCamera())
# iren.AddObserver('EndInteractionEvent', observer)
iren.Initialize()
iren.Start()
def GetOrientation(caller, ev):
"""
列印出方向圖。
必須在調用函數中注冊回調之前使用
GetOrientation.cam = ren.GetActiveCamera()
:param caller:
:param ev: The event.
:return:
"""
# 示範誰調用了callback以及觸發它的事件。
# 列印類名
print(caller.GetClassName(), "Event Id:", ev)
# 列印相機方向。
CameraOrientation(GetOrientation.cam)
class OrientationObserver(object):
def __init__(self, cam):
self.cam = cam
def __call__(self, caller, ev):
# Just do this to demonstrate who called callback and the event that triggered it.
print(caller.GetClassName(), "Event Id:", ev)
# Now print the camera orientation.
CameraOrientation(self.cam)
def CameraOrientation(cam):
fmt1 = "{:>15s}"
fmt2 = "{:9.6g}"
# map 建立一個疊代器,它使用來自每個疊代器的參數來計算函數。當最短的疊代結束時停止。
print(fmt1.format("Position:"), ', '.join(map(fmt2.format, cam.GetPosition())))
print(fmt1.format("Focal point:"), ', '.join(map(fmt2.format, cam.GetFocalPoint())))
print(fmt1.format("Clipping range:"), ', '.join(map(fmt2.format, cam.GetClippingRange())))
print(fmt1.format("View up:"), ', '.join(map(fmt2.format, cam.GetViewUp())))
print(fmt1.format("Distance:"), fmt2.format(cam.GetDistance()))
def MakeAxesActor():
axes = vtk.vtkAxesActor()
axes.SetShaftTypeToCylinder()
axes.SetXAxisLabelText('X')
axes.SetYAxisLabelText('Y')
axes.SetZAxisLabelText('Z')
axes.SetTotalLength(1.0, 1.0, 1.0)
axes.SetCylinderRadius(0.5 * axes.GetCylinderRadius())
axes.SetConeRadius(1.025 * axes.GetConeRadius())
axes.SetSphereRadius(1.5 * axes.GetSphereRadius())
return axes
if __name__ == '__main__':
main()
相機參考
https://blog.csdn.net/minmindianzi/article/details/84279290