[vtkusers] vtkProp3D::SetUserTransform doing hack to support legacy code
Renaud Detry
renaudjdetry at airpost.net
Fri Oct 5 11:07:30 EDT 2007
Hi,
I modified the Cone5 example in Examples/Tutorial to add a second cone
which contains a user transform:
vtkActor *coneActor = vtkActor::New();
coneActor->SetMapper( coneMapper );
vtkActor *coneActor2 = vtkActor::New();
coneActor2->SetMapper( coneMapper );
vtkTransform* transform = vtkTransform::New();
coneActor2->SetUserTransform(transform);
I also changed the interactor style to "switch". (See end of message
for the complete source.)
When I interactively move coneActor, everything is fine. When I move
coneActor2, I hear a complain that
Warning: In /usr/local/vtk-5.0.3/src/VTK/Common/vtkTransform.cxx,
line 202 vtkTransform (0x2914670): InternalUpdate: doing hack to
support legacy code. This is deprecated in VTK 4.2. May be removed
in a future version.
Is this normal? Is there a better way?
Thanks very much,
Renaud.
/
*=======================================================================
==
Program: Visualization Toolkit
Module: $RCSfile: Cone5.cxx,v $
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for
details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR
PURPOSE. See the above copyright notice for more information.
========================================================================
=*/
//
// This example introduces the concepts of interaction into the
// C++ environment. A different interaction style (than
// the default) is defined.
//
// First include the required header files for the VTK classes we are
using.
#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkTransform.h"
#include "vtkInteractorStyleSwitch.h"
int main()
{
//
// Next we create an instance of vtkConeSource and set some of its
// properties. The instance of vtkConeSource "cone" is part of a
// visualization pipeline (it is a source process object); it
produces data
// (output type is vtkPolyData) which other filters may process.
//
vtkConeSource *cone = vtkConeSource::New();
cone->SetHeight( 3.0 );
cone->SetRadius( 1.0 );
cone->SetResolution( 10 );
//
// In this example we terminate the pipeline with a mapper process
object.
// (Intermediate filters such as vtkShrinkPolyData could be
inserted in
// between the source and the mapper.) We create an instance of
// vtkPolyDataMapper to map the polygonal data into graphics
primitives. We
// connect the output of the cone souece to the input of this mapper.
//
vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New();
coneMapper->SetInputConnection( cone->GetOutputPort() );
//
// Create an actor to represent the cone. The actor orchestrates
rendering
// of the mapper's graphics primitives. An actor also refers to
properties
// via a vtkProperty instance, and includes an internal
transformation
// matrix. We set this actor's mapper to be coneMapper which we
created
// above.
//
vtkActor *coneActor = vtkActor::New();
coneActor->SetMapper( coneMapper );
vtkActor *coneActor2 = vtkActor::New();
coneActor2->SetMapper( coneMapper );
vtkTransform* transform = vtkTransform::New();
coneActor2->SetUserTransform(transform);
//
// Create the Renderer and assign actors to it. A renderer is like a
// viewport. It is part or all of a window on the screen and it is
// responsible for drawing the actors it has. We also set the
background
// color here.
//
vtkRenderer *ren1= vtkRenderer::New();
ren1->AddActor( coneActor );
ren1->AddActor( coneActor2 );
ren1->SetBackground( 0.1, 0.2, 0.4 );
//
// Finally we create the render window which will show up on the
screen.
// We put our renderer into the render window using AddRenderer.
We also
// set the size to be 300 pixels by 300.
//
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer( ren1 );
renWin->SetSize( 300, 300 );
//
// The vtkRenderWindowInteractor class watches for events (e.g.,
keypress,
// mouse) in the vtkRenderWindow. These events are translated into
// event invocations that VTK understands (see VTK/Common/
vtkCommand.h
// for all events that VTK processes). Then observers of these VTK
// events can process them as appropriate.
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
//
// By default the vtkRenderWindowInteractor instantiates an instance
// of vtkInteractorStyle. vtkInteractorStyle translates a set of
events
// it observes into operations on the camera, actors, and/or
properties
// in the vtkRenderWindow associated with the
vtkRenderWinodwInteractor.
// Here we specify a particular interactor style.
vtkInteractorStyleSwitch *style =
vtkInteractorStyleSwitch::New();
iren->SetInteractorStyle(style);
//
// Unlike the previous scripts where we performed some operations
and then
// exited, here we leave an event loop running. The user can use
the mouse
// and keyboard to perform the operations on the scene according
to the
// current interaction style. When the user presses the "e" key,
by default
// an ExitEvent is invoked by the vtkRenderWindowInteractor which
is caught
// and drops out of the event loop (triggered by the Start()
method that
// follows.
//
iren->Initialize();
iren->Start();
//
// Final note: recall that an observers can watch for particular
events and
// take appropriate action. Pressing "u" in the render window
causes the
// vtkRenderWindowInteractor to invoke a UserEvent. This can be
caught to
// popup a GUI, etc. So the Tcl Cone5.tcl example for an idea of
how this
// works.
//
// Free up any objects we created. All instances in VTK are
deleted by
// using the Delete() method.
//
cone->Delete();
coneMapper->Delete();
coneActor->Delete();
coneActor2->Delete();
ren1->Delete();
renWin->Delete();
iren->Delete();
style->Delete();
return 0;
}
More information about the vtkusers
mailing list