![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /******************************************************************************* 00002 ** Copyright (c) 1999 MAK Technologies, Inc. 00003 ** All rights reserved. 00004 *******************************************************************************/ 00005 /****************************************************************************** 00006 ** $RCSfile: humanCollisionAvoidController.h,v $ $Revision: 1.9 $ $State: Exp $ 00007 *******************************************************************************/ 00008 00011 00014 00015 #ifndef DtHumanCollisionAvoidanceController_H_ 00016 #define DtHumanCollisionAvoidanceController_H_ 00017 00018 #include "vrfobjcore/singleTaskControllerComponent.h" 00019 #include "vrfobjcore/vrfObjIter.h" 00020 #include <vl/hostStructs.h> 00021 #include "vrfobjcore/humanCollisionAvoidPSR.h" 00022 #include "vrfmodel/vrfmodelDefines.h" 00023 00024 class DtString; 00025 class DtSimManager; 00026 class Dt3dBoundingVolume; 00027 class DtVrfObjectStateRepository; 00028 class DtInputControlPortGroup; 00029 class DtCollisionInputPort; 00030 class DtCollision; 00031 class DtHumanMovementControlOutputPortGroup; 00032 class DtHumanStateRepository; 00033 class DtHumanCollisionAvoidancePSR; 00034 class DtVectorInputPort; 00035 class DtBooleanOutputPort; 00036 00041 class DT_DLL_vrfmodel DtHumanCollisionAvoidanceController : public 00042 DtSingleTaskControllerComponent 00043 { 00044 00045 public: 00046 00049 DtHumanCollisionAvoidanceController(const DtString& name, 00050 DtVrfObject* owner, 00051 DtSimManager* simManager, 00052 DtComponentDescriptor* desc = 0, 00053 DtReaderWriterRegistry* parentRegistry = 0); 00054 00057 virtual ~DtHumanCollisionAvoidanceController(); 00058 00062 virtual bool init(); 00063 00073 virtual void tick(); 00074 00078 virtual double distanceSquaredToDestination(DtVector offsetVector); 00079 00082 virtual bool isInsideObstruction(const DtCollision* potentialCollision, double& clearingDistance); 00083 00090 virtual void avoidCollision(const DtCollision& potentialCollision); 00091 00094 virtual void clearCollision(); 00095 00100 virtual void clearingCollision(); 00101 00104 virtual DtString type() const; 00105 00109 static DtSimComponent * creator(const DtString& name, 00110 DtVrfObject* owner, 00111 DtSimManager* simManager, 00112 DtComponentDescriptor* desc = 0, 00113 DtReaderWriterRegistry* parentRegistry = 0); 00114 00115 protected: 00118 DtHumanCollisionAvoidanceController(); 00119 00121 DtHumanCollisionAvoidanceController(const 00122 DtHumanCollisionAvoidanceController & orig); 00123 00125 const DtHumanCollisionAvoidanceController & operator=(const 00126 DtHumanCollisionAvoidanceController & orig); 00127 00129 virtual void registerTaskMsgCallbacks(); 00130 00133 static void taskCompleteReportCallback(DtSimMessage * msg, void * usr); 00134 virtual void processTaskComplete(DtSimMessage * msg); 00135 00141 bool isAppreciablyMoving(DtVector velocity, double velocityTolerance) const; 00142 00151 bool setDefaultPortValuesForAvoidance(); 00152 00159 bool determineObstructionMovementDirection(DtDcm obstructionLocalOrientationMatrix, 00160 const DtVector& obstructionVelocity, 00161 int& obstructionDirectionSign) const; 00162 00176 void avoidMovingObstruction(const DtCollision& potentialCollision); 00177 00188 void avoidNonMovingObstruction(const DtCollision& potentialCollision); 00189 00192 virtual void calculateAvoidanceByVertices(const DtVector & vertex1,const DtVector & vertex2,double entityBoundingVolumeRadius, 00193 DtVector & localVectorToDestination,DtVector & localVectorToObstruciton); 00194 00197 virtual void calculateAvoidanceUsingExtent(DtExtent & extent,double entityBoundingVolumeRadius, 00198 DtVector & localVectorToDestination,DtVector & localVectorToObstruciton); 00199 00201 virtual void calculateAvoidanceUsingBoundingVolume(const DtCollision& potentialCollision, 00202 double entityBoundingVolumeRadius,DtVector & localVectorToDestination, 00203 DtVector & localVectorToObstruciton); 00204 00214 void startClearingCollision(double clearingDistance); 00215 00229 bool calculateCollisionBV(); 00230 00231 bool createPortGroups(); 00232 bool createPorts(); 00233 00239 virtual bool createPSR(); 00240 00241 virtual void computeClearingHeading(const DtVector& localVertex1, 00242 const DtVector& localVertex2, const DtVector & localObstaclePos, 00243 double& clearingHeading) const; 00244 00245 virtual void getObstructionFootprint(const DtCollision& collision, 00246 DtLocalVertexList& localObstructionFootprint) const; 00247 00248 protected: 00249 00251 double myClearingDistance; 00252 00253 bool myAvoidingCollision; 00254 Dt3dBoundingVolume* myCollisionBV; 00255 00256 DtEntityIdentifier myObjectId; 00257 bool myHavePortGroup; 00258 00259 DtHumanStateRepository* myLifeformState; 00260 00263 DtHumanCollisionAvoidancePSR* myProcessState; 00264 00267 00273 DtCollisionInputPort* myCollisionAvoidancePort; 00274 00280 DtVectorInputPort* myDestinationInputPort; 00281 00284 DtInputPortGroup* myCollisionAvoidancePortGroup; 00285 00287 DtHumanMovementControlOutputPortGroup* myHumanMovementControlOutputPortGroup; 00288 00293 DtBooleanOutputPort* myCollisionPort; 00295 00301 double myTimeToCollide; 00302 00307 double myLateralClearance; 00308 00313 double myStoppingDistanceFactor; 00314 00315 DtVector myNonMvObstructionLocation; 00316 }; 00317 00318 #endif 00319 00320 00321 00322