本文 以 Python 语言开发
我们在做三维软件开发时,经常会用到相机坐标轴,来指示当前空间位置;
坐标轴效果:
相机方向坐标轴
Cube 正方体坐标轴
自定义坐标轴:
Code:
Axes
def main():
colors = vtkNamedColors()
# create a Sphere
sphereSource = vtkSphereSource()
sphereSource.SetCenter(0.0, 0.0, 0.0)
sphereSource.SetRadius(0.5)
# create a mapper
sphereMapper = vtkPolyDataMapper()
sphereMapper.SetInputConnection(sphereSource.GetOutputPort())
# create an actor
sphereActor = vtkActor()
sphereActor.SetMapper(sphereMapper)
# a renderer and render window
renderer = vtkRenderer()
renderWindow = vtkRenderWindow()
renderWindow.SetWindowName('Axes')
renderWindow.AddRenderer(renderer)
# an interactor
renderWindowInteractor = vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)
# add the actors to the scene
renderer.AddActor(sphereActor)
renderer.SetBackground(colors.GetColor3d('SlateGray'))
transform = vtkTransform()
transform.Translate(1.0, 0.0, 0.0)
axes = vtkAxesActor()
# The axes are positioned with a user transform
axes.SetUserTransform(transform)
# properties of the axes labels can be set as follows
# this sets the x axis label to red
axes.GetXAxisCaptionActor2D().GetCaptionTextProperty().SetColor(colors.GetColor3d('Red'));
# the actual text of the axis label can be changed:
axes.SetXAxisLabelText('test')
renderer.AddActor(axes)
renderer.GetActiveCamera().Azimuth(50)
renderer.GetActiveCamera().Elevation(-30)
renderer.ResetCamera()
renderWindow.SetWindowName('Axes')
renderWindow.Render()
# begin mouse interaction
renderWindowInteractor.Start()
if __name__ == '__main__':
main()
CameraOrientationWidget
def main():
colors = vtkNamedColors()
renderer = vtkRenderer()
ren_win = vtkRenderWindow()
interactor = vtkRenderWindowInteractor()
sphere_source = vtkSphereSource()
sphere_source.SetRadius(10.0)
mapper = vtkPolyDataMapper()
mapper.SetInputConnection(sphere_source.GetOutputPort())
actor = vtkActor()
actor.GetProperty().SetColor(colors.GetColor3d('Beige'))
actor.SetMapper(mapper)
renderer.AddActor(actor)
renderer.SetBackground(colors.GetColor3d('DimGray'))
ren_win.AddRenderer(renderer)
ren_win.SetSize(600, 600)
ren_win.SetWindowName('CameraOrientationWidget')
# Important: The interactor must be set prior to enabling the widget.
interactor.SetRenderWindow(ren_win)
cam_orient_manipulator = vtkCameraOrientationWidget()
cam_orient_manipulator.SetParentRenderer(renderer)
# Enable the widget.
cam_orient_manipulator.On()
ren_win.Render()
interactor.Initialize()
interactor.Start()
if __name__ == "__main__":
main()
OrientationMarkerWidget
colors = vtkNamedColors()
# create a rendering window and renderer
ren = vtkRenderer()
ren_win = vtkRenderWindow()
ren_win.AddRenderer(ren)
ren_win.SetWindowName('OrientationMarkerWidget')
# create a renderwindowinteractor
iren = vtkRenderWindowInteractor()
iren.SetRenderWindow(ren_win)
cube = vtkCubeSource()
cube.SetXLength(200)
cube.SetYLength(200)
cube.SetZLength(200)
cube.Update()
cm = vtkPolyDataMapper()
cm.SetInputConnection(cube.GetOutputPort())
ca = vtkActor()
ca.SetMapper(cm)
ca.GetProperty().SetColor(colors.GetColor3d("BurlyWood"))
ca.GetProperty().EdgeVisibilityOn()
ca.GetProperty().SetEdgeColor(colors.GetColor3d("Red"))
# assign actor to the renderer
ren.AddActor(ca)
ren.SetBackground(colors.GetColor3d('CornflowerBlue'))
axes_actor = vtkAnnotatedCubeActor()
axes_actor.SetXPlusFaceText('L')
axes_actor.SetXMinusFaceText('R')
axes_actor.SetYMinusFaceText('I')
axes_actor.SetYPlusFaceText('S')
axes_actor.SetZMinusFaceText('P')
axes_actor.SetZPlusFaceText('A')
axes_actor.GetTextEdgesProperty().SetColor(colors.GetColor3d("Yellow"))
axes_actor.GetTextEdgesProperty().SetLineWidth(2)
axes_actor.GetCubeProperty().SetColor(colors.GetColor3d("Blue"))
axes = vtkOrientationMarkerWidget()
axes.SetOrientationMarker(axes_actor)
axes.SetInteractor(iren)
axes.EnabledOn()
axes.InteractiveOn()
ren.ResetCamera()
# enable user interface interactor
iren.Initialize()
ren_win.Render()
ren.GetActiveCamera().Azimuth(45)
ren.GetActiveCamera().Elevation(30)
ren_win.Render()
iren.Start()
custom OrientationMarker
colors = vtkNamedColors()
reader = vtkXMLPolyDataReader()
reader.SetFileName("./Human.vtp")
icon_mapper = vtkDataSetMapper()
icon_mapper.SetInputConnection(reader.GetOutputPort())
icon_actor = vtkActor()
icon_actor.SetMapper(icon_mapper)
icon_actor.GetProperty().SetColor(colors.GetColor3d('Silver'))
# Set up the renderer, window, and interactor
renderer = vtkRenderer()
renderer.SetBackground(colors.GetColor3d('SlateGray'))
ren_win = vtkRenderWindow()
ren_win.AddRenderer(renderer)
ren_win.SetSize(400, 400)
ren_win.SetWindowName('OrientationMarkerWidget1')
iren = vtkRenderWindowInteractor()
iren.SetRenderWindow(ren_win)
rgb = [0.0, 0.0, 0.0]
colors.GetColorRGB('Wheat', rgb)
# Set up the widget
widget = vtkOrientationMarkerWidget()
widget.SetOrientationMarker(icon_actor)
widget.SetInteractor(iren)
widget.SetViewport(0.0, 0.0, 0.3, 0.3)
widget.SetOutlineColor(*rgb)
widget.SetEnabled(1)
widget.InteractiveOn()
# Create a superquadric
superquadric_source = vtkSuperquadricSource()
superquadric_source.SetPhiRoundness(.001)
superquadric_source.SetThetaRoundness(.04)
# Create a mapper and actor
superquadric_mapper = vtkPolyDataMapper()
superquadric_mapper.SetInputConnection(superquadric_source.GetOutputPort())
superquadric_actor = vtkActor()
superquadric_actor.SetMapper(superquadric_mapper)
superquadric_actor.GetProperty().SetInterpolationToFlat()
superquadric_actor.GetProperty().SetDiffuseColor(colors.GetColor3d('Carrot'))
superquadric_actor.GetProperty().SetSpecularColor(colors.GetColor3d('White'))
superquadric_actor.GetProperty().SetDiffuse(0.6)
superquadric_actor.GetProperty().SetSpecular(0.5)
superquadric_actor.GetProperty().SetSpecularPower(5.0)
renderer.AddActor(superquadric_actor)
renderer.ResetCamera()
ren_win.Render()
iren.Initialize()
iren.Start()