physics: add particle_link
This commit is contained in:
parent
f7f109df28
commit
a787ef1e09
52
src/physics/particle_link.cpp
Normal file
52
src/physics/particle_link.cpp
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#include "particle_link.hpp"
|
||||||
|
|
||||||
|
namespace physics {
|
||||||
|
|
||||||
|
float particle_link::current_length() const
|
||||||
|
{
|
||||||
|
vec3 relative_position = particle[0]->position - particle[1]->position;
|
||||||
|
|
||||||
|
return magnitude(relative_position);
|
||||||
|
}
|
||||||
|
|
||||||
|
int particle_cable::fill_contact(particle_contact * contact, int contact_length) const
|
||||||
|
{
|
||||||
|
float cur_length = current_length();
|
||||||
|
if (cur_length < max_length)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
contact->particle[0] = particle[0];
|
||||||
|
contact->particle[1] = particle[1];
|
||||||
|
|
||||||
|
vec3 normal = normalize(particle[1]->position - particle[0]->position);
|
||||||
|
contact->contact_normal = normal;
|
||||||
|
contact->penetration = cur_length - max_length;
|
||||||
|
contact->restitution = restitution;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int particle_rod::fill_contact(particle_contact * contact, int contact_length) const
|
||||||
|
{
|
||||||
|
float cur_length = current_length();
|
||||||
|
if (cur_length == length)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
contact->particle[0] = particle[0];
|
||||||
|
contact->particle[1] = particle[1];
|
||||||
|
|
||||||
|
vec3 normal = normalize(particle[1]->position - particle[0]->position);
|
||||||
|
|
||||||
|
if (cur_length > length) {
|
||||||
|
contact->contact_normal = normal;
|
||||||
|
contact->penetration = cur_length - length;
|
||||||
|
} {
|
||||||
|
contact->contact_normal = -normal;
|
||||||
|
contact->penetration = length - cur_length;
|
||||||
|
}
|
||||||
|
|
||||||
|
contact->restitution = 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
33
src/physics/particle_link.hpp
Normal file
33
src/physics/particle_link.hpp
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "particle.hpp"
|
||||||
|
#include "particle_contact.hpp"
|
||||||
|
|
||||||
|
namespace physics {
|
||||||
|
|
||||||
|
struct particle_link
|
||||||
|
{
|
||||||
|
physics::particle * particle[2];
|
||||||
|
|
||||||
|
float current_length() const;
|
||||||
|
|
||||||
|
virtual int fill_contact(particle_contact * contact, int contact_length) const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct particle_cable : particle_link
|
||||||
|
{
|
||||||
|
float max_length;
|
||||||
|
float restitution;
|
||||||
|
|
||||||
|
int fill_contact(particle_contact * contact, int contact_length) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct particle_rod : particle_link
|
||||||
|
{
|
||||||
|
float length;
|
||||||
|
|
||||||
|
float current_length() const;
|
||||||
|
|
||||||
|
int fill_contact(particle_contact * contact, int contact_length) const override;
|
||||||
|
};
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user