-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSpringDamper.cpp
More file actions
93 lines (76 loc) · 1.47 KB
/
SpringDamper.cpp
File metadata and controls
93 lines (76 loc) · 1.47 KB
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include "SpringDamper.h"
#include "Particle.h"
SpringDamper::SpringDamper()
{
_springConstant = 0.5;
_dampingFactor = 0.2;
_restLength = 1;
_p1 = NULL;
_p2 = NULL;
_idx = 0;
}
SpringDamper::~SpringDamper()
{
}
float SpringDamper::springConstant() const
{
return _springConstant;
}
void SpringDamper::setSpringConstant(float springConstant)
{
_springConstant = springConstant;
}
float SpringDamper::dampingFactor() const
{
return _dampingFactor;
}
void SpringDamper::setDampingFactor(float dampingFactor)
{
_dampingFactor = dampingFactor;
}
float SpringDamper::restLength() const
{
return _restLength;
}
void SpringDamper::setRestLength(float restLength)
{
_restLength = restLength;
}
Particle *SpringDamper::p1() const
{
return _p1;
}
void SpringDamper::setP1(Particle *p1)
{
_p1 = p1;
}
Particle *SpringDamper::p2() const
{
return _p2;
}
void SpringDamper::setP2(Particle *p2)
{
_p2 = p2;
}
void SpringDamper::computeForces()
{
if (!_p1 || !_p2) {
return ;
}
QVector3D e = _p2->pos() - _p1->pos();
float l = e.length();
e.normalize();
float v1 = QVector3D::dotProduct(_p1->velocity(), e);
float v2 = QVector3D::dotProduct(_p2->velocity(), e);
QVector3D f = (-_springConstant * (_restLength - l) - _dampingFactor * (v1 - v2)) * e;
_p1->applyForce(f);
_p2->applyForce(-f);
}
int SpringDamper::idx() const
{
return _idx;
}
void SpringDamper::setIdx(int idx)
{
_idx = idx;
}