Marine systems simulation
CContact.h
1#pragma once
2
3#include <iostream>
4#include <fstream>
5#include <algorithm>
6#include <vector>
7#include <Eigen/Eigen>
8
9#include "sfh/math/math.h"
10
11#include "SimObject.h"
12
13
14namespace Contact {
15
16typedef Eigen::Matrix<double,3,1> cvec3;
17typedef Eigen::Matrix<int,3,1> cvec3i;
18typedef Eigen::Quaternion<double> cquat;
19
20// Point-Point distance 3D ======================================================
21inline double PointDistance3D(const cvec3 &PA, const cvec3 &PB)
22{
23 return sqrt((PA(0)-PB(0))*(PA(0)-PB(0))+(PA(1)-PB(1))*(PA(1)-PB(1))+(PA(2)-PB(2))*(PA(2)-PB(2)));
24}
25// Point-Point distance 3D ======================================================
26
27// Point-Plane distance =========================================================
28inline double PointPlaneDis(const cvec3 &V0, const cvec3 &P0, const cvec3 &PN)
29{
30 cvec3 VP = V0-P0;
31 return VP.dot(PN.normalized());
32}
33// Point-Plane distance =========================================================
34
35// Ray-Triangle intersection ====================================================
36int rayTri(const cvec3 &V1, const cvec3 &V2, const cvec3 &V3, const cvec3 &O, const cvec3 &D, double &out);
37// Ray-Triangle intersection ====================================================
38
39// Segment-Plane intersection ===================================================
40int SegmentPlane(const cvec3 &S0, const cvec3 &S1, const cvec3 &P0, const cvec3 &PN, cvec3 &SPI);
41// Segment-Plane intersection ===================================================
42
43// AABB class ===================================================================
44class AABB {
45public:
46 cvec3 minloc, maxloc;
47
48 AABB() {
49 minloc(0) = minloc(1) = minloc(2) = std::numeric_limits<double>::max();
50 maxloc(0) = maxloc(1) = maxloc(2) = -std::numeric_limits<double>::max();
51 }
52
53 AABB(const AABB &aabb) {
54 minloc = aabb.minloc;
55 maxloc = aabb.maxloc;
56 }
57
58 ~AABB(){}
59
60 void add(const cvec3 &v) {
61 if (v(0) < minloc(0)) minloc(0) = v(0);
62 if (v(1) < minloc(1)) minloc(1) = v(1);
63 if (v(2) < minloc(2)) minloc(2) = v(2);
64 if (v(0) > maxloc(0)) maxloc(0) = v(0);
65 if (v(1) > maxloc(1)) maxloc(1) = v(1);
66 if (v(2) > maxloc(2)) maxloc(2) = v(2);
67 }
68
69 void clear() {
70 minloc(0) = minloc(1) = minloc(2) = std::numeric_limits<double>::max();
71 maxloc(0) = maxloc(1) = maxloc(2) = -std::numeric_limits<double>::max();
72 }
73
74 int overlap(const AABB &aabb)
75 {
76 if(maxloc(0) < aabb.minloc(0) || minloc(0) > aabb.maxloc(0)) return 0;
77 if(maxloc(1) < aabb.minloc(1) || minloc(1) > aabb.maxloc(1)) return 0;
78 if(maxloc(2) < aabb.minloc(2) || minloc(2) > aabb.maxloc(2)) return 0;
79
80 return 1;
81 }
82
83 double overlapvolume(const AABB &aabb, cvec3 &minol, cvec3 &maxol)
84 {
85 minol(0) = std::max(minloc(0),aabb.minloc(0));
86 maxol(0) = std::min(maxloc(0),aabb.maxloc(0));
87 minol(1) = std::max(minloc(1),aabb.minloc(1));
88 maxol(1) = std::min(maxloc(1),aabb.maxloc(1));
89 minol(2) = std::max(minloc(2),aabb.minloc(2));
90 maxol(2) = std::min(maxloc(2),aabb.maxloc(2));
91
92 double volume = std::abs((maxol(0)-minol(0))*(maxol(1)-minol(1))*(maxol(2)-minol(2)));
93
94 return volume;
95 }
96
97 int border(const AABB &aabb, double &tol)
98 {
99 if(PointDistance3D(minloc,aabb.minloc)>tol) return 0;
100 if(PointDistance3D(maxloc,aabb.maxloc)>tol) return 0;
101
102 return 1;
103 }
104};
105// AABB class ===================================================================
106
107// ContactObject class ==========================================================
108class ContactObject {
109public:
110 // Triangle mesh of the object
111 int numV; // Number of vertices.
112 cvec3* xyzVC; // Coordinate of each vertex relative to COG.
113 cvec3* xyzV; // Coordinate of each vertex.
114 int numF; // Number of faces.
115 cvec3i* indexF; // Index of faces.
116
117 double cKne; // Normal contact stiffness
118 double cKte; // Tangential contact stiffness
119 double cKnv; // Normal viscous damping
120 double cMui; // Surface friction
121 double cMaxP; // Maximum penetration depth in a contact point
122
123 double cMaxR; // Maximum detection radius
124
125 ISignalPort* InObjPos;
126 ISignalPort* InObjQuat;
127 ISignalPort* InObjVel;
128 ISignalPort* InObjOmega;
129
130 cvec3 objPos;
131 cquat objQuatL2G;
132 cvec3 objVel;
133 cvec3 objOmega;
134
135 AABB objAABB;
136
137 ContactObject(){}
138 virtual ~ContactObject();
139
140 void InitialSetup(ISimObjectCreator* creator);
141 void UpdateObjectState(const double T, const double* const X);
142
143 int PointPenetration(const cvec3 &O, const double &r, double &oPen, cvec3 &oInt);
144 void PointContactForce(const cvec3 &cPos, const cvec3 &cVel, const double &cPen, const cvec3 &cInt, cvec3 &cFor, cvec3 &cMon);
145
146 double PointDistance(const cvec3 &O, const double &r);
147};
148// ContactObject class ==========================================================
149
150} // namespace
ISignalPort * InObjOmega
Input object velocity.
Definition: CContact.h:126
cvec3 objPos
Input object angular velocity.
Definition: CContact.h:128
ISignalPort * InObjVel
Input object quaternion.
Definition: CContact.h:125
ISignalPort * InObjQuat
Input object position.
Definition: CContact.h:124