Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 8908


Ignore:
Timestamp:
Oct 26, 2011, 8:34:40 PM (13 years ago)
Author:
willis
Message:

formationflight: different form of formation + correct orientation added

Location:
code/branches/formation/src/orxonox/controllers
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • code/branches/formation/src/orxonox/controllers/ArtificialController.cc

    r8858 r8908  
    8080        this->bShooting_ = false;
    8181        this->bHasTargetPosition_ = false;
     82        this->bHasTargetOrientation_=false;
    8283        this->speedCounter_ = 0.2f;
    8384        this->targetPosition_ = Vector3::ZERO;
     
    372373            if (distance < 300)
    373374            {
     375                 if (bHasTargetOrientation_)
     376                    {
     377                        copyTargetOrientation();
     378                    }
    374379                if (distance < 40)
    375380                {
    376381                    this->getControllableEntity()->moveFrontBack(0.8f*SPEED_MASTER);
     382                   
    377383                } else this->getControllableEntity()->moveFrontBack(1.2f*SPEED_MASTER);
    378384
     
    385391        {
    386392            this->positionReached();
     393            bHasTargetOrientation_=false;
    387394        }
    388395    }
     
    391398    {
    392399        this->moveToPosition(this->targetPosition_);
     400    }
     401
     402    void ArtificialController::copyOrientation(const Quaternion& orient)
     403    {
     404        //roll angle in radian, difference between master and slave
     405        float diff=orient.getRoll().valueRadians()-(this->getControllableEntity()->getOrientation().getRoll().valueRadians());
     406        if ((diff<math::twoPi && diff>math::pi) || diff>(math::pi)*3)
     407        {
     408                diff=diff-math::twoPi;
     409        }
     410        this->getControllableEntity()->rotateRoll(1.0f*ROTATEFACTOR_MASTER*diff);
     411    }
     412
     413    void ArtificialController::copyTargetOrientation()
     414    {
     415        if (bHasTargetOrientation_)
     416        {
     417                copyOrientation(targetOrientation_);
     418        }
    393419    }
    394420
     
    476502        }
    477503    }
    478 
    479     /**
     504 /**
    480505        @brief Commands the slaves of a master into a formation. Sufficiently fast not to be called within tick. Initiated by a master.
    481506    */
    482     void ArtificialController::commandSlaves()
     507
     508void ArtificialController::commandSlaves()
    483509    {
    484510        if(this->state_ != MASTER) return;
     
    494520        }
    495521        else
     522        // formation:
    496523        {
    497524            dest += 1.0f*orient*WorldEntity::BACK;
    498525            Vector3 pos = Vector3::ZERO;
     526            bool left=true;
    499527            int i = 1;
    500 
     528           
    501529            for(std::vector<ArtificialController*>::iterator it = slaves_.begin(); it != slaves_.end(); it++)
    502530            {
    503531                pos = Vector3::ZERO;
    504                 if (i <= 1) pos += dest  + (float)FORMATION_WIDTH*(orient*WorldEntity::LEFT);
    505                 if (i == 2) pos += dest  + (float)FORMATION_WIDTH*(orient*WorldEntity::RIGHT);
    506                 if (i == 3) pos += dest  + (float)FORMATION_WIDTH*(orient*WorldEntity::UP);
    507                 if (i >= 4)
    508                 {
    509                     pos += dest  + (float)FORMATION_WIDTH*(orient*WorldEntity::DOWN);
    510                     i = 1;
    511                     dest += (float)FORMATION_LENGTH*(orient*WorldEntity::BACK);
    512                     (*it)->setTargetPosition(pos);
    513                     continue;
    514                 }
    515                 i++;
     532                if (left)
     533                {
     534                    pos+=dest+i*FORMATION_WIDTH*(orient*WorldEntity::LEFT);
     535                } else
     536                {
     537                    pos+=dest+i*FORMATION_WIDTH*(orient*WorldEntity::RIGHT);
     538                    i++;
     539                    dest+=FORMATION_LENGTH*(orient*WorldEntity::BACK);
     540                }               
     541                (*it)->setTargetOrientation(orient);
    516542                (*it)->setTargetPosition(pos);
     543                left=!left;
    517544            }
    518545        }
     
    819846        this->targetPosition_ = Vector3(rnd(-2000,2000), rnd(-2000,2000), rnd(-2000,2000));
    820847        this->bHasTargetPosition_ = true;
     848    }
     849
     850    void ArtificialController::setTargetOrientation(const Quaternion& orient)
     851    {
     852        this->targetOrientation_=orient;       
     853        this->bHasTargetOrientation_=true;
     854    }
     855
     856    void ArtificialController::setTargetOrientation(Pawn* target)
     857    {
     858        if (target)
     859            setTargetOrientation(target->getOrientation());
    821860    }
    822861
  • code/branches/formation/src/orxonox/controllers/ArtificialController.h

    r8706 r8908  
    9696            void moveToPosition(const Vector3& target);
    9797            void moveToTargetPosition();
     98            void copyOrientation(const Quaternion& orient);
     99            void copyTargetOrientation();
    98100
    99101            virtual void positionReached() {}
     
    124126            void searchRandomTargetPosition();
    125127
     128            void setTargetOrientation(const Quaternion& orient);
     129            void setTargetOrientation(Pawn* target);
     130
    126131            void setTarget(Pawn* target);
    127132            void searchNewTarget();
     
    138143            bool bHasTargetPosition_;
    139144            Vector3 targetPosition_;
     145
     146            bool bHasTargetOrientation_;
     147            Quaternion targetOrientation_;
     148
    140149            WeakPtr<Pawn> target_;
    141150            bool bShooting_;
Note: See TracChangeset for help on using the changeset viewer.