有的时候,在显示三维物体时,我们希望知道当前场景对应的坐标系位置或者方向,这样在旋转物体的时候,就能够很清楚地看到当前正对这视野的是什么面xy平面,还是y轴等信息了。
在vtk库中有一个vtkAxesActor负责显示坐标系,在查阅了vtk的wiki之后,找到了两个示例,在这里将两者结合起来,放在同一个例子中显示,并用java代码重写。其中,第一个示例:http://vtk.org/Wiki/VTK/Examples/Cxx/GeometricObjects/Axes?是直接将vtkAxesActor加入到renderer中进行显示,而第二个示例:
http://vtk.org/Wiki/VTK/Examples/Cxx/Visualization/DisplayCoordinateAxes?是以Widget的方式在一个独立的视口中显示,比较适合用来放在右下角指示当前的坐标系位置。
最后的效果如下图:
?
?相应的java代码如下:
/** * 显示坐标系 * 代码参考: * http://vtk.org/Wiki/VTK/Examples/Cxx/Visualization/DisplayCoordinateAxes * http://vtk.org/Wiki/VTK/Examples/Cxx/GeometricObjects/Axes */ public class DisplayCoordinateAxes { static { System.loadLibrary("vtkCommonJava"); System.loadLibrary("vtkFilteringJava"); System.loadLibrary("vtkIOJava"); System.loadLibrary("vtkImagingJava"); System.loadLibrary("vtkGraphicsJava"); System.loadLibrary("vtkRenderingJava"); System.loadLibrary("vtkChartsJava"); System.loadLibrary("vtkGenericFilteringJava"); System.loadLibrary("vtkGeovisJava"); System.loadLibrary("vtkViewsJava"); System.loadLibrary("vtkWidgetsJava"); System.loadLibrary("vtkVolumeRenderingJava"); System.loadLibrary("vtkInfovisJava"); System.loadLibrary("vtkHybridJava"); } public static void main(String[] args) { //创建一个球体 vtkSphereSource sphereSource = new vtkSphereSource(); sphereSource.SetCenter(0.0, 0.0, 0.0); sphereSource.SetRadius(1.0); sphereSource.Update(); vtkPolyDataMapper mapper = new vtkPolyDataMapper(); mapper.SetInput(sphereSource.GetOutput()); vtkActor actor = new vtkActor(); actor.SetMapper(mapper); //为了能够看清楚vtkAxesActor,特意设置的透明度 actor.GetProperty().SetOpacity(0.3); vtkRenderer renderer = new vtkRenderer(); vtkRenderWindow renderWindow = new vtkRenderWindow(); renderWindow.AddRenderer(renderer); vtkRenderWindowInteractor renderWindowInteractor = new vtkRenderWindowInteractor(); renderWindowInteractor.SetRenderWindow(renderWindow); renderer.AddActor(actor); renderer.SetBackground(.2, .3, .4); //使用vtkTransform对vtkAxesActor进行转换,默认位于(0,0,0) vtkTransform transform = new vtkTransform(); transform.Translate(1.0, 0.0, 0.0); //1、在同一个视口中显示坐标系,直接添加到renderer中 vtkAxesActor axes1 = new vtkAxesActor(); renderer.AddActor(axes1); axes1.SetUserTransform(transform); vtkAxesActor axes = new vtkAxesActor(); //2、以Widget方式,在左下角的视口中显示坐标系,可进行鼠标交互 vtkOrientationMarkerWidget widget = new vtkOrientationMarkerWidget(); widget.SetOutlineColor(0.9300, 0.5700, 0.1300); widget.SetOrientationMarker(axes); widget.SetInteractor(renderWindowInteractor); widget.SetViewport(0.0, 0.0, 0.4, 0.4); widget.SetEnabled(1); widget.InteractiveOn(); renderer.ResetCamera(); renderWindow.Render(); // Begin mouse interaction renderWindowInteractor.Start(); } }?
?