VTK  9.3.20240329
vtkCollisionDetectionFilter.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-FileCopyrightText: Copyright (c) Goodwin Lawlor All rights reserved
3 // SPDX-License-Identifier: BSD-3-Clause
47 /*
49  * @warning
50  * Currently only triangles are processed. Use vtkTriangleFilter to
51  * convert any strips or polygons to triangles.
52  */
54 
56 /*
57  * @cite
58  * Goodwin Lawlor <goodwin.lawlor@ucd.ie>, University College Dublin,
59  * who wrote this class.
60  * Thanks to Peter C. Everett
61  * <pce@world.std.com> for vtkOBBTree::IntersectWithOBBTree() in
62  * particular, and all those who contributed to vtkOBBTree in general.
63  * The original code was contained here: https://github.com/glawlor/vtkbioeng
64  *
65  */
67 
69 /*
70  * @see
71  * vtkTriangleFilter, vtkSelectPolyData, vtkOBBTree
72  */
74 
75 #ifndef vtkCollisionDetectionFilter_h
76 #define vtkCollisionDetectionFilter_h
77 
78 #include "vtkFieldData.h" // For GetContactCells
79 #include "vtkFiltersModelingModule.h" // For export macro
80 #include "vtkPolyDataAlgorithm.h"
81 
82 VTK_ABI_NAMESPACE_BEGIN
83 class vtkOBBTree;
84 class vtkPolyData;
85 class vtkPoints;
86 class vtkMatrix4x4;
87 class vtkLinearTransform;
88 class vtkIdTypeArray;
89 
90 class VTKFILTERSMODELING_EXPORT vtkCollisionDetectionFilter : public vtkPolyDataAlgorithm
91 {
92 public:
94 
99  void PrintSelf(ostream& os, vtkIndent indent) override;
101 
103  {
104  VTK_ALL_CONTACTS = 0,
105  VTK_FIRST_CONTACT = 1,
106  VTK_HALF_CONTACTS = 2
107  };
108 
110 
115  vtkSetClampMacro(CollisionMode, int, VTK_ALL_CONTACTS, VTK_HALF_CONTACTS);
116  vtkGetMacro(CollisionMode, int);
117 
118  void SetCollisionModeToAllContacts() { this->SetCollisionMode(VTK_ALL_CONTACTS); }
119  void SetCollisionModeToFirstContact() { this->SetCollisionMode(VTK_FIRST_CONTACT); }
120  void SetCollisionModeToHalfContacts() { this->SetCollisionMode(VTK_HALF_CONTACTS); }
122  {
123  if (this->CollisionMode == VTK_ALL_CONTACTS)
124  {
125  return "AllContacts";
126  }
127  else if (this->CollisionMode == VTK_FIRST_CONTACT)
128  {
129  return "FirstContact";
130  }
131  else
132  {
133  return "HalfContacts";
134  }
135  }
137 
139 
146  int IntersectPolygonWithPolygon(int npts, double* pts, double bounds[6], int npts2, double* pts2,
147  double bounds2[6], double tol2, double x1[3], double x2[3], int CollisionMode);
149 
151 
154  void SetInputData(int i, vtkPolyData* model);
157 
159 
167 
169 
173  vtkPolyData* GetContactsOutput() { return this->GetOutput(2); }
175 
177  /* Specify the transform object used to transform models. Alternatively, matrices
178  * can be set instead.
179 ` */
180  void SetTransform(int i, vtkLinearTransform* transform);
181  vtkLinearTransform* GetTransform(int i) { return this->Transform[i]; }
183 
185  /* Specify the matrix object used to transform models.
186  */
187  void SetMatrix(int i, vtkMatrix4x4* matrix);
190 
192  /* Set and Get the obb tolerance (absolute value, in world coords). Default is 0.001
193  */
194  vtkSetMacro(BoxTolerance, float);
195  vtkGetMacro(BoxTolerance, float);
197 
199  /* Set and Get the cell tolerance (squared value). Default is 0.0
200  */
201  vtkSetMacro(CellTolerance, double);
202  vtkGetMacro(CellTolerance, double);
204 
206  /*
207  * Set and Get the the flag to visualize the contact cells. If set the contacting cells
208  * will be coloured from red through to blue, with collisions first determined coloured red.
209  */
210  vtkSetMacro(GenerateScalars, int);
211  vtkGetMacro(GenerateScalars, int);
212  vtkBooleanMacro(GenerateScalars, int);
214 
216  /*
217  * Get the number of contacting cell pairs.
218  *
219  * @note If FirstContact mode is set, it will return either 0 or 1.
220  * @warning It is mandatory to call Update() before, otherwise -1 is returned
221  * @return -1 if internal nullptr is found, otherwise the number of contacts found
222  */
225 
227  /*
228  * Get the number of box tests
229  */
230  vtkGetMacro(NumberOfBoxTests, int);
232 
234  /*
235  * Set and Get the number of cells in each OBB. Default is 2
236  */
237  vtkSetMacro(NumberOfCellsPerNode, int);
238  vtkGetMacro(NumberOfCellsPerNode, int);
240 
242  /*
243  * Set and Get the opacity of the polydata output when a collision takes place.
244  * Default is 1.0
245  */
246  vtkSetClampMacro(Opacity, float, 0.0, 1.0);
247  vtkGetMacro(Opacity, float);
249 
251  /*
252  * Return the MTime also considering the transform.
253  */
254  vtkMTimeType GetMTime() override;
256 
257 protected:
260 
261  // Usual data generation method
265 
267  vtkMatrix4x4* Matrix[2];
268 
270 
272 
274 
277  float Opacity;
278 
280 
281 private:
283  void operator=(const vtkCollisionDetectionFilter&) = delete;
284 };
285 
286 VTK_ABI_NAMESPACE_END
287 #endif
Proxy object to connect input/output ports.
vtkAlgorithmOutput * GetOutputPort()
Definition: vtkAlgorithm.h:610
performs collision determination between two polyhedral surfaces
int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *) override
This is called by the superclass.
void SetCollisionModeToFirstContact()
Set the collision mode to VTK_ALL_CONTACTS to find all the contacting cell pairs with two points per ...
vtkMatrix4x4 * GetMatrix(int i)
void SetTransform(int i, vtkLinearTransform *transform)
const char * GetCollisionModeAsString()
Set the collision mode to VTK_ALL_CONTACTS to find all the contacting cell pairs with two points per ...
static vtkCollisionDetectionFilter * New()
Standard methods for construction, type and printing.
vtkMTimeType GetMTime() override
Return this object's modified time.
vtkIdTypeArray * GetContactCells(int i)
Get an array of the contacting cells.
vtkLinearTransform * GetTransform(int i)
~vtkCollisionDetectionFilter() override
void SetCollisionModeToHalfContacts()
Set the collision mode to VTK_ALL_CONTACTS to find all the contacting cell pairs with two points per ...
vtkPolyData * GetInputData(int i)
Set and Get the input vtk polydata models.
void PrintSelf(ostream &os, vtkIndent indent) override
Standard methods for construction, type and printing.
void SetInputData(int i, vtkPolyData *model)
Set and Get the input vtk polydata models.
int IntersectPolygonWithPolygon(int npts, double *pts, double bounds[6], int npts2, double *pts2, double bounds2[6], double tol2, double x1[3], double x2[3], int CollisionMode)
Description: Intersect two polygons, return x1 and x2 as the two points of intersection.
void SetMatrix(int i, vtkMatrix4x4 *matrix)
void SetCollisionModeToAllContacts()
Set the collision mode to VTK_ALL_CONTACTS to find all the contacting cell pairs with two points per ...
vtkAlgorithmOutput * GetContactsOutputPort()
Get the output with the points where the contacting cells intersect.
vtkPolyData * GetContactsOutput()
Get the output with the points where the contacting cells intersect.
dynamic, self-adjusting array of vtkIdType
a simple class to control print indentation
Definition: vtkIndent.h:108
Store zero or more vtkInformation instances.
Store vtkAlgorithm input/output information.
abstract superclass for linear transformations
represent and manipulate 4x4 transformation matrices
Definition: vtkMatrix4x4.h:141
generate oriented bounding box (OBB) tree
Definition: vtkOBBTree.h:165
represent and manipulate 3D points
Definition: vtkPoints.h:139
Superclass for algorithms that produce only polydata as output.
vtkPolyData * GetOutput()
Get the output data object for a port on this algorithm.
concrete dataset represents vertices, lines, polygons, and triangle strips
Definition: vtkPolyData.h:181
@ Transform
Definition: vtkX3D.h:41
vtkTypeUInt32 vtkMTimeType
Definition: vtkType.h:270