[go: up one dir, main page]

Menu

[8286ad]: / body / Particle.cpp  Maximize  Restore  History

Download this file

69 lines (59 with data), 2.0 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
// Copyright (C) 2001-2019 Sam Varner
//
// This file is part of Vamos Automotive Simulator.
//
// Vamos is free software: you can redistribute it and/or modify it under the terms of
// the GNU General Public License as published by the Free Software Foundation, either
// version 3 of the License, or (at your option) any later version.
//
// Vamos is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with Vamos.
// If not, see <http://www.gnu.org/licenses/>.
#include "Particle.hpp"
using namespace Vamos_Body;
using namespace Vamos_Geometry;
Particle::Particle(double mass, const Three_Vector& position)
: Frame(position),
m_mass(mass)
{}
Particle::Particle(double mass, const Three_Vector& position, const Material& material)
: Frame(position),
m_mass(mass),
m_material(material)
{}
Three_Vector Particle::force() const
{
return rotate_out(m_force);
}
Three_Vector Particle::impulse() const
{
return rotate_out(m_impulse);
}
Three_Vector Particle::torque() const
{
return rotate_out(m_torque);
}
void Particle::contact(const Three_Vector& impulse, const Three_Vector& velocity,
double depth, const Three_Vector& normal,
const Three_Vector& angular_velocity, const Material& material)
{
// Particles without materials don't take part in collisions.
if (m_material.type() == Material::UNKNOWN)
reset();
else
{
auto neg_v_par = velocity.project(normal) - velocity;
m_force = rotate_in(
(m_material.friction_factor() * material.friction_factor()) * neg_v_par);
m_impulse = rotate_in(impulse);
}
}
void Particle::reset()
{
m_force.zero();
m_torque.zero();
m_impulse.zero();
}