mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 05:37:17 +02:00
All avatars now have disk collision proxies at their hands.
This commit is contained in:
parent
235b6f0c36
commit
09bce076cc
1 changed files with 14 additions and 33 deletions
|
@ -137,15 +137,14 @@ void ParticleCollisionSystem::updateCollisionWithParticles(Particle* particleA)
|
||||||
|
|
||||||
void ParticleCollisionSystem::updateCollisionWithAvatars(Particle* particle) {
|
void ParticleCollisionSystem::updateCollisionWithAvatars(Particle* particle) {
|
||||||
|
|
||||||
// particles that are in hand, don't collide with other avatar parts
|
// particles that are in hand, don't collide with avatars
|
||||||
if (particle->getInHand()) {
|
if (particle->getInHand()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf("updateCollisionWithAvatars()...\n");
|
|
||||||
glm::vec3 center = particle->getPosition() * (float)(TREE_SCALE);
|
glm::vec3 center = particle->getPosition() * (float)(TREE_SCALE);
|
||||||
float radius = particle->getRadius() * (float)(TREE_SCALE);
|
float radius = particle->getRadius() * (float)(TREE_SCALE);
|
||||||
const float ELASTICITY = 0.4f;
|
const float ELASTICITY = 0.95f;
|
||||||
const float DAMPING = 0.0f;
|
const float DAMPING = 0.0f;
|
||||||
const float COLLISION_FREQUENCY = 0.5f;
|
const float COLLISION_FREQUENCY = 0.5f;
|
||||||
glm::vec3 penetration;
|
glm::vec3 penetration;
|
||||||
|
@ -157,55 +156,37 @@ void ParticleCollisionSystem::updateCollisionWithAvatars(Particle* particle) {
|
||||||
CollisionInfo collision;
|
CollisionInfo collision;
|
||||||
if (avatar->findSphereCollision(center, radius, collision)) {
|
if (avatar->findSphereCollision(center, radius, collision)) {
|
||||||
if (glm::dot(particle->getVelocity(), collision._addedVelocity) < 0.f) {
|
if (glm::dot(particle->getVelocity(), collision._addedVelocity) < 0.f) {
|
||||||
|
// only collide when particle and collision point are moving toward each other
|
||||||
collision._penetration /= (float)(TREE_SCALE);
|
collision._penetration /= (float)(TREE_SCALE);
|
||||||
collision._addedVelocity /= (float)(TREE_SCALE);
|
collision._addedVelocity /= (float)(TREE_SCALE);
|
||||||
glm::vec3 pv = particle->getVelocity();
|
|
||||||
updateCollisionSound(particle, collision._penetration, COLLISION_FREQUENCY);
|
updateCollisionSound(particle, collision._penetration, COLLISION_FREQUENCY);
|
||||||
applyHardCollision(particle, collision._penetration, ELASTICITY, DAMPING, collision._addedVelocity);
|
applyHardCollision(particle, collision._penetration, ELASTICITY, DAMPING, collision._addedVelocity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: convert other avatars to collide like _selfAvatar
|
|
||||||
|
|
||||||
// loop through all the other avatars for potential interactions...
|
// loop through all the other avatars for potential interactions...
|
||||||
|
|
||||||
foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) {
|
foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) {
|
||||||
//qDebug() << "updateCollisionWithAvatars()... node:" << *node << "\n";
|
//qDebug() << "updateCollisionWithAvatars()... node:" << *node << "\n";
|
||||||
if (node->getLinkedData() && node->getType() == NODE_TYPE_AGENT) {
|
if (node->getLinkedData() && node->getType() == NODE_TYPE_AGENT) {
|
||||||
// TODO: dot collidingPalm and hand velocities and skip collision when they are moving apart.
|
|
||||||
AvatarData* avatar = static_cast<AvatarData*>(node->getLinkedData());
|
AvatarData* avatar = static_cast<AvatarData*>(node->getLinkedData());
|
||||||
//printf("updateCollisionWithAvatars()...avatar=%p\n", avatar);
|
|
||||||
|
CollisionInfo collision;
|
||||||
// check hands...
|
if (avatar->findSphereCollision(center, radius, collision)) {
|
||||||
const HandData* handData = avatar->getHandData();
|
if (glm::dot(particle->getVelocity(), collision._addedVelocity) < 0.f) {
|
||||||
|
// only collide when particle and collision point are moving toward each other
|
||||||
if (handData->findSpherePenetration(center, radius, penetration, collidingPalm)) {
|
collision._penetration /= (float)(TREE_SCALE);
|
||||||
// apply a hard collision when ball collides with hand
|
collision._addedVelocity /= (float)(TREE_SCALE);
|
||||||
penetration /= (float)(TREE_SCALE);
|
updateCollisionSound(particle, collision._penetration, COLLISION_FREQUENCY);
|
||||||
updateCollisionSound(particle, penetration, COLLISION_FREQUENCY);
|
applyHardCollision(particle, collision._penetration, ELASTICITY, DAMPING, collision._addedVelocity);
|
||||||
|
|
||||||
// determine if the palm that collided was moving, if so, then we add that palm velocity as well...
|
|
||||||
glm::vec3 addedVelocity = NO_ADDED_VELOCITY;
|
|
||||||
if (collidingPalm) {
|
|
||||||
glm::vec3 palmVelocity = collidingPalm->getVelocity() / (float)(TREE_SCALE);
|
|
||||||
//printf("collidingPalm Velocity=%f,%f,%f\n", palmVelocity.x, palmVelocity.y, palmVelocity.z);
|
|
||||||
addedVelocity = palmVelocity;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
applyHardCollision(particle, penetration, ELASTICITY, DAMPING, addedVelocity);
|
|
||||||
|
|
||||||
} else if (avatar->findSpherePenetration(center, radius, penetration)) {
|
|
||||||
penetration /= (float)(TREE_SCALE);
|
|
||||||
updateCollisionSound(particle, penetration, COLLISION_FREQUENCY);
|
|
||||||
glm::vec3 addedVelocity = avatar->getVelocity();
|
|
||||||
applyHardCollision(particle, penetration, ELASTICITY, DAMPING, addedVelocity);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: convert applyHardCollision() to take a CollisionInfo& instead of penetration + addedVelocity
|
||||||
void ParticleCollisionSystem::applyHardCollision(Particle* particle, const glm::vec3& penetration,
|
void ParticleCollisionSystem::applyHardCollision(Particle* particle, const glm::vec3& penetration,
|
||||||
float elasticity, float damping, const glm::vec3& addedVelocity) {
|
float elasticity, float damping, const glm::vec3& addedVelocity) {
|
||||||
//
|
//
|
||||||
|
@ -221,7 +202,7 @@ void ParticleCollisionSystem::applyHardCollision(Particle* particle, const glm::
|
||||||
const float EPSILON = 0.0f;
|
const float EPSILON = 0.0f;
|
||||||
float velocityDotPenetration = glm::dot(velocity, penetration);
|
float velocityDotPenetration = glm::dot(velocity, penetration);
|
||||||
if (velocityDotPenetration > EPSILON) {
|
if (velocityDotPenetration > EPSILON) {
|
||||||
position -= penetration;
|
//position -= penetration;
|
||||||
static float HALTING_VELOCITY = 0.2f / (float)(TREE_SCALE);
|
static float HALTING_VELOCITY = 0.2f / (float)(TREE_SCALE);
|
||||||
// cancel out the velocity component in the direction of penetration
|
// cancel out the velocity component in the direction of penetration
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue