Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Dec 5, 2007, 10:08:12 PM (16 years ago)
Author:
motth
Message:

added actual flocking code and two frameworks

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/AI/src/Flocking.h

    r326 r426  
    1313#include <Ogre.h>
    1414#include <OgreVector3.h>
     15
    1516
    1617#include <iostream>
     
    2930    Vector3 speed;  // speedvector of the element
    3031    Vector3 acceleration;  // accelerationvector of the element
     32    bool movable;  // movability of the element
    3133
    3234  Element() {
     
    3436    speed = (0,0,0);
    3537    location = (0,0,0);
     38    movable = true;
    3639  }
    3740
    38   Element(Vector3 location_, Vector3 speed_, Vector3 acceleration_) {
     41  Element(Vector3 location_, Vector3 speed_, Vector3 acceleration_, bool movable_) {
    3942    acceleration = acceleration_;
    4043    speed = speed_;
    4144    location = location_;
     45    movable = movable_;
    4246  }
    4347
    44   void setValues(Vector3 location_, Vector3 speed_, Vector3 acceleration_) {
     48  void setValues(Vector3 location_, Vector3 speed_, Vector3 acceleration_, bool movable_) {
    4549    acceleration = acceleration_;
    4650    speed = speed_;
    4751    location = location_;
     52    movable = movable_;
    4853  }
    4954
     
    5459  }
    5560
    56 //EINF[GEN DES ELEMENTS
     61//EINFÜGEN DES ELEMENTS
    5762  void update(Element arrayOfElements[], const FrameEvent& time) {
    58     calculateAcceleration(arrayOfElements);  //updates the acceleration
    59     calculateSpeed(time);  //updates the speed
    60     calculateLocation(time);  //updates the location
     63      if (this->movable == true) {calculateAcceleration(arrayOfElements);}
     64
     65 /*   if (this->movable ==  true) {
     66      calculateAcceleration(arrayOfElements);  //updates the acceleration
     67      calculateSpeed(time);  //updates the speed
     68      calculateLocation(time);  //updates the location
     69    }   */
    6170  }
    6271
    63 //EINF[GEN DES ELEMENTS
     72//EINFÜGEN DES ELEMENTS
    6473  void calculateAcceleration(Element arrayOfElements[]) {
    6574  //calculates the accelerationvector based on the steeringvectors of
     
    7988  Vector3 separation(Element arrayOfElements[]) {
    8089    Vector3* steering = new Vector3(0,0,0); //steeringvector
     90    Vector3* inverseDistance = new Vector3(0,0,0);
    8191    int numberOfNeighbour = 0;  //number of observed neighbours
     92    float distance = 0;
    8293    //go through all elements
    83     for(int i=0; i<3; i++) {  //just working with 3 elements at the moment
     94    for(int i=0; i<9; i++) {  //just working with 3 elements at the moment
    8495      Element actual = arrayOfElements[i];  //get the actual element
    85       float distance = getDistance(actual);  //get distance between this and actual
     96      distance = getDistance(actual);  //get distance between this and actual
    8697//DUMMY SEPERATION DETECTION DISTANCE =100
    87       if ((distance > 0) && (distance<100)) {  //do only if actual is inside detectionradius
    88         Vector3 inverseDistance = actual.location-location;  //calculate the distancevector heading towards this
    89         inverseDistance = inverseDistance.normalise(); //does this work correctly?  //normalise the distancevector
    90         inverseDistance = inverseDistance/*/distance*/;  //devide distancevector by distance (the closer the bigger gets the distancevector -> steeringvector)
    91         *steering = *steering + inverseDistance;  //add up all significant steeringvectors
     98      if ((distance > 0) && (distance < 200)) {  //do only if actual is inside detectionradius
     99        *inverseDistance = (0,0,0);
     100        *inverseDistance = location-actual.location;  //calculate the distancevector heading towards this
     101        //*inverseDistance = inverseDistance->normalise(); //does this work correctly?  //normalise the distancevector
     102        if ((distance < 100) && (distance >= 80)) {*inverseDistance = *inverseDistance*2;}
     103        if ((distance < 80) && (distance >= 60)) {*inverseDistance = *inverseDistance*5;}
     104        if ((distance < 60) && (distance >= 40)) {*inverseDistance = *inverseDistance*10;}
     105        if ((distance < 40) && (distance > 0)) {*inverseDistance = *inverseDistance*20;}
     106      //  *inverseDistance = *inverseDistance/distance;  //devide distancevector by distance (the closer the bigger gets the distancevector -> steeringvector)
     107        *steering = *steering + *inverseDistance;  //add up all significant steeringvectors
    92108        numberOfNeighbour++;  //counts the elements inside the detectionradius
    93109      }
     
    96112    *steering = *steering / (float)numberOfNeighbour;  //devide the sum of steeringvectors by the number of elements -> separation steeringvector
    97113    }
     114    cout<<*steering<<endl;
    98115    return *steering;
    99116  }
     
    102119    Vector3* steering = new Vector3(0,0,0); //steeringvector
    103120    int numberOfNeighbour = 0;  //number of observed neighbours
     121    float distance = 0;
    104122    //go through all elements
    105     for(int i=0; i<3; i++) {  //just working with 3 elements at the moment
     123    for(int i=0; i<9; i++) {  //just working with 3 elements at the moment
    106124      Element actual = arrayOfElements[i];  //get the actual element
    107125      float distance = getDistance(actual);  //get distance between this and actual
    108126//DUMMY ALIGNMENT DETECTION DISTANCE = 1000
    109       if ((distance > 0) && (distance<1000)) {  //check if actual element is inside detectionradius
     127      if ((distance > 0) && (distance < 300)) {  //check if actual element is inside detectionradius
    110128        *steering = *steering + actual.speed;  //add up all speedvectors inside the detectionradius
    111129        numberOfNeighbour++;  //counts the elements inside the detectionradius
     
    121139    Vector3* steering = new Vector3(0,0,0); //steeringvector
    122140    int numberOfNeighbour = 0;  //number of observed neighbours
     141    float distance = 0;
    123142    //go through all elements
    124     for(int i=0; i<3; i++) {  //just working with 3 elements at the moment
     143    for(int i=0; i<9; i++) {  //just working with 3 elements at the moment
    125144      Element actual = arrayOfElements[i];  //get the actual element
    126145      float distance = getDistance(actual);  //get distance between this and actual
    127146// DUMMY COHESION DETECTION DISTANCE = 1000
    128       if ((distance > 0) && (distance<1000)) {  //check if actual element is inside detectionradius
     147      if ((distance > 0) && (distance < 5000)) {  //check if actual element is inside detectionradius
    129148        *steering = *steering + actual.location;  //add up all locations of elements inside the detectionradius
    130149        numberOfNeighbour++;  //counts the elements inside the detectionradius
     
    133152    if(numberOfNeighbour > 0) {
    134153    *steering = *steering  / (float)numberOfNeighbour;  //devide the sum steeringvector by the number of elements -> cohesion steeringvector
     154    *steering = *steering - this->location;  // (?) Koordinatensystem?
    135155    }
    136156    return *steering;
    137157  }
    138  
    139158};
    140159
Note: See TracChangeset for help on using the changeset viewer.