-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathaccelerator.cpp
48 lines (41 loc) · 1.58 KB
/
accelerator.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "accelerator.h"
Accelerator::Accelerator(glm::vec3 * position):positionVector(position) {
lastTime = 0;
}
void Accelerator::calcOffset(meow_time_t timeoffset) {
if ( lastTime == 0 ) {
lastTime = timeoffset;
return;
} else {
meow_time_t difference = timeoffset - lastTime;
// F = ma
glm::vec3 accelerationDueToForce = this->mass == 0 ? glm::vec3() : this->forces / this->mass;
accelerationDueToForce = glm::vec3(accelerationDueToForce.x,accelerationDueToForce.y,accelerationDueToForce.z);
glm::vec3 translation = ((float) difference / (1000.0f)) * (velocity + accelerationDueToForce);
positionVector->x = positionVector->x + translation.x;
positionVector->y = positionVector->y + translation.y;
//positionVector->z = positionVector->z + translation.z;
}
}
void Accelerator::accelerate(const glm::vec3 & velocity) {
this->velocity = this->velocity + velocity;
}
void Accelerator::calculateRateOfDeceleration(float decellerationMagnitude) {
if ( decellerationMagnitude ) {
glm::vec3 deceleration = glm::normalize(this->velocity) * -abs(decellerationMagnitude);
if (decellerationMagnitude > glm::distance(glm::vec3(),this->velocity)) {
this->velocity = glm::vec3();
} else {
this->velocity += deceleration;
}
}
}
void Accelerator::setForces(const glm::vec3 & forces) {
this->forces = forces;
}
void Accelerator::setMass(float mass) {
this->mass = mass;
}
const glm::vec3 &Accelerator::getVelocity() const {
return this->velocity;
}