More info when colliding with meshes + stubbery for poking avatar.

This commit is contained in:
Andrew Meadows 2014-02-10 09:02:29 -08:00
parent 2e65592048
commit 10296577f4
5 changed files with 22 additions and 6 deletions

View file

@ -437,6 +437,20 @@ float Avatar::getHeight() const {
return extents.maximum.y - extents.minimum.y; return extents.maximum.y - extents.minimum.y;
} }
void Avatar::poke(ModelCollisionInfo& collision) {
if (collision._model == &_skeletonModel
&& collision._jointIndex != -1) {
// TODO: Andrew to make this work
printf("ADEBUG model = 0x%x joint = %d p = [%e, %e, %e]\n",
collision._model,
collision._jointIndex,
collision._contactPoint.x,
collision._contactPoint.y,
collision._contactPoint.z
);
}
}
float Avatar::getPelvisFloatingHeight() const { float Avatar::getPelvisFloatingHeight() const {
return -_skeletonModel.getBindExtents().minimum.y; return -_skeletonModel.getBindExtents().minimum.y;
} }

View file

@ -126,6 +126,8 @@ public:
float getHeight() const; float getHeight() const;
void poke(ModelCollisionInfo& collision);
public slots: public slots:
void updateCollisionFlags(); void updateCollisionFlags();

View file

@ -219,16 +219,15 @@ void Hand::updateCollisions() {
// add slapback here // add slapback here
} }
} }
} }
} }
} }
if (avatar->findSphereCollisions(palm.getPosition(), scaledPalmRadius, collisions)) { if (avatar->findSphereCollisions(palm.getPosition(), scaledPalmRadius, collisions)) {
for (size_t j = 0; j < collisions.size(); ++j) { for (size_t j = 0; j < collisions.size(); ++j) {
totalPenetration = addPenetrations(totalPenetration, collisions[j]._penetration); totalPenetration = addPenetrations(totalPenetration, collisions[j]._penetration);
// TODO: Andrew to poke avatar using collision info
avatar->poke(collisions[i]);
} }
// Check for collisions with the other avatar's leap palms
} }
} }
} }

View file

@ -474,10 +474,10 @@ bool Model::findSphereCollision(const glm::vec3& penetratorCenter, float penetra
outerContinue: ; outerContinue: ;
} }
if (jointIndex != -1) { if (jointIndex != -1) {
// TODO? Andrew to store contactPoint
// don't store collisionInfo._model at this stage, let the outer context do that // don't store collisionInfo._model at this stage, let the outer context do that
collisionInfo._penetration = totalPenetration; collisionInfo._penetration = totalPenetration;
collisionInfo._jointIndex = jointIndex; collisionInfo._jointIndex = jointIndex;
collisionInfo._contactPoint = penetratorCenter + penetratorRadius * glm::normalize(totalPenetration);
return true; return true;
} }
return false; return false;

View file

@ -21,17 +21,18 @@ public:
CollisionInfo() CollisionInfo()
: _damping(0.f), : _damping(0.f),
_elasticity(1.f), _elasticity(1.f),
_contactPoint(0.f),
_penetration(0.f), _penetration(0.f),
_addedVelocity(0.f) { _addedVelocity(0.f) {
} }
~CollisionInfo() {} ~CollisionInfo() {}
//glm::vec3 _point;
//glm::vec3 _normal; //glm::vec3 _normal;
float _damping; float _damping;
float _elasticity; float _elasticity;
glm::vec3 _penetration; // depth that bodyA is penetrates bodyB glm::vec3 _contactPoint; // world-frame point on bodyA that is deepest into bodyB
glm::vec3 _penetration; // depth that bodyA penetrates into bodyB
glm::vec3 _addedVelocity; glm::vec3 _addedVelocity;
}; };