You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
5.3 KiB
138 lines
5.3 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkPicker.h,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.
|
|
|
|
=========================================================================*/
|
|
// .NAME vtkPicker - superclass for 3D geometric pickers (uses ray cast)
|
|
// .SECTION Description
|
|
// vtkPicker is used to select instances of vtkProp3D by shooting a ray
|
|
// into a graphics window and intersecting with the actor's bounding box.
|
|
// The ray is defined from a point defined in window (or pixel) coordinates,
|
|
// and a point located from the camera's position.
|
|
//
|
|
// vtkPicker may return more than one vtkProp3D, since more than one bounding
|
|
// box may be intersected. vtkPicker returns the list of props that were hit,
|
|
// the pick coordinates in world and untransformed mapper space, and the
|
|
// prop (vtkProp3D) and mapper that are "closest" to the camera. The closest
|
|
// prop is the one whose center point (i.e., center of bounding box)
|
|
// projected on the ray is closest to the camera.
|
|
|
|
// .SECTION See Also
|
|
// vtkPicker is used for quick geometric picking. If you desire to pick
|
|
// points or cells, use the subclass vtkPointPicker or vtkCellPicker,
|
|
// respectively. Or you may use hardware picking to pick any type of vtkProp
|
|
// - see vtkPropPicker or vtkWorldPointPicker.
|
|
|
|
#ifndef __vtkPicker_h
|
|
#define __vtkPicker_h
|
|
|
|
#include "vtkAbstractPropPicker.h"
|
|
|
|
class vtkAbstractMapper3D;
|
|
class vtkDataSet;
|
|
class vtkTransform;
|
|
class vtkActorCollection;
|
|
class vtkProp3DCollection;
|
|
class vtkPoints;
|
|
|
|
class VTK_RENDERING_EXPORT vtkPicker : public vtkAbstractPropPicker
|
|
{
|
|
public:
|
|
static vtkPicker *New();
|
|
vtkTypeRevisionMacro(vtkPicker,vtkAbstractPropPicker);
|
|
void PrintSelf(ostream& os, vtkIndent indent);
|
|
|
|
// Description:
|
|
// Specify tolerance for performing pick operation. Tolerance is specified
|
|
// as fraction of rendering window size. (Rendering window size is measured
|
|
// across diagonal.)
|
|
vtkSetMacro(Tolerance,double);
|
|
vtkGetMacro(Tolerance,double);
|
|
|
|
// Description:
|
|
// Return position in mapper (i.e., non-transformed) coordinates of
|
|
// pick point.
|
|
vtkGetVectorMacro(MapperPosition,double,3);
|
|
|
|
// Description:
|
|
// Return mapper that was picked (if any).
|
|
vtkGetObjectMacro(Mapper,vtkAbstractMapper3D);
|
|
|
|
// Description:
|
|
// Get a pointer to the dataset that was picked (if any). If nothing
|
|
// was picked then NULL is returned.
|
|
vtkGetObjectMacro(DataSet,vtkDataSet);
|
|
|
|
// Description:
|
|
// Return a collection of all the prop 3D's that were intersected
|
|
// by the pick ray. This collection is not sorted.
|
|
vtkProp3DCollection *GetProp3Ds() {return this->Prop3Ds;};
|
|
|
|
// Description:
|
|
// Return a collection of all the actors that were intersected.
|
|
// This collection is not sorted. (This is a convenience method
|
|
// to maintain backward compatibility.)
|
|
vtkActorCollection *GetActors();
|
|
|
|
// Description:
|
|
// Return a list of the points the the actors returned by GetActors
|
|
// were intersected at. The order of this list will match the order of
|
|
// GetActors.
|
|
vtkPoints *GetPickedPositions() {return this->PickedPositions;};
|
|
|
|
// Description:
|
|
// Perform pick operation with selection point provided. Normally the
|
|
// first two values for the selection point are x-y pixel coordinate, and
|
|
// the third value is =0. Return non-zero if something was successfully
|
|
// picked.
|
|
virtual int Pick(double selectionX, double selectionY, double selectionZ,
|
|
vtkRenderer *renderer);
|
|
|
|
// Description:
|
|
// Perform pick operation with selection point provided. Normally the first
|
|
// two values for the selection point are x-y pixel coordinate, and the
|
|
// third value is =0. Return non-zero if something was successfully picked.
|
|
int Pick(double selectionPt[3], vtkRenderer *ren)
|
|
{return this->Pick(selectionPt[0], selectionPt[1], selectionPt[2], ren);};
|
|
|
|
protected:
|
|
vtkPicker();
|
|
~vtkPicker();
|
|
|
|
void MarkPicked(vtkAssemblyPath *path, vtkProp3D *p, vtkAbstractMapper3D *m,
|
|
double tMin, double mapperPos[3]);
|
|
virtual double IntersectWithLine(double p1[3], double p2[3], double tol,
|
|
vtkAssemblyPath *path, vtkProp3D *p,
|
|
vtkAbstractMapper3D *m);
|
|
virtual void Initialize();
|
|
|
|
double Tolerance; //tolerance for computation (% of window)
|
|
double MapperPosition[3]; //selection point in untransformed coordinates
|
|
|
|
vtkAbstractMapper3D *Mapper; //selected mapper (if the prop has a mapper)
|
|
vtkDataSet *DataSet; //selected dataset (if there is one)
|
|
|
|
double GlobalTMin; //parametric coordinate along pick ray where hit occured
|
|
vtkTransform *Transform; //use to perform ray transformation
|
|
vtkActorCollection *Actors; //candidate actors (based on bounding box)
|
|
vtkProp3DCollection *Prop3Ds; //candidate actors (based on bounding box)
|
|
vtkPoints *PickedPositions; // candidate positions
|
|
|
|
private:
|
|
vtkPicker(const vtkPicker&); // Not implemented.
|
|
void operator=(const vtkPicker&); // Not implemented.
|
|
};
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|