Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 7673 for code/trunk/src


Ignore:
Timestamp:
Nov 25, 2010, 11:24:50 PM (14 years ago)
Author:
dafrick
Message:

Documenting and extending ForceField.
A little cleaning up in The Time Machine level.
Adding a Bond villain…

Location:
code/trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • code/trunk/src/modules/objects/ForceField.cc

    r5781 r7673  
    2727 */
    2828
     29/**
     30@file ForceField.cc
     31@brief Implementation of the ForceField class.
     32*/
     33
    2934#include "ForceField.h"
    3035
     
    3641{
    3742    CreateFactory(ForceField);
     43   
     44    /*static*/ const std::string modeStringNormal_s = "tube";
     45    /*static*/ const std::string modeStringSphere_s = "sphere";
    3846
    3947    ForceField::ForceField(BaseObject* creator) : StaticEntity(creator)
     
    4351        //Standard Values
    4452        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;
    4857    }
    4958
    50     ForceField::~ForceField() {}
     59    ForceField::~ForceField()
     60    {
     61    }
    5162
    5263    void ForceField::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     
    5869        XMLPortParam(ForceField, "diameter", setDiameter, getDiameter, xmlelement, mode).defaultValues(500);
    5970        XMLPortParam(ForceField, "length"  , setLength  , getLength  , xmlelement, mode).defaultValues(2000);
     71        XMLPortParam(ForceField, "mode", setMode, getMode, xmlelement, mode);
    6072    }
    6173
    6274    void ForceField::tick(float dt)
    6375    {
     76        // Iterate over all objects that could possibly be affected by the ForceField.
    6477        for (ObjectList<MobileEntity>::iterator it = ObjectList<MobileEntity>::begin(); it != ObjectList<MobileEntity>::end(); ++it)
    6578        {
    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();
    6984
    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;
    7192
    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;
    7499
    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)
    76105            {
    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                }
    79113            }
     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;
    80140        }
    81141    }
  • code/trunk/src/modules/objects/ForceField.h

    r7601 r7673  
    2323 *      Aurelian Jaggi
    2424 *   Co-authors:
    25  *      ...
     25 *      Damian 'Mozork' Frick
    2626 *
    2727 */
     
    3131    @brief Definition of the ForceField class.
    3232    @ingroup Objects
     33*/
     34
     35/**
     36@file ForceField.h
     37@brief Definition of the ForceField class.
     38@inGroup Objects
    3339*/
    3440
     
    4349namespace orxonox
    4450{
     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    */
    4587    class _ObjectsExport ForceField : public StaticEntity, public Tickable
    4688    {
    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);
    5294
    53         inline void setVelocity(float vel)
    54             { this->velocity_ = vel; }
     95            inline void setVelocity(float vel)
     96                { this->velocity_ = vel; }
    5597
    56         inline float getVelocity()
    57             { return velocity_; }
     98            inline float getVelocity()
     99                { return this->velocity_; }
    58100
    59         inline void setDiameter(float diam)
    60             { this->diameter_ = diam; }
     101            inline void setDiameter(float diam)
     102                { this->diameter_ = diam; this->radius_ = diam/2; }
    61103
    62         inline float getDiameter()
    63             { return diameter_; }
     104            inline float getDiameter()
     105                { return this->diameter_; }
    64106
    65         inline void setLength(float l)
    66             { this->length_ = l; }
     107            inline void setLength(float l)
     108                { this->length_ = l; this->halfLength_ = l/2; }
    67109
    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);
    70116
    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_;
    75127  };
    76128}
  • code/trunk/src/orxonox/infos/Bot.cc

    r6417 r7673  
    8282            "Max Zorin",
    8383            "Brad Whitaker",
    84             "General Koskov",
     84            "General Georgi Koskov",
    8585            "Franz Sanchez",
    8686            "Alec Trevelyan",
    8787            "Elliot Carver",
     88            "Elektra King"
    8889            "Viktor Zokas",
    8990            "Gustav Graves",
Note: See TracChangeset for help on using the changeset viewer.