From b78e7232536d999ad186879cd3fdbf6ae6789ab4 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 4 Mar 2014 15:53:05 -0800 Subject: [PATCH] fix a NaN in ViewFrustum and BuckyBalls --- interface/src/BuckyBalls.cpp | 31 ++++++++++++++++------------ libraries/octree/src/ViewFrustum.cpp | 6 +++--- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/interface/src/BuckyBalls.cpp b/interface/src/BuckyBalls.cpp index 4c7797d062..14d4d0f1a8 100644 --- a/interface/src/BuckyBalls.cpp +++ b/interface/src/BuckyBalls.cpp @@ -106,21 +106,26 @@ void BuckyBalls::simulate(float deltaTime, const HandData* handData) { for (int j = 0; j < NUM_BBALLS; j++) { if (i != j) { glm::vec3 diff = _bballPosition[i] - _bballPosition[j]; - float penetration = glm::length(diff) - (_bballRadius[i] + _bballRadius[j]); - if (penetration < 0.f) { - // Colliding - move away and transfer velocity - _bballPosition[i] -= glm::normalize(diff) * penetration * COLLISION_BLEND_RATE; - if (glm::dot(_bballVelocity[i], diff) < 0.f) { - _bballVelocity[i] = _bballVelocity[i] * (1.f - COLLISION_BLEND_RATE) + - glm::reflect(_bballVelocity[i], glm::normalize(diff)) * COLLISION_BLEND_RATE; + + float diffLength = glm::length(diff); + float penetration = diffLength - (_bballRadius[i] + _bballRadius[j]); + + if (diffLength != 0) { + if (penetration < 0.f) { + // Colliding - move away and transfer velocity + _bballPosition[i] -= glm::normalize(diff) * penetration * COLLISION_BLEND_RATE; + if (glm::dot(_bballVelocity[i], diff) < 0.f) { + _bballVelocity[i] = _bballVelocity[i] * (1.f - COLLISION_BLEND_RATE) + + glm::reflect(_bballVelocity[i], glm::normalize(diff)) * COLLISION_BLEND_RATE; + } + } else if ((penetration > EPSILON) && (penetration < BBALLS_ATTRACTION_DISTANCE)) { + // If they get close to each other, bring them together with magnetic force + _bballPosition[i] -= glm::normalize(diff) * penetration * ATTRACTION_BLEND_RATE; + + // Also make their velocities more similar + _bballVelocity[i] = _bballVelocity[i] * (1.f - ATTRACTION_VELOCITY_BLEND_RATE) + _bballVelocity[j] * ATTRACTION_VELOCITY_BLEND_RATE; } } - else if ((penetration > EPSILON) && (penetration < BBALLS_ATTRACTION_DISTANCE)) { - // If they get close to each other, bring them together with magnetic force - _bballPosition[i] -= glm::normalize(diff) * penetration * ATTRACTION_BLEND_RATE; - // Also make their velocities more similar - _bballVelocity[i] = _bballVelocity[i] * (1.f - ATTRACTION_VELOCITY_BLEND_RATE) + _bballVelocity[j] * ATTRACTION_VELOCITY_BLEND_RATE; - } } } } diff --git a/libraries/octree/src/ViewFrustum.cpp b/libraries/octree/src/ViewFrustum.cpp index cab186ea6e..da353a713e 100644 --- a/libraries/octree/src/ViewFrustum.cpp +++ b/libraries/octree/src/ViewFrustum.cpp @@ -26,9 +26,9 @@ using namespace std; ViewFrustum::ViewFrustum() : _position(0,0,0), _orientation(), - _direction(0,0,0), - _up(0,0,0), - _right(0,0,0), + _direction(IDENTITY_FRONT), + _up(IDENTITY_UP), + _right(IDENTITY_RIGHT), _fieldOfView(0.0), _aspectRatio(1.0f), _nearClip(0.1f),