VTK  9.0.1
vtkCollisionDetectionFilter.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkCollisionDetection.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14  Copyright (c) Goodwin Lawlor All rights reserved.
15  BSD 3-Clause License
16 
17  Redistribution and use in source and binary forms, with or without
18  modification, are permitted provided that the following conditions are
19  met:
20 
21  Redistributions of source code must retain the above copyright notice,
22  this list of conditions and the following disclaimer.
23 
24  Redistributions in binary form must reproduce the above copyright
25  notice, this list of conditions and the following disclaimer in the
26  documentation and/or other materials provided with the distribution.
27 
28  Neither the name of the copyright holder nor the names of its
29  contributors may be used to endorse or promote products derived from
30  this software without specific prior written permission.
31 
32  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33  AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
35  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
37  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
38  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
39  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
40  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
41  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
42  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43 =========================================================================*/
44 
64 /*
65  * @warning
66  * Currently only triangles are processed. Use vtkTriangleFilter to
67  * convert any strips or polygons to triangles.
68  */
70 
72 /*
73  * @cite
74  * Goodwin Lawlor <goodwin.lawlor@ucd.ie>, University College Dublin,
75  * who wrote this class.
76  * Thanks to Peter C. Everett
77  * <pce@world.std.com> for vtkOBBTree::IntersectWithOBBTree() in
78  * particular, and all those who contributed to vtkOBBTree in general.
79  * The original code was contained here: https://github.com/glawlor/vtkbioeng
80  *
81  */
83 
85 /*
86  * @see
87  * vtkTriangleFilter, vtkSelectPolyData, vtkOBBTree
88  */
90 
91 #ifndef vtkCollisionDetectionFilter_h
92 #define vtkCollisionDetectionFilter_h
93 
94 #include "vtkFieldData.h" // For GetContactCells
95 #include "vtkFiltersModelingModule.h" // For export macro
96 #include "vtkPolyDataAlgorithm.h"
97 
98 class vtkOBBTree;
99 class vtkPolyData;
100 class vtkPoints;
101 class vtkMatrix4x4;
102 class vtkLinearTransform;
103 class vtkIdTypeArray;
104 
105 class VTKFILTERSMODELING_EXPORT vtkCollisionDetectionFilter : public vtkPolyDataAlgorithm
106 {
107 public:
109 
114  void PrintSelf(ostream& os, vtkIndent indent) override;
116 
118  {
119  VTK_ALL_CONTACTS = 0,
120  VTK_FIRST_CONTACT = 1,
121  VTK_HALF_CONTACTS = 2
122  };
123 
125 
130  vtkSetClampMacro(CollisionMode, int, VTK_ALL_CONTACTS, VTK_HALF_CONTACTS);
131  vtkGetMacro(CollisionMode, int);
132 
133  void SetCollisionModeToAllContacts() { this->SetCollisionMode(VTK_ALL_CONTACTS); }
134  void SetCollisionModeToFirstContact() { this->SetCollisionMode(VTK_FIRST_CONTACT); }
135  void SetCollisionModeToHalfContacts() { this->SetCollisionMode(VTK_HALF_CONTACTS); }
136  const char* GetCollisionModeAsString(void)
137  {
138  if (this->CollisionMode == VTK_ALL_CONTACTS)
139  {
140  return "AllContacts";
141  }
142  else if (this->CollisionMode == VTK_FIRST_CONTACT)
143  {
144  return "FirstContact";
145  }
146  else
147  {
148  return "HalfContacts";
149  }
150  }
152 
154 
161  int IntersectPolygonWithPolygon(int npts, double* pts, double bounds[6], int npts2, double* pts2,
162  double bounds2[6], double tol2, double x1[2], double x2[3], int CollisionMode);
164 
166 
169  void SetInputData(int i, vtkPolyData* model);
172 
174 
182 
184 
188  vtkPolyData* GetContactsOutput() { return this->GetOutput(2); }
190 
192  /* Specify the transform object used to transform models. Alternatively, matrices
193  * can be set instead.
194 ` */
195  void SetTransform(int i, vtkLinearTransform* transform);
196  vtkLinearTransform* GetTransform(int i) { return this->Transform[i]; }
198 
200  /* Specify the matrix object used to transform models.
201  */
202  void SetMatrix(int i, vtkMatrix4x4* matrix);
205 
207  /* Set and Get the obb tolerance (absolute value, in world coords). Default is 0.001
208  */
209  vtkSetMacro(BoxTolerance, float);
210  vtkGetMacro(BoxTolerance, float);
212 
214  /* Set and Get the cell tolerance (squared value). Default is 0.0
215  */
216  vtkSetMacro(CellTolerance, double);
217  vtkGetMacro(CellTolerance, double);
219 
221  /*
222  * Set and Get the the flag to visualize the contact cells. If set the contacting cells
223  * will be coloured from red through to blue, with collisions first determined coloured red.
224  */
225  vtkSetMacro(GenerateScalars, int);
226  vtkGetMacro(GenerateScalars, int);
227  vtkBooleanMacro(GenerateScalars, int);
229 
231  /*
232  * Get the number of contacting cell pairs
233  */
235  {
236  return this->GetOutput(0)->GetFieldData()->GetArray("ContactCells")->GetNumberOfTuples();
237  }
239 
241  /*
242  * Get the number of box tests
243  */
244  vtkGetMacro(NumberOfBoxTests, int);
246 
248  /*
249  * Set and Get the number of cells in each OBB. Default is 2
250  */
251  vtkSetMacro(NumberOfCellsPerNode, int);
252  vtkGetMacro(NumberOfCellsPerNode, int);
254 
256  /*
257  * Set and Get the opacity of the polydata output when a collision takes place.
258  * Default is 1.0
259  */
260  vtkSetClampMacro(Opacity, float, 0.0, 1.0);
261  vtkGetMacro(Opacity, float);
263 
265  /*
266  * Return the MTime also considering the transform.
267  */
268  vtkMTimeType GetMTime() override;
270 
271 protected:
274 
275  // Usual data generation method
279 
281  vtkMatrix4x4* Matrix[2];
282 
284 
286 
288 
291  float Opacity;
292 
294 
295 private:
297  void operator=(const vtkCollisionDetectionFilter&) = delete;
298 };
299 
300 #endif
vtkIdType GetNumberOfTuples() const
Get the number of complete tuples (a component group) in the array.
Proxy object to connect input/output ports.
vtkAlgorithmOutput * GetOutputPort()
Definition: vtkAlgorithm.h:468
performs collision determination between two polyhedral surfaces
vtkMatrix4x4 * GetMatrix(int i)
void SetTransform(int i, vtkLinearTransform *transform)
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)
virtual int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *) override
This is called by the superclass.
~vtkCollisionDetectionFilter() override
vtkPolyData * GetInputData(int i)
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
void SetInputData(int i, vtkPolyData *model)
Set and Get the input vtk polydata models.
void SetMatrix(int i, vtkMatrix4x4 *matrix)
int IntersectPolygonWithPolygon(int npts, double *pts, double bounds[6], int npts2, double *pts2, double bounds2[6], double tol2, double x1[2], double x2[3], int CollisionMode)
Description: Intersect two polygons, return x1 and x2 as the two points of intersection.
vtkAlgorithmOutput * GetContactsOutputPort()
Get the output with the points where the contacting cells intersect.
virtual vtkFieldData * GetFieldData()
vtkDataArray * GetArray(int i)
Not recommended for use.
dynamic, self-adjusting array of vtkIdType
a simple class to control print indentation
Definition: vtkIndent.h:34
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:36
generate oriented bounding box (OBB) tree
Definition: vtkOBBTree.h:86
represent and manipulate 3D points
Definition: vtkPoints.h:34
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:85
@ Transform
Definition: vtkX3D.h:47
vtkTypeUInt32 vtkMTimeType
Definition: vtkType.h:293