Changeset 7673 for code/trunk/src/modules
- Timestamp:
- Nov 25, 2010, 11:24:50 PM (14 years ago)
- Location:
- code/trunk/src/modules/objects
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/modules/objects/ForceField.cc
r5781 r7673 27 27 */ 28 28 29 /** 30 @file ForceField.cc 31 @brief Implementation of the ForceField class. 32 */ 33 29 34 #include "ForceField.h" 30 35 … … 36 41 { 37 42 CreateFactory(ForceField); 43 44 /*static*/ const std::string modeStringNormal_s = "tube"; 45 /*static*/ const std::string modeStringSphere_s = "sphere"; 38 46 39 47 ForceField::ForceField(BaseObject* creator) : StaticEntity(creator) … … 43 51 //Standard Values 44 52 this->setDirection(Vector3::ZERO); 45 velocity_ = 100; 46 diameter_ = 500; 47 length_ = 5000; 53 this->velocity_ = 100; 54 this->diameter_ = 500; 55 this->length_ = 5000; 56 this->mode_ = ForceFieldMode::tube; 48 57 } 49 58 50 ForceField::~ForceField() {} 59 ForceField::~ForceField() 60 { 61 } 51 62 52 63 void ForceField::XMLPort(Element& xmlelement, XMLPort::Mode mode) … … 58 69 XMLPortParam(ForceField, "diameter", setDiameter, getDiameter, xmlelement, mode).defaultValues(500); 59 70 XMLPortParam(ForceField, "length" , setLength , getLength , xmlelement, mode).defaultValues(2000); 71 XMLPortParam(ForceField, "mode", setMode, getMode, xmlelement, mode); 60 72 } 61 73 62 74 void ForceField::tick(float dt) 63 75 { 76 // Iterate over all objects that could possibly be affected by the ForceField. 64 77 for (ObjectList<MobileEntity>::iterator it = ObjectList<MobileEntity>::begin(); it != ObjectList<MobileEntity>::end(); ++it) 65 78 { 66 //calculate from 67 Vector3 directionVec = this->getOrientation() * WorldEntity::FRONT; 68 directionVec.normalise(); 79 if(this->mode_ == ForceFieldMode::tube) 80 { 81 // The direction of the orientation of the force field. 82 Vector3 direction = this->getOrientation() * WorldEntity::FRONT; 83 direction.normalise(); 69 84 70 Vector3 distanceVec = it->getWorldPosition() - (this->getWorldPosition() + (this->length_ / 2 * directionVec)); 85 // Vector from the center of the force field to the object its acting on. 86 // TODO: This could probably be simplified. 87 Vector3 distanceVector = it->getWorldPosition() - (this->getWorldPosition() + (this->halfLength_ * direction)); 88 89 // The object is outside of the length of the ForceField. 90 if(distanceVector.length() > this->halfLength_) 91 return; 71 92 72 //distance from centervector of the field ( 73 float distFromCenterVec = ((it->getWorldPosition() - this->getWorldPosition()).crossProduct(directionVec)).length(); 93 // The distance of the object form the orientation vector. (Or rather the smallest distance from the orientation vector) 94 float distanceFromDirectionVector = ((it->getWorldPosition() - this->getWorldPosition()).crossProduct(direction)).length(); 95 96 // If the object in a tube of radius diameter/2 around the direction of orientation. 97 if(distanceFromDirectionVector >= this->radius_) 98 return; 74 99 75 if (distanceVec.length() < this->length_ / 2 && distFromCenterVec < diameter_ / 2) 100 // Apply a force to the object in the direction of the orientation. 101 // The force is highest when the object is directly on the direction vector, with a linear decrease, finally reaching zero, when distanceFromDirectionVector = radius. 102 it->applyCentralForce(((this->radius_ - distanceFromDirectionVector)/(this->radius_)) * this->velocity_ * direction); 103 } 104 else if(this->mode_ == ForceFieldMode::sphere) 76 105 { 77 //normalize distance from center 78 it->applyCentralForce(((diameter_ / 2 - distFromCenterVec) / (diameter_ / 2)) * directionVec * velocity_); 106 Vector3 distanceVector = it->getWorldPosition() - this->getWorldPosition(); 107 float distance = distanceVector.length(); 108 if (distance < this->radius_) 109 { 110 distanceVector.normalise(); 111 it->applyCentralForce((this->radius_ - distance)/this->radius_ * this->velocity_ * distanceVector); 112 } 79 113 } 114 } 115 } 116 117 void ForceField::setMode(const std::string& mode) 118 { 119 if(mode == ForceField::modeStringTube_s) 120 this->mode_ = ForceFieldMode::tube; 121 else if(mode == ForceField::modeStringSphere_s) 122 this->mode_ = ForceFieldMode::sphere; 123 else 124 { 125 COUT(2) << "Wrong mode '" << mode << "' in ForceField. Setting to 'tube'." << std::endl; 126 this->mode_ = ForceFieldMode::tube; 127 } 128 } 129 130 inline const std::string& ForceField::getMode(void) 131 { 132 switch(this->mode_) 133 { 134 case ForceFieldMode::tube: 135 return ForceField::modeStringTube_s; 136 case ForceFieldMode::sphere: 137 return ForceField::modeStringSphere_s; 138 default: 139 return ForceField::modeStringTube_s; 80 140 } 81 141 } -
code/trunk/src/modules/objects/ForceField.h
r7601 r7673 23 23 * Aurelian Jaggi 24 24 * Co-authors: 25 * ...25 * Damian 'Mozork' Frick 26 26 * 27 27 */ … … 31 31 @brief Definition of the ForceField class. 32 32 @ingroup Objects 33 */ 34 35 /** 36 @file ForceField.h 37 @brief Definition of the ForceField class. 38 @inGroup Objects 33 39 */ 34 40 … … 43 49 namespace orxonox 44 50 { 51 52 /** 53 @brief 54 The mode of the ForceField. 55 56 @inGroup Objects 57 */ 58 namespace ForceFieldMode 59 { 60 enum Value { 61 tube, //!< The ForceField has a tube shape. 62 sphere //!< The ForceField has a spherical shape. 63 64 }; 65 } 66 67 /** 68 @brief 69 Implements a force field, that applies a force to any @ref orxonox::MoblieEnity "MobileEntity" that enters its range. 70 71 The following parameters can be set to specify the behavior of the ForceField. 72 - @b velocity The amount of force the ForceField excerts. 73 - @b diameter The diameter of the ForceField. 74 - @b length The length of the ForceField. 75 - @b mode The mode the ForceField is in. For mode: 76 -- <em>tube</em> A ForceField which exerts force only in the direction it is oriented. The force is only exerted on objects that are in a tube of length <em>length</em> and diameter <em>diameter</em>. The magintude of the force is proportional to the <em><velocity/em>, being highest when an object is in the middle of the tube (radius-wise), linearly decreasing with greater radii and finally reaching zero, when the object is <code>diameter/2</code> away from the orientation vector. 77 -- <em>sphere</em> A Force Field which exerts force radially away from itself, with the greatest magnitude (proportional to <em>velocity</em>) being in the origin of the ForceField, linearly decreasing with respect to the distance to the origin and finally reaching zero at distance <code>diameter/2</code>. 78 79 @author 80 Aurelian Jaggi 81 82 @author 83 Damian 'Mozork' Frick 84 85 @inGroup Objects 86 */ 45 87 class _ObjectsExport ForceField : public StaticEntity, public Tickable 46 88 { 47 public:48 ForceField(BaseObject* creator);49 virtual ~ForceField();50 virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);51 virtual void tick(float dt);89 public: 90 ForceField(BaseObject* creator); 91 virtual ~ForceField(); 92 virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); 93 virtual void tick(float dt); 52 94 53 inline void setVelocity(float vel)54 { this->velocity_ = vel; }95 inline void setVelocity(float vel) 96 { this->velocity_ = vel; } 55 97 56 inline float getVelocity()57 { returnvelocity_; }98 inline float getVelocity() 99 { return this->velocity_; } 58 100 59 inline void setDiameter(float diam)60 { this->diameter_ = diam; }101 inline void setDiameter(float diam) 102 { this->diameter_ = diam; this->radius_ = diam/2; } 61 103 62 inline float getDiameter()63 { returndiameter_; }104 inline float getDiameter() 105 { return this->diameter_; } 64 106 65 inline void setLength(float l)66 { this->length_ = l; }107 inline void setLength(float l) 108 { this->length_ = l; this->halfLength_ = l/2; } 67 109 68 inline float getLength() 69 { return length_; } 110 inline float getLength() 111 { return this->length_; } 112 113 void setMode(const std::string& mode); 114 115 inline const std::string& getMode(void); 70 116 71 private: 72 float velocity_; 73 float diameter_; 74 float length_; 117 private: 118 static const std::string modeStringTube_s; 119 static const std::string modeStringSphere_s; 120 121 float velocity_; 122 float diameter_; 123 float radius_; 124 float length_; 125 float halfLength_; 126 ForceFieldMode::Value mode_; 75 127 }; 76 128 }
Note: See TracChangeset
for help on using the changeset viewer.