VTK  9.1.0
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
73/*
74 * @warning
75 * Currently only triangles are processed. Use vtkTriangleFilter to
76 * convert any strips or polygons to triangles.
77 */
79
81/*
82 * @cite
83 * Goodwin Lawlor <goodwin.lawlor@ucd.ie>, University College Dublin,
84 * who wrote this class.
85 * Thanks to Peter C. Everett
86 * <pce@world.std.com> for vtkOBBTree::IntersectWithOBBTree() in
87 * particular, and all those who contributed to vtkOBBTree in general.
88 * The original code was contained here: https://github.com/glawlor/vtkbioeng
89 *
90 */
92
94/*
95 * @see
96 * vtkTriangleFilter, vtkSelectPolyData, vtkOBBTree
97 */
99
100#ifndef vtkCollisionDetectionFilter_h
101#define vtkCollisionDetectionFilter_h
102
103#include "vtkFieldData.h" // For GetContactCells
104#include "vtkFiltersModelingModule.h" // For export macro
105#include "vtkPolyDataAlgorithm.h"
106
107class vtkOBBTree;
108class vtkPolyData;
109class vtkPoints;
110class vtkMatrix4x4;
112class vtkIdTypeArray;
113
114class VTKFILTERSMODELING_EXPORT vtkCollisionDetectionFilter : public vtkPolyDataAlgorithm
115{
116public:
118
123 void PrintSelf(ostream& os, vtkIndent indent) override;
125
127 {
128 VTK_ALL_CONTACTS = 0,
129 VTK_FIRST_CONTACT = 1,
130 VTK_HALF_CONTACTS = 2
131 };
132
134
139 vtkSetClampMacro(CollisionMode, int, VTK_ALL_CONTACTS, VTK_HALF_CONTACTS);
140 vtkGetMacro(CollisionMode, int);
141
142 void SetCollisionModeToAllContacts() { this->SetCollisionMode(VTK_ALL_CONTACTS); }
143 void SetCollisionModeToFirstContact() { this->SetCollisionMode(VTK_FIRST_CONTACT); }
144 void SetCollisionModeToHalfContacts() { this->SetCollisionMode(VTK_HALF_CONTACTS); }
145 const char* GetCollisionModeAsString(void)
146 {
147 if (this->CollisionMode == VTK_ALL_CONTACTS)
148 {
149 return "AllContacts";
150 }
151 else if (this->CollisionMode == VTK_FIRST_CONTACT)
152 {
153 return "FirstContact";
154 }
155 else
156 {
157 return "HalfContacts";
158 }
159 }
161
163
170 int IntersectPolygonWithPolygon(int npts, double* pts, double bounds[6], int npts2, double* pts2,
171 double bounds2[6], double tol2, double x1[2], double x2[3], int CollisionMode);
173
175
178 void SetInputData(int i, vtkPolyData* model);
181
183
191
193
199
201 /* Specify the transform object used to transform models. Alternatively, matrices
202 * can be set instead.
203` */
204 void SetTransform(int i, vtkLinearTransform* transform);
205 vtkLinearTransform* GetTransform(int i) { return this->Transform[i]; }
207
209 /* Specify the matrix object used to transform models.
210 */
211 void SetMatrix(int i, vtkMatrix4x4* matrix);
214
216 /* Set and Get the obb tolerance (absolute value, in world coords). Default is 0.001
217 */
218 vtkSetMacro(BoxTolerance, float);
219 vtkGetMacro(BoxTolerance, float);
221
223 /* Set and Get the cell tolerance (squared value). Default is 0.0
224 */
225 vtkSetMacro(CellTolerance, double);
226 vtkGetMacro(CellTolerance, double);
228
230 /*
231 * Set and Get the the flag to visualize the contact cells. If set the contacting cells
232 * will be coloured from red through to blue, with collisions first determined coloured red.
233 */
234 vtkSetMacro(GenerateScalars, int);
235 vtkGetMacro(GenerateScalars, int);
236 vtkBooleanMacro(GenerateScalars, int);
238
240 /*
241 * Get the number of contacting cell pairs.
242 *
243 * @note If FirstContact mode is set, it will return either 0 or 1.
244 * @warning It is mandatory to call Update() before, otherwise -1 is returned
245 * @return -1 if internal nullptr is found, otherwise the number of contacts found
246 */
249
251 /*
252 * Get the number of box tests
253 */
254 vtkGetMacro(NumberOfBoxTests, int);
256
258 /*
259 * Set and Get the number of cells in each OBB. Default is 2
260 */
261 vtkSetMacro(NumberOfCellsPerNode, int);
262 vtkGetMacro(NumberOfCellsPerNode, int);
264
266 /*
267 * Set and Get the opacity of the polydata output when a collision takes place.
268 * Default is 1.0
269 */
270 vtkSetClampMacro(Opacity, float, 0.0, 1.0);
271 vtkGetMacro(Opacity, float);
273
275 /*
276 * Return the MTime also considering the transform.
277 */
280
281protected:
284
285 // Usual data generation method
289
291 vtkMatrix4x4* Matrix[2];
292
294
296
298
301 float Opacity;
302
304
305private:
307 void operator=(const vtkCollisionDetectionFilter&) = delete;
308};
309
310#endif
Proxy object to connect input/output ports.
vtkAlgorithmOutput * GetOutputPort()
Definition: vtkAlgorithm.h:479
performs collision determination between two polyhedral surfaces
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.
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 ...
void SetTransform(int i, vtkLinearTransform *transform)
vtkIdTypeArray * GetContactCells(int i)
Get an array of the contacting cells.
vtkPolyData * GetInputData(int i)
Set and Get the input vtk polydata models.
vtkMTimeType GetMTime() override
Return this object's modified time.
vtkMatrix4x4 * GetMatrix(int i)
static vtkCollisionDetectionFilter * New()
Standard methods for construction, type and printing.
~vtkCollisionDetectionFilter() override
void SetCollisionModeToHalfContacts()
Set the collision mode to VTK_ALL_CONTACTS to find all the contacting cell pairs with two points per ...
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.
const char * GetCollisionModeAsString(void)
Set the collision mode to VTK_ALL_CONTACTS to find all the contacting cell pairs with two points per ...
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 ...
vtkLinearTransform * GetTransform(int i)
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.
dynamic, self-adjusting array of vtkIdType
a simple class to control print indentation
Definition: vtkIndent.h:43
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:45
generate oriented bounding box (OBB) tree
Definition: vtkOBBTree.h:95
represent and manipulate 3D points
Definition: vtkPoints.h:43
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:95
@ Transform
Definition: vtkX3D.h:47
vtkTypeUInt32 vtkMTimeType
Definition: vtkType.h:287