Rendering is slow compared to Java3D
This issue was created automatically from an original Mantis Issue. Further discussion may take place here.
I have created a scene with 10x10x10 spheres. I am using VTK with java wrapper. When I try to rotate the model, the rendering is sluggish compared to Java3D. I have attached the sample code below.
//-----Imports---------------------------------------------------------------- import javax.swing.JFrame;
import vtk.vtkActor; import vtk.vtkLight; import vtk.vtkPolyDataMapper; import vtk.vtkProperty; import vtk.vtkRenderer; import vtk.vtkRenderWindowPanel; import vtk.vtkSphereSource;
/**
-
This class renders multiple spheres in VTK window. This can be used
-
for stress testing Java3D. / public class MultipleSpheres { /*
- Number of spheres in X direction. */ private int m_nX = 10;
/**
- Number of spheres in Y direction. */ private int m_nY = 10;
/**
- Number of spheres in Z direction. */ private int m_nZ = 10;
/**
- RenderWindow panel. */ private vtkRenderWindowPanel m_zPanel;
/**
- Reference to JFrame. */ private JFrame m_zFrame;
static { System.loadLibrary("vtkCommonJava"); System.loadLibrary("vtkFilteringJava"); System.loadLibrary("vtkIOJava"); System.loadLibrary("vtkImagingJava"); System.loadLibrary("vtkGraphicsJava"); System.loadLibrary("vtkRenderingJava"); System.loadLibrary("vtkInfovisJava"); System.loadLibrary("vtkViewsJava");
} // static
/**
-
Constructs MultipleSpheres object.
-
@param ascArg Array of command line arguments. */ public MultipleSpheres( String [] ascArg ) { for( int i = 0; i < ascArg.length; i++ ) { if ( ascArg[i].equalsIgnoreCase("-nx") && (i+1) < ascArg.length ) { m_nX = Integer.parseInt(ascArg[++i]); } else if ( ascArg[i].equalsIgnoreCase("-ny") && (i+1) < ascArg.length ) { m_nY = Integer.parseInt(ascArg[++i]); } else if ( ascArg[i].equalsIgnoreCase("-nZ") && (i+1) < ascArg.length ) { m_nZ = Integer.parseInt(ascArg[++i]); } }
buildUI(); buildScene();
m_zFrame.setVisible(true);
} // Constructor MultipleSpheres
/**
-
Builds the UI. */ private void buildUI() { m_zPanel = new vtkRenderWindowPanel(); m_zPanel.GetRenderWindow().SwapBuffersOn();
m_zFrame = new JFrame("MultipleSpheres"); m_zFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); m_zFrame.add("Center", m_zPanel); m_zFrame.setSize(500, 500);
} // buildUI
/**
-
Builds the scene. */ private void buildScene() { vtkSphereSource zSphere = new vtkSphereSource(); zSphere.SetThetaResolution(100); zSphere.SetPhiResolution(50); zSphere.SetRadius(1.0);
vtkPolyDataMapper zPolyDataMapper = new vtkPolyDataMapper(); zPolyDataMapper.SetInputConnection(zSphere.GetOutputPort());
vtkProperty zProperty = new vtkProperty(); zProperty.SetColor(1.0, 0.3882, 0.2784); zProperty.SetDiffuse(0.7); zProperty.SetSpecular(0.4); zProperty.SetSpecularPower(30);
vtkRenderer zRenderer = m_zPanel.GetRenderer();
double dX = -m_nX; for( int i = 0; i < m_nX; i++ ) { double dY = -m_nY; for( int j = 0; j < m_nY; j++ ) { double dZ = -m_nZ; for( int k = 0; k < m_nZ; k++ ) { System.out.println("X: " + dX + ", Y: " + dY + ", Z: " + dZ); vtkActor zActor = new vtkActor(); zActor.SetMapper(zPolyDataMapper); zActor.SetProperty(zProperty); zActor.SetPosition(dX, dY, dZ);
zRenderer.AddActor(zActor); dZ += 2.0; } dY += 2.0;
}
dX += 2.0; }
vtkLight zLight1 = new vtkLight(); zLight1.SetFocalPoint(1.875, 0.6125, 0); zLight1.SetPosition(0.875, 1.6125, 1); zRenderer.AddLight(zLight1);
vtkLight zLight2 = new vtkLight(); zLight2.SetFocalPoint(1.875, 0.6125, 0); zLight2.SetPosition(9, 9, -9); zRenderer.AddLight(zLight2);
vtkLight zLight3 = new vtkLight(); zLight3.SetFocalPoint(1.875, 0.6125, 0); zLight3.SetPosition(0.875, -9, -9); zRenderer.AddLight(zLight3);
zRenderer.GetActiveCamera().SetFocalPoint(0, 0, 0); zRenderer.GetActiveCamera().SetPosition(0, 0, 1); zRenderer.GetActiveCamera().SetViewUp(0, 1, 0); zRenderer.GetActiveCamera().ParallelProjectionOn(); zRenderer.ResetCamera(); // zRenderer.GetActiveCamera().SetParallelScale(1.5);
} // buildScene
/**
- Main function.
- @param ascArg Array of command line arguments. */ public static void main( String ascArg[] ) { MultipleSpheres zMultSpheres = new MultipleSpheres(ascArg);
} // main
} // Class MultipleSpheres