00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef __SIM_Force_h__
00015 #define __SIM_Force_h__
00016
00017 #include "SIM_API.h"
00018 #include <UT/UT_Vector3.h>
00019 #include "SIM_DataUtils.h"
00020 #include "SIM_PhysicalParms.h"
00021
00022 class UT_DMatrix4;
00023 class UT_Matrix;
00024 class UT_FloatArray;
00025 class UT_Vector3Array;
00026 class GU_ConstDetailHandle;
00027 class SIM_Geometry;
00028 class SIM_Position;
00029 class SIM_Motion;
00030 class SIM_ForceResolver;
00031
00032
00033 class SIM_API SIM_PointForceCallback
00034 {
00035 public:
00036 SIM_PointForceCallback()
00037 { }
00038 virtual ~SIM_PointForceCallback()
00039 { }
00040
00041
00042
00043
00044
00045
00046 virtual void forceCallback(int ptnum,
00047 const UT_Vector3 &force,
00048 const UT_Vector3 &torque) = 0;
00049 };
00050
00051
00052
00053
00054 class SIM_API SIM_Force : public SIM_Data
00055 {
00056 public:
00057 typedef enum
00058 {
00059 SIM_FORCE_SAMPLEPOINT,
00060 SIM_FORCE_SAMPLECIRCLE,
00061 SIM_FORCE_SAMPLESPHERE
00062 } SIM_ForceSample;
00063
00064
00065
00066 void getForce(const SIM_Object &object,
00067 const UT_Vector3 &position,
00068 const UT_Vector3 &velocity,
00069 const UT_Vector3 &angvel,
00070 const fpreal mass,
00071 UT_Vector3 &force,
00072 UT_Vector3 &torque) const;
00073
00074
00075
00076
00077
00078
00079
00080 bool getForceSet(const SIM_Object &object,
00081 const UT_Vector3Array &positions,
00082 const UT_Vector3Array &velocities,
00083 const UT_Vector3Array &angvelocities,
00084 const UT_FloatArray &masses,
00085 UT_Vector3Array &forces,
00086 UT_Vector3Array &torques) const;
00087
00088
00089 SIM_ForceResolver *getForceResolver(const SIM_Object &object) const;
00090
00091
00092
00093 void getForceOnCircle(const SIM_Object &object,
00094 const UT_Vector3 &position,
00095 const UT_Vector3 &normal,
00096 const fpreal radius,
00097 const UT_Vector3 &velocity,
00098 const UT_Vector3 &angvel,
00099 const fpreal mass,
00100 UT_Vector3 &force,
00101 UT_Vector3 &torque) const;
00102
00103
00104 void getForceOnSphere(const SIM_Object &object,
00105 const UT_Vector3 &position,
00106 const fpreal radius,
00107 const UT_Vector3 &velocity,
00108 const UT_Vector3 &angvel,
00109 const fpreal mass,
00110 UT_Vector3 &force,
00111 UT_Vector3 &torque) const;
00112
00113
00114
00115
00116 void getForceJacobian(const SIM_Object &object,
00117 const UT_Vector3 &position,
00118 const UT_Vector3 &velocity,
00119 const UT_Vector3 &angvel,
00120 const fpreal mass,
00121 UT_Matrix &dFdX,
00122 UT_Matrix &dFdV) const;
00123
00124
00125
00126
00127
00128
00129 SIM_ForceSample getOptimalForceSampling() const;
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 void getPointForces(SIM_PointForceCallback &cb,
00140 const SIM_Object &object,
00141 const GU_ConstDetailHandle &gdh,
00142 const UT_DMatrix4 &geoxform,
00143 const SIM_Position *position,
00144 const SIM_Motion *motion,
00145 bool forcesinworldspace) const;
00146
00147 protected:
00148 explicit SIM_Force(const SIM_DataFactory *factory);
00149 virtual ~SIM_Force();
00150
00151
00152
00153 void applyNoise(const UT_Vector3 &pos,
00154 UT_Vector3 &forceortorque) const;
00155
00156
00157
00158
00159 void applyNoise(const UT_Vector3 &pos,
00160 UT_Vector3 &force,
00161 UT_Vector3 &torque) const;
00162
00163
00164
00165 void applyNoiseJacobian(const UT_Vector3 &pos,
00166 UT_Matrix &dFdX,
00167 UT_Matrix &dFdV) const;
00168
00169
00170
00171
00172
00173 virtual void getForceSubclass(const SIM_Object &object,
00174 const UT_Vector3 &position,
00175 const UT_Vector3 &velocity,
00176 const UT_Vector3 &angvel,
00177 const fpreal mass,
00178 UT_Vector3 &force,
00179 UT_Vector3 &torque) const;
00180
00181
00182 virtual SIM_ForceResolver *getForceResolverSubclass(const SIM_Object &object) const;
00183
00184
00185
00186
00187
00188
00189 virtual bool getForceSetSubclass(const SIM_Object &object,
00190 const UT_Vector3Array &positions,
00191 const UT_Vector3Array &velocities,
00192 const UT_Vector3Array &angvelocities,
00193 const UT_FloatArray &masses,
00194 UT_Vector3Array &forces,
00195 UT_Vector3Array &torque) const;
00196
00197
00198
00199
00200
00201
00202 virtual void getForceOnCircleSubclass(const SIM_Object &object,
00203 const UT_Vector3 &position,
00204 const UT_Vector3 &normal,
00205 const fpreal radius,
00206 const UT_Vector3 &velocity,
00207 const UT_Vector3 &angvel,
00208 const fpreal mass,
00209 UT_Vector3 &force,
00210 UT_Vector3 &torque) const;
00211
00212
00213
00214
00215
00216
00217 virtual void getForceOnSphereSubclass(const SIM_Object &object,
00218 const UT_Vector3 &position,
00219 const fpreal radius,
00220 const UT_Vector3 &velocity,
00221 const UT_Vector3 &angvel,
00222 const fpreal mass,
00223 UT_Vector3 &force,
00224 UT_Vector3 &torque) const;
00225
00226
00227
00228
00229
00230
00231 virtual void getForceJacobianSubclass(const SIM_Object &object,
00232 const UT_Vector3 &position,
00233 const UT_Vector3 &velocity,
00234 const UT_Vector3 &angvel,
00235 const fpreal mass,
00236 UT_Matrix &dFdX,
00237 UT_Matrix &dFdV) const;
00238
00239
00240
00241
00242
00243 virtual SIM_ForceSample getOptimalForceSamplingSubclass() const;
00244
00245 private:
00246 DECLARE_STANDARD_GETCASTTOTYPE();
00247 DECLARE_CLASSNAME(SIM_Force, SIM_Data);
00248 };
00249
00250
00251
00252
00253
00254
00255 class SIM_API SIM_ForceResolver
00256 {
00257 public:
00258 SIM_ForceResolver();
00259 SIM_ForceResolver(const SIM_Force *force, const SIM_Object *obj);
00260 SIM_ForceResolver(const SIM_ForceResolver &src);
00261 virtual ~SIM_ForceResolver();
00262
00263 virtual SIM_ForceResolver &operator=(const SIM_ForceResolver &src);
00264
00265 virtual SIM_ForceResolver *copy() const = 0;
00266
00267
00268
00269 virtual bool threadsafe() const;
00270
00271 virtual void getForce(const UT_Vector3 &position,
00272 const UT_Vector3 &velocity,
00273 const UT_Vector3 &angvel,
00274 const fpreal mass,
00275 UT_Vector3 &force,
00276 UT_Vector3 &torque) = 0;
00277
00278
00279
00280
00281 virtual bool hasJacobian() const { return false; }
00282 virtual void getForceJacobian(const UT_Vector3 &position,
00283 const UT_Vector3 &velocity,
00284 const UT_Vector3 &angvel,
00285 const fpreal mass,
00286 UT_Matrix &dFdX,
00287 UT_Matrix &dFdV);
00288
00289
00290
00291 void applyNoise(const UT_Vector3 &pos,
00292 UT_Vector3 &forceortorque);
00293 void applyNoise(const UT_Vector3 &pos,
00294 UT_Vector3 &force,
00295 UT_Vector3 &torque);
00296 void applyNoiseJacobian(const UT_Vector3 &pos,
00297 UT_Matrix &dFdX,
00298 UT_Matrix &dFdV);
00299
00300 protected:
00301 UT_PtrArray<SIM_PropertyResolver *> myNoiseResolvers;
00302 };
00303
00304
00305 class SIM_API SIM_ForceResolverGeneric : public SIM_ForceResolver
00306 {
00307 public:
00308 SIM_ForceResolverGeneric(const SIM_Force *force,
00309 const SIM_Object *object)
00310 {
00311 myForce = force;
00312 myObject = object;
00313 }
00314
00315 virtual SIM_ForceResolver *copy() const
00316 {
00317 return new SIM_ForceResolverGeneric(*this);
00318 }
00319
00320 virtual bool threadsafe() const { return false; }
00321
00322 virtual void getForce(const UT_Vector3 &position,
00323 const UT_Vector3 &velocity,
00324 const UT_Vector3 &angvel,
00325 const fpreal mass,
00326 UT_Vector3 &force,
00327 UT_Vector3 &torque)
00328 {
00329 myForce->getForce(*myObject, position, velocity, angvel,
00330 mass, force, torque);
00331 }
00332 virtual bool hasJacobian() const { return true; }
00333 virtual void getForceJacobian(const UT_Vector3 &position,
00334 const UT_Vector3 &velocity,
00335 const UT_Vector3 &angvel,
00336 const fpreal mass,
00337 UT_Matrix &dFdX,
00338 UT_Matrix &dFdV)
00339 {
00340 myForce->getForceJacobian(*myObject,
00341 position, velocity, angvel,
00342 mass,
00343 dFdX, dFdV);
00344 }
00345 protected:
00346 const SIM_Force *myForce;
00347 const SIM_Object *myObject;
00348 };
00349
00350 #endif
00351