vOOlkan
An object oriented approach to Vulkan
Cinematicable.h
Go to the documentation of this file.
1#ifndef VULKAN_CINEMATICABLE
2#define VULKAN_CINEMATICABLE
3
4#include "Moveable.h"
5#include "Foundations.h"
6#include "Field.h"
7
8
10 Force emptyField(const Position&, const Cinematicable&);
11}
12
13
14namespace Vulkan::Physics {
15
21 class Cinematicable : public Moveable {
22 public:
23
24 Cinematicable(Position position = { 0.0f, 0.0f, 0.0f }, glm::vec3 rotationEuler = { 0.0f, 0.0f, 0.0f }, Mass mass = 1.0f, Speed initialSpeed = { 0.0f, 0.0f, 0.0f }, Acceleration initialAcceleration = { 0.0f, 0.0f, 0.0f }, Force internalForce = { 0.0f, 0.0f, 0.0f }, float angularSpeed = 0.0f, Field emittedField = Field{ {0.0f, 0.0f, 0.0f}, FieldFunctions::emptyField }) :
25 Moveable{ position, rotationEuler }, mass{ mass }, speed{ initialSpeed }, acceleration{ initialAcceleration }, internalForce{ internalForce }, angularSpeed{ angularSpeed }, emittedField {
27 } {}
28
29
30 virtual void setMass(Mass mass) {
31 this->mass = mass;
32 }
33
34 virtual Mass getMass() const {
35 return mass;
36 }
37
38 virtual void setSpeed(Speed speed) {
39 this->speed = speed;
40 }
41
42 virtual const Speed& getSpeed() const {
43 return speed;
44 }
45
47 this->acceleration = acceleration;
48 }
49
50 virtual const Acceleration& getAcceleration() const {
51 return acceleration;
52 }
53
55 this->internalForce = internalForce;
56 }
57
58 virtual const Force& getInternalForce() const {
59 return internalForce;
60 }
61
63 return emittedField;
64 }
65
66 virtual void setPosition(Position position) override {
67 DeltaSpace delta = position - getPosition();
68 Moveable::setPosition(position);
69 emittedField.setPosition(emittedField.getPosition() + delta); //the field "follows" the object it is attached to
70 }
71
72 virtual Cinematicable& translate(DeltaSpace delta) override {
73 setPosition(getPosition() + delta);
74 return *this;
75 };
76
77
78 virtual float getAngularSpeed() const {
79 return angularSpeed;
80 }
81
82
83 virtual void setAngularSpeed(float angularSpeed) {
84 this->angularSpeed = angularSpeed;
85 }
86
87
92 virtual void addExternalForce(Force externalForce) {
93 impulsiveForce += externalForce;
94 }
95
96
97 virtual void reset(Position position) {
98 setPosition(position);
99 speed = { 0.0f, 0.0f, 0.0f };
100 acceleration = { 0.0f, 0.0f, 0.0f };
101 impulsiveForce = { 0.0f, 0.0f, 0.0f };
102 angularSpeed = 0.0f;
103 }
104
105
109 virtual void move(Time elapsedTime) {
110 //FIXTHIS /10.0f
111 if (float(mass) == std::numeric_limits<float>::max()/10.0f) {
112 setAcceleration({ 0.0f, 0.0f, 0.0f });
113 }
114 else {
115 setAcceleration((impulsiveForce + internalForce) / mass); // F = m*a (Newton III)
116 }
117 impulsiveForce = { 0.0f, 0.0f, 0.0f }; //reset impulsive forces
118 setSpeed(speed + acceleration * elapsedTime); // ds = a/t --> s' = s + a/t
119 translate(speed * elapsedTime); // dp = s/t --> p' = p + v/t (this consider a movement at a uniform speed, which is the final speed)
120 rotate(angularSpeed * float(elapsedTime), glm::vec3(0.0f, 0.0f, 1.0f)); //only xy plane for now, and only arbitrary velocity (no angular acceleration based on momentum)
121 }
122
123 protected:
128 Force impulsiveForce; //externalForces which act on the body now. This is reset when move is called.
130 float angularSpeed; //only xy plane considered
131 };
132
133}
134
135
136#endif
Definition: Foundations.h:254
A Cinematicable object is a Movable object which obeys to physics laws.
Definition: Cinematicable.h:21
virtual void setPosition(Position position) override
Definition: Cinematicable.h:66
Speed speed
Definition: Cinematicable.h:125
virtual void setAngularSpeed(float angularSpeed)
Definition: Cinematicable.h:83
Acceleration acceleration
Definition: Cinematicable.h:126
virtual void setMass(Mass mass)
Definition: Cinematicable.h:30
virtual float getAngularSpeed() const
Definition: Cinematicable.h:78
float angularSpeed
Definition: Cinematicable.h:130
virtual void reset(Position position)
Definition: Cinematicable.h:97
virtual Cinematicable & translate(DeltaSpace delta) override
Definition: Cinematicable.h:72
virtual void move(Time elapsedTime)
Computes the new position of the object based on its current speed and the forces which are acting on...
Definition: Cinematicable.h:109
virtual Mass getMass() const
Definition: Cinematicable.h:34
Mass mass
Definition: Cinematicable.h:124
virtual const Speed & getSpeed() const
Definition: Cinematicable.h:42
Cinematicable(Position position={ 0.0f, 0.0f, 0.0f }, glm::vec3 rotationEuler={ 0.0f, 0.0f, 0.0f }, Mass mass=1.0f, Speed initialSpeed={ 0.0f, 0.0f, 0.0f }, Acceleration initialAcceleration={ 0.0f, 0.0f, 0.0f }, Force internalForce={ 0.0f, 0.0f, 0.0f }, float angularSpeed=0.0f, Field emittedField=Field{ {0.0f, 0.0f, 0.0f}, FieldFunctions::emptyField })
Definition: Cinematicable.h:24
virtual const Acceleration & getAcceleration() const
Definition: Cinematicable.h:50
virtual Field getEmittedField()
Definition: Cinematicable.h:62
virtual const Force & getInternalForce() const
Definition: Cinematicable.h:58
virtual void setSpeed(Speed speed)
Definition: Cinematicable.h:38
virtual void addExternalForce(Force externalForce)
Sums to the already present external forces the argument.
Definition: Cinematicable.h:92
Force impulsiveForce
Definition: Cinematicable.h:128
virtual void setInternalForce(Force internalForce)
Definition: Cinematicable.h:54
Force internalForce
Definition: Cinematicable.h:127
Field emittedField
Definition: Cinematicable.h:129
virtual void setAcceleration(Acceleration acceleration)
Definition: Cinematicable.h:46
Definition: Foundations.h:230
A force Field is an object which can interact with other objects with a force, defined by its calcula...
Definition: Field.h:13
void setPosition(Position position)
Definition: Field.h:32
Position getPosition() const
Definition: Field.h:27
Definition: Foundations.h:265
Definition: Foundations.h:161
A Movable object is an object which can be moved and rotated.
Definition: Moveable.h:16
virtual Moveable & rotate(float angle, glm::vec3 axis)
Definition: Moveable.h:38
virtual void setPosition(Position position)
Definition: Moveable.h:33
virtual const Position & getPosition() const
Definition: Moveable.h:28
Moveable(Position position={ 0.0f, 0.0f, 0.0f }, glm::vec3 rotationEuler={ 0.0f, 0.0f, 0.0f })
Definition: Moveable.h:18
Definition: Foundations.h:187
Definition: Foundations.h:242
Definition: Foundations.h:175
Definition: Cinematicable.h:9
Force emptyField(const Position &, const Cinematicable &)
Definition: FieldFunctions.h:10
Definition: Cinematicable.h:9