Changeset 617 for code/branches/FICN/src/orxonox/objects/NPC.cc
- Timestamp:
- Dec 18, 2007, 4:41:20 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/FICN/src/orxonox/objects/NPC.cc
r603 r617 29 29 #include "../core/Iterator.h" 30 30 #include "../core/ObjectList.h" 31 #include "../Flocking.h"31 //#include "../Flocking.h" 32 32 33 33 namespace orxonox { … … 35 35 NPC::NPC() 36 36 { 37 movable_ = true; 37 38 } 38 39 … … 41 42 } 42 43 43 } 44 /** 45 * function to chance values of an element 46 */ 47 void NPC::setValues(Vector3 location, Vector3 speed, Vector3 acceleration, bool movable) { 48 this->setAcceleration(acceleration); 49 this->setVelocity(speed); 50 this->translate(location); 51 movable_ = movable; 52 } 53 54 /** 55 * calculates the distance between the element and an other point given by temp 56 */ 57 float NPC::getDistance(NPC* temp) 58 { 59 Vector3 distance = temp->getPosition() - this->getPosition(); 60 return distance.length(); 61 } 62 63 /** 64 * updates the data of an element 65 */ 66 void NPC::tick(float dt) 67 { 68 69 // find out about this arrayOfElements 70 NPC* arrayOfElements[ANZELEMENTS]; 71 72 //if element is movable, calculate acceleration 73 if (this->movable_ == true) calculateAcceleration(arrayOfElements); 74 75 } 76 77 /** 78 * calculates the new acceleration of an element 79 */ 80 void NPC::calculateAcceleration(NPC** arrayOfElements) 81 { 82 //acceleration consisting of flocking-functions 83 this->setAcceleration(separation(arrayOfElements) + alignment(arrayOfElements) + cohesion(arrayOfElements)); 84 } 85 86 /** 87 * separation-function (keep elements separated, avoid crashs) 88 */ 89 Vector3 NPC::separation(NPC** arrayOfElements) 90 { 91 Vector3 steering = Vector3(0,0,0); //steeringvector 92 Vector3 inverseDistance = Vector3(0,0,0); //vector pointing away from possible collisions 93 int numberOfNeighbour = 0; //number of observed neighbours 94 float distance = 0; // distance to the actual element 95 for(int i=0; i<ANZELEMENTS; i++) { //go through all elements 96 NPC* actual = arrayOfElements[i]; //get the actual element 97 distance = getDistance(actual); //get distance between this and actual 98 if ((distance > 0) && (distance < SEPERATIONDISTANCE)) { //do only if actual is inside detectionradius 99 inverseDistance = Vector3(0,0,0); 100 inverseDistance = this->getPosition() - actual->getPosition(); //calculate the distancevector heading towards this 101 //adaptation of the inverseDistance to the distance 102 if ((distance < 200) && (distance >= 120)) {inverseDistance = 2*inverseDistance;} 103 if ((distance < 120) && (distance >= 80)) {inverseDistance = 5*inverseDistance;} 104 if ((distance < 80) && (distance >= 40)) {inverseDistance = 10*inverseDistance;} 105 if ((distance < 40) && (distance > 0)) {inverseDistance = 10*inverseDistance;} 106 steering = steering + inverseDistance; //add up all significant steeringvectors 107 numberOfNeighbour++; //counts the elements inside the detectionradius 108 } 109 } 110 if(numberOfNeighbour > 0) { steering = steering / (float)numberOfNeighbour; } //devide the sum of steeringvectors by the number of elements -> separation steeringvector 111 return steering; 112 } 113 114 /** 115 * alignment-function (lead elements to the same heading) 116 */ 117 Vector3 NPC::alignment(NPC** arrayOfElements) 118 { 119 Vector3 steering = Vector3(0,0,0); //steeringvector 120 int numberOfNeighbour = 0; //number of observed neighbours 121 //float distance = 0; 122 //go through all elements 123 for(int i=0; i<ANZELEMENTS; i++) { //just working with 3 elements at the moment 124 NPC* actual = arrayOfElements[i]; //get the actual element 125 float distance = getDistance(actual); //get distance between this and actual 126 if ((distance > 0) && (distance < ALIGNMENTDISTANCE)) { //check if actual element is inside detectionradius 127 steering = steering + actual->getVelocity(); //add up all speedvectors inside the detectionradius 128 numberOfNeighbour++; //counts the elements inside the detectionradius 129 } 130 } 131 if(numberOfNeighbour > 0) { steering = steering / (float)numberOfNeighbour; } //devide the sum of steeringvectors by the number of elements -> alignment steeringvector 132 return steering; 133 } 134 135 /** 136 * cohseion-function (keep elements close to each other) 137 */ 138 Vector3 NPC::cohesion(NPC** arrayOfElements) 139 { 140 Vector3 steering = Vector3(0,0,0); //steeringvector 141 int numberOfNeighbour = 0; //number of observed neighbours 142 //float distance = 0; 143 //go through all elements 144 for(int i=0; i<ANZELEMENTS; i++) { //just working with 3 elements at the moment 145 NPC* actual = arrayOfElements[i]; //get the actual element 146 float distance = getDistance(actual); //get distance between this and actual 147 if ((distance > 0) && (distance < COHESIONDISTANCE)) { //check if actual element is inside detectionradius 148 steering = steering + actual->getPosition(); //add up all locations of elements inside the detectionradius 149 numberOfNeighbour++; //counts the elements inside the detectionradius 150 } 151 } 152 if(numberOfNeighbour > 0) { 153 steering = steering / (float)numberOfNeighbour; //devide the sum steeringvector by the number of elements -> cohesion steeringvector 154 steering = steering - this->getPosition(); //transform the vector for the ship 155 } 156 return steering; 157 } 158 159 } // end of class NPC
Note: See TracChangeset
for help on using the changeset viewer.