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