Changeset 7673 for code/trunk/src
- Timestamp:
- Nov 25, 2010, 11:24:50 PM (14 years ago)
- Location:
- code/trunk/src
- Files:
-
- 3 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 } -
code/trunk/src/orxonox/infos/Bot.cc
r6417 r7673 82 82 "Max Zorin", 83 83 "Brad Whitaker", 84 "General Koskov",84 "General Georgi Koskov", 85 85 "Franz Sanchez", 86 86 "Alec Trevelyan", 87 87 "Elliot Carver", 88 "Elektra King" 88 89 "Viktor Zokas", 89 90 "Gustav Graves",
Note: See TracChangeset
for help on using the changeset viewer.