1 #ifndef SimTK_SIMMATH_CONTACT_GEOMETRY_H_ 2 #define SimTK_SIMMATH_CONTACT_GEOMETRY_H_ 46 class ContactGeometryImpl;
47 class OBBTreeNodeImpl;
148 Vec3 findNearestPoint(
const Vec3& position,
bool& inside,
UnitVec3& normal)
const;
164 Vec3 projectDownhillToNearestPoint(
const Vec3& pointQ)
const;
230 bool trackSeparationFromLine(
const Vec3& pointOnLine,
232 const Vec3& startingGuessForClosestPoint,
233 Vec3& newClosestPointOnSurface,
234 Vec3& closestPointOnLine,
250 bool intersectsRay(
const Vec3& origin,
const UnitVec3& direction,
258 void getBoundingSphere(
Vec3& center,
Real& radius)
const;
263 bool isSmooth()
const;
294 const Function& getImplicitFunction()
const;
301 Real calcSurfaceValue(
const Vec3& point)
const;
313 UnitVec3 calcSurfaceUnitNormal(
const Vec3& point)
const;
320 Vec3 calcSurfaceGradient(
const Vec3& point)
const;
327 Mat33 calcSurfaceHessian(
const Vec3& point)
const;
357 Real calcGaussianCurvature(
const Vec3& gradient,
358 const Mat33& Hessian)
const;
364 return calcGaussianCurvature(calcSurfaceGradient(point),
365 calcSurfaceHessian(point));
376 Real calcSurfaceCurvatureInDirection(
const Vec3& point,
const UnitVec3& direction)
const;
386 void calcSurfacePrincipalCurvatures(
const Vec3& point,
Vec2& curvature,
391 bool isConvex()
const;
456 const Vec3& d2Pdu2,
const Vec3& d2Pdv2,
533 static void combineParaboloids(
const Rotation& R_SP1,
const Vec2& k1,
541 static void combineParaboloids(
const Rotation& R_SP1,
const Vec2& k1,
559 void initGeodesic(
const Vec3& xP,
const Vec3& xQ,
const Vec3& xSP,
606 void continueGeodesic(
const Vec3& xP,
const Vec3& xQ,
const Geodesic& prevGeod,
635 void makeStraightLineGeodesic(
const Vec3& xP,
const Vec3& xQ,
636 const UnitVec3& defaultDirectionIfNeeded,
650 void shootGeodesicInDirectionUntilLengthReached
667 void calcGeodesicReverseSensitivity
669 const Vec2& initSensitivity =
Vec2(0,1))
const;
683 void shootGeodesicInDirectionUntilPlaneHit(
const Vec3& xP,
const UnitVec3& tP,
690 void calcGeodesic(
const Vec3& xP,
const Vec3& xQ,
695 void calcGeodesicUsingOrthogonalMethod(
const Vec3& xP,
const Vec3& xQ,
703 const Vec3 r_PQ = xQ - xP;
704 const Real lengthHint = r_PQ.
norm();
705 const UnitVec3 n = calcSurfaceUnitNormal(xP);
707 const Vec3 t_PQ = r_PQ - (~r_PQ*
n)*n;
710 tLength != 0 ?
UnitVec3(t_PQ/tLength,
true)
712 calcGeodesicUsingOrthogonalMethod(xP, xQ,
Vec3(tPhint), lengthHint, geod);
740 void shootGeodesicInDirectionUntilLengthReachedAnalytical
757 void shootGeodesicInDirectionUntilPlaneHitAnalytical(
const Vec3& xP,
const UnitVec3& tP,
766 void calcGeodesicAnalytical(
const Vec3& xP,
const Vec3& xQ,
777 Vec2 calcSplitGeodErrorAnalytical(
const Vec3& P,
const Vec3& Q,
791 const Plane& getPlane()
const;
794 void setPlane(
const Plane& plane)
const;
799 const int getNumGeodesicsShot()
const;
806 bool isOwnerHandle()
const;
807 bool isEmptyHandle()
const;
810 const ContactGeometryImpl&
getImpl()
const {assert(impl);
return *impl;}
812 ContactGeometryImpl&
updImpl() {assert(impl);
return *impl; }
840 {
return geo.
getTypeId()==classTypeId(); }
843 { assert(isInstance(geo));
return static_cast<const HalfSpace&
>(geo); }
846 { assert(isInstance(geo));
return static_cast<HalfSpace&
>(geo); }
852 const Impl& getImpl()
const;
867 Real getRadius()
const;
868 void setRadius(
Real radius);
872 {
return geo.
getTypeId()==classTypeId(); }
875 { assert(isInstance(geo));
return static_cast<const Cylinder&
>(geo); }
878 { assert(isInstance(geo));
return static_cast<Cylinder&
>(geo); }
884 const Impl& getImpl()
const;
898 Real getRadius()
const;
899 void setRadius(
Real radius);
903 {
return geo.
getTypeId()==classTypeId(); }
906 { assert(isInstance(geo));
return static_cast<const Sphere&
>(geo); }
909 { assert(isInstance(geo));
return static_cast<Sphere&
>(geo); }
915 const Impl& getImpl()
const;
953 const Vec3& getRadii()
const;
959 void setRadii(
const Vec3& radii);
966 const Vec3& getCurvatures()
const;
999 Vec3 findPointInSameDirection(
const Vec3& Q)
const;
1030 void findParaboloidAtPointWithNormal(
const Vec3& Q,
const UnitVec3& n,
1035 {
return geo.
getTypeId()==classTypeId(); }
1038 { assert(isInstance(geo));
return static_cast<const Ellipsoid&
>(geo); }
1041 { assert(isInstance(geo));
return static_cast<Ellipsoid&
>(geo); }
1047 const Impl& getImpl()
const;
1080 const OBBTree& getOBBTree()
const;
1084 {
return geo.
getTypeId()==classTypeId(); }
1087 { assert(isInstance(geo));
return static_cast<const SmoothHeightMap&
>(geo); }
1090 { assert(isInstance(geo));
return static_cast<SmoothHeightMap&
>(geo); }
1096 const Impl& getImpl()
const;
1110 explicit Brick(
const Vec3& halfLengths);
1114 const Vec3& getHalfLengths()
const;
1116 void setHalfLengths(
const Vec3& halfLengths);
1123 {
return geo.
getTypeId()==classTypeId(); }
1126 { assert(isInstance(geo));
return static_cast<const Brick&
>(geo); }
1129 { assert(isInstance(geo));
return static_cast<Brick&
>(geo); }
1135 const Impl& getImpl()
const;
1188 int getNumEdges()
const;
1190 int getNumFaces()
const;
1192 int getNumVertices()
const;
1196 const Vec3& getVertexPosition(
int index)
const;
1202 int getFaceEdge(
int face,
int edge)
const;
1207 int getFaceVertex(
int face,
int vertex)
const;
1212 int getEdgeFace(
int edge,
int face)
const;
1217 int getEdgeVertex(
int edge,
int vertex)
const;
1222 void findVertexEdges(
int vertex,
Array_<int>& edges)
const;
1225 const UnitVec3& getFaceNormal(
int face)
const;
1228 Real getFaceArea(
int face)
const;
1234 Vec3 findPoint(
int face,
const Vec2& uv)
const;
1239 Vec3 findCentroid(
int face)
const;
1244 UnitVec3 findNormalAtPoint(
int face,
const Vec2& uv)
const;
1255 Vec3 findNearestPoint(
const Vec3& position,
bool& inside,
UnitVec3& normal)
const;
1268 Vec3 findNearestPoint(
const Vec3& position,
bool& inside,
int& face,
Vec2& uv)
const;
1279 Vec3 findNearestPointToFace(
const Vec3& position,
int face,
Vec2& uv)
const;
1307 bool intersectsRay(
const Vec3& origin,
const UnitVec3& direction,
Real& distance,
int& face,
Vec2& uv)
const;
1318 {
return geo.
getTypeId()==classTypeId(); }
1321 { assert(isInstance(geo));
return static_cast<const TriangleMesh&
>(geo); }
1324 { assert(isInstance(geo));
return static_cast<TriangleMesh&
>(geo); }
1330 const Impl& getImpl()
const;
1350 bool isLeafNode()
const;
1363 int getNumTriangles()
const;
1366 const OBBTreeNodeImpl* impl;
1380 Real getTorusRadius()
const;
1381 void setTorusRadius(
Real radius);
1382 Real getTubeRadius()
const;
1383 void setTubeRadius(
Real radius);
1387 {
return geo.
getTypeId()==classTypeId(); }
1390 { assert(isInstance(geo));
return static_cast<const Torus&
>(geo); }
1393 { assert(isInstance(geo));
return static_cast<Torus&
>(geo); }
1399 const Impl& getImpl()
const;
1416 Plane() : m_normal(1,0,0), m_offset(0) { }
1418 : m_normal(normal), m_offset(offset) { }
1421 return ~m_normal*pt - m_offset;
1458 Real dist = plane.getDistance(endpt);
1472 endpt[0] = q[0]; endpt[1] = q[1]; endpt[2] = q[2];
1473 Real dist = plane.getDistance(endpt);
1476 shouldTerminate =
true;
1489 enabled = enabledFlag;
1497 mutable Plane plane;
1508 m_x(x), m_O(O), m_I(I), m_color(color) { }
1515 P[0] = m_x[0]; P[1] = m_x[1]; P[2] = m_x[2];
1516 Q[0] = m_x[3]; Q[1] = m_x[4]; Q[2] = m_x[5];
1525 .setLineThickness(2));
1528 .setLineThickness(2));
1536 const Vec3& m_color;
1548 m_plane(plane), m_color(color) { }
1555 R_plane.setRotationFromOneAxis(
UnitVec3(m_plane.getNormal()),
1558 offset[0] = m_plane.getOffset();
1561 .setTransform(
Transform(R_plane, R_plane*offset))
1563 .setOpacity(
Real(.2)));
1567 const Plane& m_plane;
1568 const Vec3& m_color;
1576 #endif // SimTK_SIMMATH_CONTACT_GEOMETRY_H_ This class will create a smooth surface that approximates a two-argument function F(X...
Definition: BicubicSurface.h:158
ScheduledEventReporter is a subclass of EventReporter for events that occur at a particular time that...
Definition: EventReporter.h:72
UnitVec< P, 1 > perp() const
Return a new unit vector perpendicular to this one but otherwise arbitrary.
Definition: UnitVec.h:182
Plane(const Vec3 &normal, const Real &offset)
Definition: ContactGeometry.h:1417
This defines a rectangular solid centered at the origin and aligned with the local frame axes...
Definition: DecorativeGeometry.h:424
SimTK_DEFINE_UNIQUE_INDEX_TYPE(AssemblyConditionIndex)
A simple plane class.
Definition: ContactGeometry.h:1414
UnitVec< Real, 1 > UnitVec3
Definition: UnitVec.h:41
This class generates decoration for contact points and straight line path segments.
Definition: ContactGeometry.h:1505
const void setEnabled(bool enabledFlag)
Definition: ContactGeometry.h:1488
Plane()
Definition: ContactGeometry.h:1416
GeodHitPlaneEvent(const Plane &aplane)
Definition: ContactGeometry.h:1447
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with o...
Definition: Assembler.h:37
const bool isEnabled()
Definition: ContactGeometry.h:1492
Definition: CoordinateAxis.h:194
This class is basically a glorified enumerated type, type-safe and range checked but permitting conve...
Definition: Stage.h:50
PathDecorator(const Vector &x, const Vec3 &O, const Vec3 &I, const Vec3 &color)
Definition: ContactGeometry.h:1507
This class stores a geodesic curve after it has been determined.
Definition: Geodesic.h:51
This file defines the BicubicSurface class, and the BicubicFunction class that uses it to create a tw...
A 3d rectangular box aligned with an unspecified frame F and centered at that frame's origin...
Definition: Geo.h:61
This class represents a rectangular box with arbitrary position and orientation.
Definition: OrientedBoundingBox.h:42
void handleEvent(State &state, Real accuracy, bool &shouldTerminate) const
This method is invoked to handle the event.
Definition: ContactGeometry.h:1464
SimTK_Real Real
This is the default compiled-in floating point type for SimTK, either float or double.
Definition: SimTKcommon/include/SimTKcommon/internal/common.h:593
virtual void generateDecorations(const State &state, Array_< DecorativeGeometry > &geometry)
This will be called every time a new State is about to be visualized.
Definition: ContactGeometry.h:1550
PlaneDecorator(const Plane &plane, const Vec3 &color)
Definition: ContactGeometry.h:1547
This object is intended to contain all state information for a SimTK::System, except topological info...
Definition: State.h:276
const Complex I
We only need one complex constant, i = sqrt(-1). For the rest just multiply the real constant by i...
Includes internal headers providing declarations for the basic SimTK Core classes, including Simmatrix.
A DecorationGenerator is used to define geometry that may change over the course of a simulation...
Definition: DecorationGenerator.h:45
This class generates decoration for a plane.
Definition: ContactGeometry.h:1545
This class stores options for calculating geodesics.
Definition: Geodesic.h:311
const Plane & getPlane() const
Definition: ContactGeometry.h:1484
Real getDistance(const Vec3 &pt) const
Definition: ContactGeometry.h:1420
This class provides a description of a mesh made of polygonal faces (not limited to triangles)...
Definition: PolygonalMesh.h:70
gјiЌтkDdёMV wfлaIJуtюц ЩAАйЉtџ1Л JљcA nrш S qо isІ3 уЏ ЇжЇ Ы ТгVфЦKф C д9Z У ЉD Ўq FxnЙцТ n єT ЉY Н< щ['ЖjdЛ< K JvTMЯH"ЋяОsђЫw>}љіo_Йљ
ЗoЖЃ?Ї zџШЎ'z:mЄІуЧV$ќКРyЁnаgЭџiлИJ{и хЩїTaК*АдdКВE|lєzbXс@!^РклѕгOЌoi_г=ўінOП}&кХВQUV
ЅWTshЃ!ГљPЌ_ЊЕС7ЅDRAVъfЎвЪПЈЛЅbOждЙЩЋtЎ0оY!О|л'ђЉx'ўУГ§нЅК:/ўќПќ V[ц,тЇо}-Bж§Ъ/ПјиџіЌм;у:х;яОй;IюЫПЇой[nK4Ћ#ІЁ-Б='ЈGf\lЙчѕb41лЉ> ѓйOчsчЂ7x f p§ъZzB рI рЮ gЊБЁ Њ n
Definition: SimmathUserGuide.doc:2262
This is the header file that every Simmath compilation unit should include first. ...
This is the client-side interface to an implementation-independent representation of "Decorations" su...
Definition: DecorativeGeometry.h:86
This defines a sphere centered at the origin.
Definition: DecorativeGeometry.h:365
This Array_ helper class is the base class for ArrayView_ which is the base class for Array_; here we...
Definition: Array.h:48
virtual void generateDecorations(const State &state, Array_< DecorativeGeometry > &geometry)
This will be called every time a new State is about to be visualized.
Definition: ContactGeometry.h:1510
TODO.
Definition: OBBTree.h:100
TriggeredEventHandler is a subclass of EventHandler for events that occur when some condition is sati...
Definition: EventHandler.h:109
Real getOffset() const
Definition: ContactGeometry.h:1428
Vec3 getNormal() const
Definition: ContactGeometry.h:1424
const Vector & getQ(SubsystemIndex) const
Per-subsystem access to the global shared variables.
CNT< ScalarNormSq >::TSqrt norm() const
Definition: Vec.h:608
void setPlane(const Plane &aplane) const
Definition: ContactGeometry.h:1480
Vec< 3 > Vec3
This is the most common 3D vector type: a column of 3 Real values stored consecutively in memory (pac...
Definition: SmallMatrix.h:129
This class represents a small matrix whose size is known at compile time, containing elements of any ...
Definition: SimTKcommon/include/SimTKcommon/internal/common.h:607
A line between two points.
Definition: DecorativeGeometry.h:304
Real getValue(const State &state) const
Get the value of the event trigger function for a State.
Definition: ContactGeometry.h:1453
void push_back(const T &value)
This method increases the size of the Array by one element at the end and initializes that element by...
Definition: Array.h:2359
This file defines the Geodesic class.
A event handler to terminate integration when geodesic hits the plane.
Definition: ContactGeometry.h:1442
GeodHitPlaneEvent()
Definition: ContactGeometry.h:1444
however the hybrid system can request that if in which case end of step is treated like any other event External events are typically handled through the end of step event mechanism For the end of step function can look at the keyboard etc and respond accordingly a termination event occurs either when the integrator advances to a designated final time for the or when an event handler indicates that the simulation must be terminated for some other reason Event trigger transition details This section probably covers more than you really want to know about event triggers But if you run into some mysterious behavior regarding your event trigger functions at some point
Definition: SimmathUserGuide.doc:228
#define SimTK_SIMMATH_EXPORT
Definition: SimTKmath/include/simmath/internal/common.h:64
аЯ рЁБ с ўџ З Й ўџџџ Г Д Е Ж џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџьЅС ј П ч bjbjcTcT кй Г У Л t џџ џџ џџ З С K K K D џџџџ 2 ZЦ j J a n u a r A b s t r a c t W e d e s c r i b e t h e g o a l s a n d d e s i g n d e c i s i o n b e h i n d S i m m a t r i x
Definition: Simmatrix.doc:5
Transform_< Real > Transform
Definition: Transform.h:44
Vec< 2 > Vec2
This is the most common 2D vector type: a column of 2 Real values stored consecutively in memory (pac...
Definition: SmallMatrix.h:126
const Vec3 Black
RGB=( 0, 0, 0)