[vtkusers] Multiple Render Windows

duke123 at gmx.net duke123 at gmx.net
Tue Feb 24 07:27:54 EST 2004


Dear VTKers,

I am a new VTK user (VTK 4.2, Redhat 7.2) and am currently experiencing a
strange problem. I am using a Sensable Phantom device, along with VTK for
haptic and graphic rendering. I have some medical volume data with segmented
bones, represented as vtkVolume and a vtkActor for each segment (as polygonal
mesh). 

In my application I want to use 2 render windows, one displaying a volume
rendering of the volume, and the other one displaying the segmented bones,
which are touchable by the phantom. The current phantom position is shown by a
cursor (vtkActor).

Since volume rendering takes some time, the "volume window" needs only be
re-rendered when the camera position has changed, whereas the "main window"
shall be redrawn as fast as possible, since it contains the phantom cursor. 

The problem I have, is that some actors which are present in the "main
window" disappear, as soon as the "volume window" is rendered. This problem can be
solved by adding all actors to both windows. But I don't want to do that.

I have put together a simple example highlighting my problem (sources at the
end of this mail). In this example, there are two cones and one sphere and
two render windows. The first window contains only  one cone, whereas the
other window contains a cone and the sphere. When both windows are rendered for
the first time, all actors are drawn. If the windows are rendered again, the
sphere disappears. If the cone is removed from the second window, so that this
window only contains the sphere, the sphere is rendered. 

I have checked how many actors are rendered ( GetNumberOfPropsRendered() )
and two actors are reported, although only one is visible.

I hope that this problem is because I made a stupid mistake, since I am new
to VTK. 
Anyways, thanks for your help.


Markus


Here is the example C++ code.


#include "vtkSphereSource.h"
#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkCamera.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkProperty.h"


void main( int argc, char *argv[] )
{
  
  vtkConeSource *cone = vtkConeSource::New();
  cone->SetHeight( 3.0 );
  cone->SetRadius( 1.0 );
  cone->SetResolution( 10 );  
	


  vtkSphereSource *sphere = vtkSphereSource::New();    
  sphere->SetRadius(5.0);
  sphere->SetThetaResolution(20);
  sphere->SetPhiResolution(20);
  sphere->SetCenter(-10,0,5);

  vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New();
  coneMapper->SetInput( cone->GetOutput() );
  
  vtkPolyDataMapper *sphereMapper = vtkPolyDataMapper::New();
  sphereMapper->SetInput( sphere->GetOutput() );
  
   
  
  vtkActor *coneActor = vtkActor::New();
  coneActor->SetMapper(coneMapper);
  coneActor->GetProperty()->SetColor(0, 0, 1);
  coneActor->GetProperty()->SetInterpolationToPhong();	 
   
  vtkActor *sphereActor = vtkActor::New();
  sphereActor->SetMapper( sphereMapper );
  sphereActor->SetOrigin(0,0,0);
    
  vtkRenderWindow *renWin = vtkRenderWindow::New();
  vtkRenderWindow *renWin2 = vtkRenderWindow::New();
  
  vtkRenderer *ren1= vtkRenderer::New();
  ren1->AddActor(coneActor ); 
  ren1->SetBackground( 1,1,1 );  
 
  vtkRenderer *ren2= vtkRenderer::New(); 
 
   // if the following line is uncommented, it works
  ren2->AddActor(coneActor);
  ren2->AddActor(sphereActor);
  ren2->SetBackground( 1,1,1 ); 

  
  renWin->AddRenderer( ren1 );
  renWin2->AddRenderer( ren2 );
  
  renWin->SetSize( 400, 300 );
  renWin2->SetSize( 400, 300 );
  renWin2->SetPosition(0,350);
  
 
  // Loop over 360 degrees and render both windows each time.
   
  for (int i = 0; (i % 360) < 360; i++) {
   
    renWin->Render();   
    renWin2->Render();
    coneActor->SetOrientation(i,0,0); 
  }
  
}



-- 
GMX ProMail (250 MB Mailbox, 50 FreeSMS, Virenschutz, 2,99 EUR/Monat...)
jetzt 3 Monate GRATIS + 3x DER SPIEGEL +++ http://www.gmx.net/derspiegel +++




More information about the vtkusers mailing list