Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
127 commits
Select commit Hold shift + click to select a range
c341560
add install script for building and testing
pepbos Apr 15, 2024
14c7bb8
wip: Sketching the WrappingPathSubsystem
pepbos Apr 19, 2024
3a4216d
rename to Wrapping.h
pepbos Apr 19, 2024
71ff5fa
wip: add cpp file
pepbos Apr 19, 2024
6e73259
cleanup Wrapping.h design
pepbos Apr 19, 2024
f140921
add WrappingSubsystem::Impl header
pepbos Apr 19, 2024
b438cce
update function bodies for WrappingPath::Impl
pepbos Apr 19, 2024
65a240d
remove future cache entries from WrappingPath
pepbos Apr 19, 2024
c02ce9f
Fill in WrappingPath function bodies
pepbos Apr 19, 2024
3d7bf95
update WrappingPath
pepbos Apr 19, 2024
ddbc6f2
add WrappingPathSubsystem functions to cpp
pepbos Apr 19, 2024
38ae9af
wip
pepbos Apr 19, 2024
2aa42b4
autoupdate discrete cache var: LocalGeodesicInfo
pepbos Apr 19, 2024
ff1b64d
wip: add more geodesic math
pepbos Apr 19, 2024
b18ff47
wip: add jacobian calculations
pepbos Apr 19, 2024
6dba293
add calcPath function body
pepbos Apr 19, 2024
26da8da
split Impl from its box
pepbos Apr 22, 2024
399adb7
wip: Surface and WrapObstacle impl refactor sketch
pepbos Apr 22, 2024
fcf08b1
wip: implement WrappingPath::Impl wip
pepbos Apr 23, 2024
c52e5a0
fix locking the shared solver data
pepbos Apr 23, 2024
84fccc4
refactor position level staging
pepbos Apr 23, 2024
8f40a3c
add computing the path corrections
pepbos Apr 23, 2024
abe2c3e
wip: Move Surface into WrapObstacle::Impl
pepbos Apr 23, 2024
5aa88cf
refactor: WrappingObstacle::Impl update for local Surface
pepbos Apr 23, 2024
111d319
add computing lengthDot
pepbos Apr 24, 2024
8b53b18
rename to CableSpan and CurveSegment
pepbos Apr 24, 2024
4bac884
wip: refactor to use CurveSegmentIndex and more..
pepbos Apr 24, 2024
179f3b6
fmt
pepbos Apr 24, 2024
7ad1585
change "Path" to "Segment"
pepbos Apr 24, 2024
98a36f9
wip: Renaming, cleanup etc
pepbos Apr 25, 2024
71d5a46
general improvements, added computing forces: wip
pepbos Apr 25, 2024
474451f
add analyiticFormAvailable switch on LocalGeodesic
pepbos Apr 25, 2024
1757429
add calcNearestFrenetFrameImplicitlyFast method
pepbos Apr 25, 2024
90cc278
add implicit geodesic math to Wrapping.cpp
pepbos Apr 26, 2024
1a1dcf3
update implicit geodesic equations
pepbos Apr 29, 2024
8a65654
update CurveSegment api
pepbos Apr 29, 2024
021f9ec
wip: updates Wrapping.h function bodies
pepbos Apr 29, 2024
ccb73f4
wip: Refactor LocalGeodesic method bodies
pepbos Apr 29, 2024
6f816a2
fmt
pepbos Apr 29, 2024
2297fe3
rename m_Surface to m_Geodesic
pepbos Apr 29, 2024
83e58bc
add missing implementations for CableSpan::Impl
pepbos Apr 29, 2024
da7476f
add convenience method for adding curve segments
pepbos Apr 30, 2024
697ec7d
wip: add wrapping example
pepbos Apr 30, 2024
4fde8e6
update installer script
pepbos Apr 30, 2024
7831c24
add todo comment
pepbos Apr 30, 2024
923439f
move Wrapping code to src dir
pepbos Apr 30, 2024
0a1d634
add ctor to LineSegment
pepbos Apr 30, 2024
c09fa3c
fix compiling ExampleCableSpan
pepbos Apr 30, 2024
9614eaa
fix segfault: distribute cable subsystem by pointer
pepbos Apr 30, 2024
762b7a3
prefer getter over member access
pepbos Apr 30, 2024
eb98aad
fix cache variable latest stages
pepbos Apr 30, 2024
4956a98
do not use Geodesic math ftom ContactGeometry
pepbos Apr 30, 2024
b3071a0
set initial values of LocalGeodesic
pepbos Apr 30, 2024
d5cf4af
wip cleanup
pepbos Apr 30, 2024
7ae7501
cleanup: remove path initializers
pepbos Apr 30, 2024
028d2ca
clamp initial integrator stepsize
pepbos May 1, 2024
64f6092
fix liftoff detection
pepbos May 1, 2024
637b49a
set length after shooting new geodesic
pepbos May 1, 2024
b3124cc
fix invalidating and updating lDot
pepbos May 1, 2024
719fc42
fix geodesic integration: flipped implicit fun sign
pepbos May 1, 2024
844dcd1
add decorativeGeometry
pepbos May 1, 2024
b26dc19
fmt
pepbos May 1, 2024
9b63f6d
use throw instead of simtk_assert
pepbos May 1, 2024
f6dbf01
project initial state
pepbos May 1, 2024
9492dff
fix path correctin computaiton
pepbos May 1, 2024
c8e7943
fmt
pepbos May 1, 2024
4ce3ed9
use throw instead of simtk_assert
pepbos May 1, 2024
a5d87a6
skip calculating the pathpoints if not active
pepbos May 1, 2024
47a0800
fix wrench computation
pepbos May 1, 2024
699076b
remove realizing position and velocity cache from Cablesubsystem
pepbos May 1, 2024
138f814
Refactor: Remove LocalGeodesic layer from CurveSegment
pepbos May 2, 2024
0c43119
clear samples before intergration
pepbos May 2, 2024
257d557
add decorative geometry method to curve segment
pepbos May 2, 2024
4e0b5b7
add simple cable span example
pepbos May 2, 2024
7ccb63a
tweak example settings
pepbos May 2, 2024
bf2cffb
fix calculating pathErrorJacobian indexing
pepbos May 2, 2024
49b0e75
HOTFIX: prevent exception on non-convergence
pepbos May 2, 2024
41ed0b2
add decoration of frenet frame
pepbos May 2, 2024
5f8e2f5
tweak example settings and script
pepbos May 2, 2024
3a6c71f
Fix nasty bugs in computing pathErrorJacobian
pepbos May 2, 2024
b3b2758
add runtime-unittest for boundary frame jacobian
pepbos May 2, 2024
c10f9fe
tweak cable test example
pepbos May 2, 2024
5304974
fmt
pepbos May 3, 2024
fd9b96c
fmt
pepbos May 3, 2024
1bb1548
cleanup
pepbos May 3, 2024
123e913
sketch of CurveSegment API
pepbos May 3, 2024
7c0b9ef
rename Status::Liftoff to Status::Lifted
pepbos May 3, 2024
e413e17
cleanup
pepbos May 3, 2024
d53ac6c
move function bodies to source file
pepbos May 3, 2024
5d113af
add resampling of geodesic
pepbos May 3, 2024
16f0a24
cleanup of Wrapping header
pepbos May 3, 2024
a0d0504
add doc comment
pepbos May 5, 2024
e68e14b
update CurveSegment doc comments
pepbos May 5, 2024
1e01a35
implement function for getting the integrator step size
pepbos May 6, 2024
5056f23
fix calcCablePower
pepbos May 6, 2024
df7b425
cleanup & fmt
pepbos May 6, 2024
01db1e5
replace double by Real
pepbos May 6, 2024
56810aa
fix touchdown initialization
pepbos May 6, 2024
d1fd934
fmt
pepbos May 6, 2024
4e17edc
cleanup
pepbos May 6, 2024
b816517
show straight line decoration when no obstacles are active
pepbos May 6, 2024
33b0825
add some TODO's
pepbos May 6, 2024
d02d7c9
add asserting the solver error
pepbos May 6, 2024
772d2e6
refactor runtime tests of geodesic correction
pepbos May 6, 2024
16f4517
import cmath
pepbos May 6, 2024
e206b52
always realize position when computing power
pepbos May 6, 2024
9a2d115
set default max iteration params to high values
pepbos May 6, 2024
e811971
tweak example values
pepbos May 6, 2024
2d13c3a
add doc comments
pepbos May 6, 2024
ab2320a
fix computing the max correction stepsize
pepbos May 8, 2024
308eb2c
add evaluation of pathErrorJacobian at runtime
pepbos May 9, 2024
c2fa935
correct comment, data was not locked
pepbos May 9, 2024
cd27c9c
allow for 20 deg radial curvature
pepbos May 9, 2024
eabac1e
cleanup: rename variables
pepbos May 9, 2024
2f4b5fc
cleanup: Remove helper function
pepbos May 9, 2024
0319a79
rename Status to WrappingStatus
pepbos May 10, 2024
4cd9b20
fix parallel projection error
pepbos May 10, 2024
f8db437
update initial step size of geodesic integrator
pepbos May 10, 2024
25f3915
remove unused field from cache
pepbos May 10, 2024
7a127a2
add path initializer
pepbos May 10, 2024
a92d2d0
fmt
pepbos May 10, 2024
9c106dd
fix finding initial tangent directions
pepbos May 10, 2024
abd0617
add missing decleration
pepbos May 10, 2024
77c40e1
fix using QTZ solver for computing path corrections
pepbos May 21, 2024
0bb1788
take MobilizedBody by index
pepbos May 21, 2024
63fcf83
refactor calcDecorations to use calcPathPoints
pepbos May 21, 2024
1fb0c85
fix compilation error (take body by index)
pepbos May 21, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions SimTKmath/Geometry/include/simmath/internal/ContactGeometry.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ class OBBTreeNodeImpl;
class OBBTree;
class Plane;

static const CoordinateAxis TangentAxis = CoordinateAxis::XCoordinateAxis();
static const CoordinateAxis NormalAxis = CoordinateAxis::YCoordinateAxis();
static const CoordinateAxis BinormalAxis = CoordinateAxis::ZCoordinateAxis();



//==============================================================================
Expand Down Expand Up @@ -118,6 +122,84 @@ class Cylinder;
class Brick;
class TriangleMesh;

static constexpr int GEODESIC_DOF = 4;

using FrenetFrame = Transform;
using GeodesicPointVariation = Mat34;
using GeodesicFrameVariation = Mat34;

// Variation as SpatialVec:
//
// {dR, dx} = {W*R, v}
//
// dx = v
// dt = w % t
// dn = w % n
// db = w % b
// dR = W * R
using GeodesicVariation = std::array<Mat34, 2>;
using GeodesicCorrection = Vec4;

/* bool analyticFormAvailable() const; */

/* void calcGeodesicWithVariationAnalytically( */
/* Vec3 xGuess, */
/* Vec3 tGuess, */
/* Real l, */
/* FrenetFrame& K_P, */
/* GeodesicVariation& dK_P, */
/* FrenetFrame& K_Q, */
/* GeodesicVariation& dK_Q) const; */

/* void resampleGeodesicPointsAnalytically( */
/* const FrenetFrame& K_P, */
/* const FrenetFrame& K_Q, */
/* Real l, */
/* size_t size, */
/* std::vector<Vec3>& points) const; */

/* void resampleGeodesicFramesAnalytically( */
/* const FrenetFrame& K_P, */
/* const FrenetFrame& K_Q, */
/* Real l, */
/* size_t size, */
/* std::vector<FrenetFrame>& frames) const; */

/* size_t calcNearestFrenetFrameImplicitlyFast( */
/* Vec3 xGuess, */
/* Vec3 tGuess, */
/* FrenetFrame& K_P, */
/* size_t maxIter, */
/* Real eps) const; */

/* void calcGeodesicStartFrameVariationImplicitly( */
/* const FrenetFrame& K_P, */
/* GeodesicVariation& dK_P) const; */

/* void calcGeodesicEndFrameVariationImplicitly( */
/* const FrenetFrame& KP, */
/* Real l, */
/* FrenetFrame& K_Q, */
/* GeodesicVariation& dK_Q, */
/* Real initStepSize, */
/* Real accuracy, */
/* std::vector<FrenetFrame>& frames) const; */

/* bool calcNearestPointOnLineImplicitly( */
/* Vec3 a, */
/* Vec3 b, */
/* Vec3& point, */
/* size_t maxIter, */
/* double eps) const; */

/* bool calcNearestPointOnLineAnalytically( */
/* Vec3 a, */
/* Vec3 b, */
/* Vec3& point) const; */

Real calcNormalCurvature(Vec3 x, UnitVec3 t) const;
Real calcGeodesicTorsion(Vec3 x, UnitVec3 t) const;

// TODO
class Cone;

Expand Down
184 changes: 184 additions & 0 deletions SimTKmath/Geometry/src/ContactGeometry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,190 @@ void ContactGeometry::calcSurfacePrincipalCurvatures(const Vec3& point,
Vec3 ContactGeometry::calcSupportPoint(UnitVec3 direction) const
{ return getImpl().calcSupportPoint(direction); }

using FrenetFrame = ContactGeometry::FrenetFrame;
using GeodesicVariation = ContactGeometry::GeodesicVariation;
using GeodesicCorrection = ContactGeometry::GeodesicCorrection;

/* void ContactGeometry::calcGeodesicWithVariationAnalytically( */
/* Vec3 xGuess, */
/* Vec3 tGuess, */
/* Real l, */
/* FrenetFrame& K_P, */
/* GeodesicVariation& dK_P, */
/* FrenetFrame& K_Q, */
/* GeodesicVariation& dK_Q) const */
/* { */
/* getImpl().calcGeodesicWithVariationAnalytically(xGuess, tGuess, l, K_P, dK_P, K_Q, dK_Q); */
/* } */

/* void ContactGeometry::resampleGeodesicPointsAnalytically( */
/* const FrenetFrame& K_P, */
/* const FrenetFrame& K_Q, */
/* Real l, */
/* size_t size, */
/* std::vector<Vec3>& points) const */
/* { */
/* getImpl().resampleGeodesicPointsAnalytically(K_P, K_Q, l, size, points); */
/* } */

/* void ContactGeometry::resampleGeodesicFramesAnalytically( */
/* const FrenetFrame& K_P, */
/* const FrenetFrame& K_Q, */
/* Real l, */
/* size_t size, */
/* std::vector<FrenetFrame>& frames) const */
/* { */
/* getImpl().resampleGeodesicFramesAnalytically(K_P, K_Q, l, size, frames); */
/* } */

/* size_t ContactGeometry::calcNearestFrenetFrameImplicitlyFast( */
/* Vec3 xGuess, */
/* Vec3 tGuess, */
/* FrenetFrame& K_P, */
/* size_t maxIter, */
/* Real eps) const */
/* { */
/* return getImpl().calcNearestFrenetFrameImplicitlyFast(xGuess, tGuess, K_P, maxIter, eps); */
/* } */

/* void ContactGeometry::calcGeodesicStartFrameVariationImplicitly( */
/* const FrenetFrame& K_P, */
/* GeodesicVariation& dK_P) const */
/* { */
/* getImpl().calcGeodesicStartFrameVariationImplicitly(K_P, dK_P); */
/* } */

/* void ContactGeometry::calcGeodesicEndFrameVariationImplicitly( */
/* const FrenetFrame& K_P, */
/* Real l, */
/* FrenetFrame& K_Q, */
/* GeodesicVariation& dK_Q, */
/* Real initStepSize, */
/* Real accuracy, */
/* std::vector<FrenetFrame>& frames) const */
/* { */
/* getImpl().calcGeodesicEndFrameVariationImplicitly(K_P, l, K_Q, dK_Q, initStepSize, accuracy, frames); */
/* } */

/* bool ContactGeometry::calcNearestPointOnLineImplicitly( */
/* Vec3 a, */
/* Vec3 b, */
/* Vec3& point, */
/* size_t maxIter, */
/* double eps) const */
/* { */
/* return getImpl().calcNearestPointOnLineImplicitly(a, b, point, maxIter, eps); */
/* } */

/* bool ContactGeometry::calcNearestPointOnLineAnalytically( */
/* Vec3 a, */
/* Vec3 b, */
/* Vec3& point) const */
/* { */
/* return getImpl().calcNearestPointOnLineAnalytically(a, b, point); */
/* } */

//==============================================================================
// IMPLICIT METHODS
//==============================================================================

// TODO is this right?
/* size_t ContactGeometryImpl::calcNearestFrenetFrameImplicitlyFast( */
/* Vec3 xGuess, */
/* Vec3 tGuess, */
/* FrenetFrame& K_P, */
/* size_t maxIter, */
/* Real eps) const */
/* { */
/* SimTK_THROW2(Exception::UnimplementedVirtualMethod, */
/* "ContactGeometryImpl", "calcNearestFrenetFrameImplicitlyFast"); */
/* /1* Vec3& x = xGuess; *1/ */
/* /1* size_t it = 0; *1/ */
/* /1* for (; it < maxIter; ++it) { *1/ */
/* /1* const double c = calcSurfaceValue(x); *1/ */

/* /1* const double error = std::abs(c); *1/ */

/* /1* if (error < eps) { *1/ */
/* /1* break; *1/ */
/* /1* } *1/ */

/* /1* const Vec3 g = calcSurfaceGradient(x); *1/ */

/* /1* x += -g * c / dot(g,g); *1/ */
/* /1* } *1/ */

/* /1* UnitVec3 n (calcSurfaceGradient(x)); *1/ */
/* /1* Vec3& t = tGuess; *1/ */
/* /1* if (!(abs(t % n) > 1e-13)) { *1/ */
/* /1* // TODO split NaN detection. *1/ */
/* /1* throw std::runtime_error("Surface projection failed: Tangent guess is parallel to surface normal, or there are NaNs..."); *1/ */
/* /1* } *1/ */

/* /1* t = t - dot(n, t) * n; *1/ */

/* /1* K_P.updR().setRotationFromTwoAxes(n, NormalAxis, t, TangentAxis); *1/ */
/* /1* K_P.setP(x); *1/ */

/* /1* return it; *1/ */
/* } */

/* void ContactGeometryImpl::calcGeodesicStartFrameVariationImplicitly( */
/* const FrenetFrame& K_P, */
/* ContactGeometry::GeodesicVariation& dK_P) const */
/* { */
/* SimTK_THROW2(Exception::UnimplementedVirtualMethod, */
/* "ContactGeometryImpl", "calcGeodesicStartFrameVariationImplicitly"); */
/* /1* const UnitVec3& t = K_P.R().getAxisUnitVec(TangentAxis); *1/ */
/* /1* const UnitVec3& n = K_P.R().getAxisUnitVec(NormalAxis); *1/ */
/* /1* const UnitVec3& b = K_P.R().getAxisUnitVec(BinormalAxis); *1/ */

/* /1* const Vec3& x = K_P.p(); *1/ */

/* /1* dK_P.at(0)[1] = t; *1/ */
/* /1* dK_P.at(1)[1] = b; // * q.a; // a = 1 *1/ */
/* /1* dK_P.at(2)[1] = Vec3{0.}; // b * q.r; // r = 0 *1/ */
/* /1* dK_P.at(3)[1] = Vec3{0.}; // isEnd ? t : Vec3{0., 0., 0.}; *1/ */

/* /1* const double tau_g = calcGeodesicTorsion(x, t); *1/ */
/* /1* const double kappa_n = calcNormalCurvature(x, t); *1/ */
/* /1* const double kappa_a = calcNormalCurvature(x, b); *1/ */

/* /1* dK_P.at(0)[0] = tau_g * t + kappa_n * b; *1/ */
/* /1* dK_P.at(1)[0] = -kappa_a * t - tau_g * b; *1/ */
/* /1* dK_P.at(2)[0] = -n; *1/ */
/* /1* dK_P.at(3)[0] = Vec3{0.}; *1/ */
/* } */

/* void ContactGeometryImpl::calcGeodesicEndFrameVariationImplicitly( */
/* const FrenetFrame& KP, */
/* Real l, */
/* FrenetFrame& K_Q, */
/* GeodesicVariation& dK_Q, */
/* Real initStepSize, */
/* Real accuracy, */
/* std::vector<FrenetFrame>& frames) const */
/* { SimTK_THROW2(Exception::UnimplementedVirtualMethod, */
/* "ContactGeometryImpl", "calcGeodesicEndFrameVariationImplicitly"); } */

/* bool ContactGeometryImpl::calcNearestPointOnLineImplicitly( */
/* Vec3 a, */
/* Vec3 b, */
/* Vec3& point, */
/* size_t maxIter, */
/* double eps) const */
/* { SimTK_THROW2(Exception::UnimplementedVirtualMethod, */
/* "ContactGeometryImpl", "calcNearestPointOnLineImplicitly"); } */

Real ContactGeometry::calcNormalCurvature(Vec3 x, UnitVec3 t) const
{
return getImpl().calcNormalCurvature(x, t);
}

Real ContactGeometry::calcGeodesicTorsion(Vec3 x, UnitVec3 t) const
{
return getImpl().calcGeodesicTorsion(x, t);
}

//------------------------------------------------------------------------------
// EVAL PARAMETRIC CURVATURE
Expand Down
76 changes: 76 additions & 0 deletions SimTKmath/Geometry/src/ContactGeometryImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,82 @@ class SimTK_SIMMATH_EXPORT ContactGeometryImpl {
virtual bool isConvex() const = 0;
virtual bool isFinite() const = 0;

using FrenetFrame = ContactGeometry::FrenetFrame;
using GeodesicVariation = ContactGeometry::GeodesicVariation;
using GeodesicCorrection = ContactGeometry::GeodesicCorrection;

/* virtual bool analyticFormAvailable() const {return false;} */

/* virtual void calcGeodesicWithVariationAnalytically( */
/* Vec3 xGuess, */
/* Vec3 tGuess, */
/* Real l, */
/* FrenetFrame& K_P, */
/* GeodesicVariation& dK_P, */
/* FrenetFrame& K_Q, */
/* GeodesicVariation& dK_Q) const */
/* { SimTK_THROW2(Exception::UnimplementedVirtualMethod, */
/* "ContactGeometryImpl", "calcGeodesicWithVariationAnalytically"); } */

/* virtual void resampleGeodesicPointsAnalytically( */
/* const FrenetFrame& K_P, */
/* const FrenetFrame& K_Q, */
/* Real l, */
/* size_t size, */
/* std::vector<Vec3>& points) const */
/* { SimTK_THROW2(Exception::UnimplementedVirtualMethod, */
/* "ContactGeometryImpl", "resampleGeodesicPointsAnalytically"); } */

/* virtual void resampleGeodesicFramesAnalytically( */
/* const FrenetFrame& K_P, */
/* const FrenetFrame& K_Q, */
/* Real l, */
/* size_t size, */
/* std::vector<FrenetFrame>& frames) const */
/* { SimTK_THROW2(Exception::UnimplementedVirtualMethod, */
/* "ContactGeometryImpl", "resampleGeodesicFramesAnalytically"); } */

/* virtual size_t calcNearestFrenetFrameImplicitlyFast( */
/* Vec3 xGuess, */
/* Vec3 tGuess, */
/* FrenetFrame& K_P, */
/* size_t maxIter, */
/* Real eps) const; */

/* virtual void calcGeodesicStartFrameVariationImplicitly( */
/* const FrenetFrame& K_P, */
/* GeodesicVariation& dK_P) const; */

/* virtual void calcGeodesicEndFrameVariationImplicitly( */
/* const FrenetFrame& KP, */
/* Real l, */
/* FrenetFrame& K_Q, */
/* GeodesicVariation& dK_Q, */
/* Real initStepSize, */
/* Real accuracy, */
/* std::vector<FrenetFrame>& frames) const; */

/* virtual bool calcNearestPointOnLineImplicitly( */
/* Vec3 a, */
/* Vec3 b, */
/* Vec3& point, */
/* size_t maxIter, */
/* double eps) const; */

/* virtual bool calcNearestPointOnLineAnalytically( */
/* Vec3 a, */
/* Vec3 b, */
/* Vec3& point) const */
/* { SimTK_THROW2(Exception::UnimplementedVirtualMethod, */
/* "ContactGeometryImpl", "calcNearestPointOnLineAnalytically"); } */

Real calcNormalCurvature(Vec3 x, UnitVec3 t) const
{ SimTK_THROW2(Exception::UnimplementedVirtualMethod,
"ContactGeometryImpl", "calcNormalCurvature"); }
Real calcGeodesicTorsion(Vec3 x, UnitVec3 t) const
{ SimTK_THROW2(Exception::UnimplementedVirtualMethod,
"ContactGeometryImpl", "calcGeodesicTorsion"); }

// Smooth surfaces only.
virtual void calcCurvature(const Vec3& point, Vec2& curvature,
Rotation& orientation) const
Expand Down
2 changes: 2 additions & 0 deletions SimTKmath/Geometry/src/ContactGeometry_Sphere.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ using std::cout; using std::endl;
// CONTACT GEOMETRY :: SPHERE & IMPL
//==============================================================================

/* bool ContactGeometryImpl::Sphere::analyticFormAvailable() const {return true;} */

ContactGeometry::Sphere::Sphere(Real radius)
: ContactGeometry(new Sphere::Impl(radius)) {}

Expand Down
1 change: 1 addition & 0 deletions Simbody/include/SimTKsimbody.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ will include this one). **/
#include "simbody/internal/CompliantContactSubsystem.h"
#include "simbody/internal/CableTrackerSubsystem.h"
#include "simbody/internal/CablePath.h"
#include "simbody/internal/Wrapping.h"
#include "simbody/internal/CableSpring.h"
#include "simbody/internal/Visualizer.h"
#include "simbody/internal/Visualizer_InputListener.h"
Expand Down
Loading