[Orxonox-commit 6138] r10796 - code/branches/AI_HS15/src/orxonox/controllers

gania at orxonox.net gania at orxonox.net
Thu Nov 12 09:30:14 CET 2015


Author: gania
Date: 2015-11-12 09:30:14 +0100 (Thu, 12 Nov 2015)
New Revision: 10796

Modified:
   code/branches/AI_HS15/src/orxonox/controllers/CommonController.cc
   code/branches/AI_HS15/src/orxonox/controllers/CommonController.h
   code/branches/AI_HS15/src/orxonox/controllers/DivisionController.cc
Log:
Sometimes there are too many rotations

Modified: code/branches/AI_HS15/src/orxonox/controllers/CommonController.cc
===================================================================
--- code/branches/AI_HS15/src/orxonox/controllers/CommonController.cc	2015-11-10 18:50:34 UTC (rev 10795)
+++ code/branches/AI_HS15/src/orxonox/controllers/CommonController.cc	2015-11-12 08:30:14 UTC (rev 10796)
@@ -357,6 +357,199 @@
             bHasTargetOrientation_ = false;
         }
     }
+    float CommonController::randomInRange(float a, float b)
+    {
+        float random = rnd(1.0f);
+        float diff = b - a;
+        float r = random * diff;
+        return a + r;
+    }
+    void CommonController::attack()
+    {
+        if ( !this->getControllableEntity() )
+            return;
+        if ( this->target_ )
+        {
+            this->positionOfTarget_ = getPredictedPosition( 
+                this->getControllableEntity()->getWorldPosition(), 
+                hardcoded_projectile_speed, 
+                this->target_->getWorldPosition(), 
+                this->target_->getVelocity() 
+                );
+            Vector3 diffVector = this->positionOfTarget_ - this->getControllableEntity()->getWorldPosition();
+            float diffLength = diffVector.length();
+            if (diffLength < 100)
+            {
+                Vector3* targetPosition;
+                targetPosition = new Vector3 ( 
+                    //randomInRange(200, 300), 
+                    0,
+                    //randomInRange(-300, -200), 
+                    0,
+                    randomInRange(-300, -400) 
+                    );
+                Quaternion rotationToTarget = (this->getControllableEntity()->getOrientation() * WorldEntity::FRONT).getRotationTo(diffVector);
+                Vector3 target = rotationToTarget * (*targetPosition);
+                moveToPoint( 
+                    target, 
+                    randomInRange(45, 180) 
+                    );
+                executingMoveToPoint_ = true; 
+                return;
+            }
+            this->bShooting_ = true;
+            this->positionOfTarget_ = getPredictedPosition( 
+                this->getControllableEntity()->getWorldPosition(), 
+                hardcoded_projectile_speed, 
+                this->target_->getWorldPosition(), 
+                this->target_->getVelocity() 
+                );
+            this->targetPosition_ = positionOfTarget_;
+
+        }    
+        else
+        {
+            this->chooseManeuverType();
+        }
+    }
+    void CommonController::scissors()
+    {
+        if ( !this->getControllableEntity() )
+            return;
+        if ( this->target_ )
+        {
+            this->positionOfTarget_ = getPredictedPosition( 
+                this->getControllableEntity()->getWorldPosition(), 
+                hardcoded_projectile_speed, 
+                this->target_->getWorldPosition(), 
+                this->target_->getVelocity() 
+                );
+            Vector3 diffVector = this->positionOfTarget_ - this->getControllableEntity()->getWorldPosition();
+            float diffLength = diffVector.length();
+            Vector3 opponentForwardVector = this->target_->getOrientation() * WorldEntity::FRONT;
+            float opponentDotProduct = diffVector.dotProduct(opponentForwardVector);            
+            
+            int f = (int) rnd(100.0f);
+            f = (f % 2 == 0 ? 1 : -1);
+
+            if(!this->executingMoveToPoint_)
+            {
+                Vector3* targetPosition;
+                if ( diffLength < 100 )
+                {
+                    targetPosition = new Vector3 ( 
+                        //f * randomInRange(200, 300), 
+                        0,
+                        //f * randomInRange(-300, -200), 
+                        0,
+                        //randomInRange(-300, -400) 
+                        0
+                        );
+                }
+                else
+                {
+                    if ( opponentDotProduct < 0 )
+                    {
+                        targetPosition = new Vector3 ( 
+                        //f * randomInRange(200, 300), 
+                        0,
+                        //f * randomInRange(-300, -200), 
+                        0,
+                        //randomInRange(-300, -400) 
+                        -300
+                        );
+                    }
+                    else
+                    {
+                        targetPosition = new Vector3 ( 
+                        //f * randomInRange(200, 300), 
+                        0,
+                        //f * randomInRange(-300, -200), 
+                        0,
+                        //randomInRange(-300, -400) 
+                        300
+                        );
+                    }
+                }
+                Quaternion rotationToTarget = (this->getControllableEntity()->getOrientation() * WorldEntity::FRONT).getRotationTo(diffVector);
+                Vector3 target = rotationToTarget * (*targetPosition);
+                moveToPoint( 
+                    target, 
+                    randomInRange(45, 180) 
+                    );
+                executingMoveToPoint_ = true;  
+            }
+        }
+        
+        else
+        {
+            this->chooseManeuverType();
+        }
+    }
+    void CommonController::gunsD()
+    {
+        if ( !this->getControllableEntity() )
+            return;
+        if ( this->target_ )
+        {
+            this->positionOfTarget_ = getPredictedPosition( 
+                this->getControllableEntity()->getWorldPosition(), 
+                hardcoded_projectile_speed, 
+                this->target_->getWorldPosition(), 
+                this->target_->getVelocity() 
+                );
+            Vector3 diffVector = this->positionOfTarget_ - this->getControllableEntity()->getWorldPosition();
+            float diffLength = diffVector.length();
+            if(!this->executingMoveToPoint_)
+            {
+                Vector3* targetPosition;
+                if ( diffLength < 200 )
+                {
+                    targetPosition = new Vector3 ( 
+                        //f * randomInRange(200, 300), 
+                        0,
+                        //f * randomInRange(-300, -200), 
+                        0,
+                        //randomInRange(-300, -400) 
+                        0
+                        );
+                }
+                else if ( diffLength < 500 )
+                {
+                    targetPosition = new Vector3 ( 
+                        //randomInRange(100, 200), 
+                        0,
+                        //randomInRange(-200, -100), 
+                        0,
+                        //randomInRange(-400, -600) 
+                        500
+                        );
+                }
+                else
+                {
+                    targetPosition = new Vector3 ( 
+                        //randomInRange(200, 300), 
+                        0,
+                        //randomInRange(-300, -200), 
+                        0,
+                        //randomInRange(-400, -600) 
+                        500
+                        );
+                }
+                Quaternion rotationToTarget = (this->getControllableEntity()->getOrientation() * WorldEntity::FRONT).getRotationTo(diffVector);
+                Vector3 target = rotationToTarget * (*targetPosition);
+                moveToPoint( 
+                    target, 
+                    randomInRange(45, 180) 
+                    );
+                executingMoveToPoint_ = true;  
+            }
+        }
+        else
+        {
+            this->chooseManeuverType();
+        }
+    }
     //to be called in action
     //PRE: relativeTargetPosition is desired position relative to the spaceship,
     //angleRoll is the angle in degrees of Roll that should be applied by the end of the movement

Modified: code/branches/AI_HS15/src/orxonox/controllers/CommonController.h
===================================================================
--- code/branches/AI_HS15/src/orxonox/controllers/CommonController.h	2015-11-10 18:50:34 UTC (rev 10795)
+++ code/branches/AI_HS15/src/orxonox/controllers/CommonController.h	2015-11-12 08:30:14 UTC (rev 10796)
@@ -78,7 +78,9 @@
 
     class _OrxonoxExport CommonController : public Controller
     {
+
         public:
+        static const float hardcoded_projectile_speed = 750;
 
             static const float ACTION_INTERVAL = 1.0f;
 
@@ -146,7 +148,7 @@
             bool bSetupWorked; //<! If false, setupWeapons() is called.
             int getFiremode(std::string name);
 
-
+            float randomInRange(float a, float b);
             bool bHasTargetPosition_;
             Vector3 targetPosition_;
             bool bHasTargetOrientation_;
@@ -166,7 +168,9 @@
 
 
             void chooseManeuverType();
-
+            void gunsD();
+            void attack();
+            void scissors();
             FormationMode::Value formationMode_;
             Rank::Value rank_;
             ManeuverType::Value maneuverType_;

Modified: code/branches/AI_HS15/src/orxonox/controllers/DivisionController.cc
===================================================================
--- code/branches/AI_HS15/src/orxonox/controllers/DivisionController.cc	2015-11-10 18:50:34 UTC (rev 10795)
+++ code/branches/AI_HS15/src/orxonox/controllers/DivisionController.cc	2015-11-12 08:30:14 UTC (rev 10796)
@@ -76,6 +76,36 @@
         {
             executingMoveToPoint_ = !this->moveAndRoll(dt);
         }
+        else
+        {
+            if (this->target_)
+            {
+                this->positionOfTarget_ = getPredictedPosition( 
+                    this->getControllableEntity()->getWorldPosition(), 
+                    hardcoded_projectile_speed, 
+                    this->target_->getWorldPosition(), 
+                    this->target_->getVelocity() 
+                    );
+                Vector3 diffVector = this->positionOfTarget_ - this->getControllableEntity()->getWorldPosition();
+                float diffLength = diffVector.length();
+               /* Quaternion rotationToTarget = (this->getControllableEntity()->getOrientation() * WorldEntity::FRONT).getRotationTo(diffVector);
+                Vector3* targetPosition = new Vector3 ( 0, 0, -200 );
+                Vector3 target = rotationToTarget * (*targetPosition);*/
+                if (diffLength > 200)
+                    this->setTargetPosition( this->positionOfTarget_ - 0.6f*diffVector);
+                
+                else
+                    this->setTargetPosition( this->getControllableEntity()->getWorldPosition() );
+                executingMoveToPoint_ = true;  
+            }
+            
+            
+            if (this->maneuverType_ == ManeuverType::OFFENSIVE)
+            {
+                this->attack();
+                this->moveAndRoll(dt);
+            }
+        }
         if (this->bShooting_)
             doFire();
         SUPER(DivisionController, tick, dt);
@@ -103,7 +133,7 @@
                 }
             }
         }*/
-        this->chooseManeuverType();
+        //this->chooseManeuverType();
         switch (this->maneuverType_)
         {
             case ManeuverType::NONE:
@@ -112,23 +142,34 @@
                 setTargetPositionOfWingman();
                 break;
             }
-            case ManeuverType::DEFENSIVE:
+            case ManeuverType::DEFENCIVE:
             {
                 this->gunsD();
+                break;
             }
             case ManeuverType::OFFENSIVE:
             {
                 this->attack();
+                break;
             }
+            case ManeuverType::NEUTRAL:
+            {
+                this->scissors();
+            }
+            default:
+            {
+                this->gunsD();
+                break;
+            }
         }
        
-        if (!executingMoveToPoint_)
+        /*if (!executingMoveToPoint_)
         {
             Vector3* targetPosition = new Vector3 (0, 0, -2000);
             moveToPoint(*targetPosition, 180);
             executingMoveToPoint_ = true;
         }
-        
+        */
         if (this->myFollower_ && this->target_)
             this->myFollower_->setTarget(this->target_);
         if (this->target_ && this->myWingman_)




More information about the Orxonox-commit mailing list