[vtk-developers] Line picking
pat marion
pat.marion at kitware.com
Sat Jan 23 13:22:30 EST 2010
I hacked one of the vtk examples to demonstrate the bug. Attached and
copied below. With the bug, it will only print "Pick success" when the x
coordinate of the mouse press is 150.
# CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(test)
find_package(VTK REQUIRED)
include(${VTK_USE_FILE})
add_executable(test test.cxx)
target_link_libraries(test vtkRendering)
// test.cxx
/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: line5.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 "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkCallbackCommand.h"
#include "vtkLineSource.h"
#include "vtkProperty.h"
#include "vtkPropPicker.h"
#include "vtkSmartPointer.h"
//-----------------------------------------------------------------------------
class PickHelper {
public:
PickHelper();
vtkSmartPointer<vtkCallbackCommand> Command;
vtkSmartPointer<vtkPropPicker> Picker;
vtkActor* Actor;
vtkRenderer* Renderer;
vtkRenderWindowInteractor* Interactor;
};
//-----------------------------------------------------------------------------
void ProcessEvents(vtkObject* object, unsigned long event,
void* clientData, void* callData)
{
PickHelper* h = reinterpret_cast<PickHelper*>(clientData);
if (event == vtkCommand::LeftButtonPressEvent)
{
int x = 150;
int y = 150;
h->Interactor->GetEventPosition(x, y);
printf("Mouse press: %d %d\n", x, y);
if (h->Picker->PickProp(x, y, h->Renderer)
&& h->Picker->GetViewProp() == h->Actor)
{
printf("Pick success.\n");
}
}
}
//-----------------------------------------------------------------------------
PickHelper::PickHelper()
{
this->Picker = vtkSmartPointer<vtkPropPicker>::New();
this->Command = vtkSmartPointer<vtkCallbackCommand>::New();
this->Command->SetCallback(ProcessEvents);
this->Command->SetClientData(this);
this->Picker->AddObserver(vtkCommand::EndPickEvent, Command);
}
int main()
{
//
// Next we create an instance of vtkLineSource and set some of its
// properties. The instance of vtkLineSource "line" is part of a
// visualization pipeline (it is a source process object); it produces
data
// (output type is vtkPolyData) which other filters may process.
//
vtkLineSource *line = vtkLineSource::New();
line->SetPoint1( 0, 0, 0);
line->SetPoint2( 0, 1, 0);
//
// 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 line souece to the input of this mapper.
//
vtkPolyDataMapper *lineMapper = vtkPolyDataMapper::New();
lineMapper->SetInputConnection( line->GetOutputPort() );
//
// Create an actor to represent the line. 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 lineMapper which we created
// above.
//
vtkActor *lineActor = vtkActor::New();
lineActor->SetMapper( lineMapper );
lineActor->GetProperty()->SetLineWidth(10);
//
// 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( lineActor );
ren1->SetBackground( 0.5, 0.5, 0.5 );
//
// 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.
vtkInteractorStyleTrackballCamera *style =
vtkInteractorStyleTrackballCamera::New();
iren->SetInteractorStyle(style);
// Initialize the picker
PickHelper helper;
helper.Actor = lineActor;
helper.Renderer = ren1;
helper.Interactor = iren;
iren->AddObserver(vtkCommand::LeftButtonPressEvent, helper.Command);
//
// 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 line5.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.
//
line->Delete();
lineMapper->Delete();
lineActor->Delete();
ren1->Delete();
renWin->Delete();
iren->Delete();
style->Delete();
return 0;
}
On Fri, Jan 22, 2010 at 1:18 PM, pat marion <pat.marion at kitware.com> wrote:
> Using vtkPropPicker::PickProp it is difficult to pick lines (using a
> vtkLineSource with a vtkPolyDataMapper for example). Even if I set the line
> width to 10 pixels, the pick is only successful if I click exactly in the
> center of the 10 pixel band, as if the hardware picker was not respecting
> the 10 pixel width. Can someone that is familiar with this part of vtk
> verify the bug, or point me in the right direction?
>
> Pat
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtk-developers/attachments/20100123/c63372e6/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pick_test.tar.gz
Type: application/x-gzip
Size: 2914 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/vtk-developers/attachments/20100123/c63372e6/attachment-0001.bin>
More information about the vtk-developers
mailing list