From 8ef657e5b2066ca9544f39b4c2f228a740718cb5 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 28 Feb 2014 17:05:08 -0800 Subject: [PATCH] Render avatar collision shapes in the right spot --- interface/src/renderer/Model.cpp | 11 ++++++++--- interface/src/renderer/Model.h | 8 ++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/interface/src/renderer/Model.cpp b/interface/src/renderer/Model.cpp index 47a6013b5f..48cfde8be6 100644 --- a/interface/src/renderer/Model.cpp +++ b/interface/src/renderer/Model.cpp @@ -137,9 +137,10 @@ void Model::createCollisionShapes() { const FBXGeometry& geometry = _geometry->getFBXGeometry(); float uniformScale = extractUniformScale(_scale); for (int i = 0; i < _jointStates.size(); i++) { - glm::vec3 position = extractTranslation(_jointStates[i].transform); const FBXJoint& joint = geometry.joints[i]; - // for now make everything a sphere at joint end + glm::vec3 meshCenter = _jointStates[i].combinedRotation * joint.averageVertex; + glm::vec3 position = _rotation * (extractTranslation(_jointStates[i].transform) + uniformScale * meshCenter) + _translation; + float radius = uniformScale * joint.boneRadius; SphereShape* shape = new SphereShape(radius, position); _shapes.push_back(shape); @@ -147,10 +148,14 @@ void Model::createCollisionShapes() { } void Model::updateShapePositions() { + float uniformScale = extractUniformScale(_scale); + const FBXGeometry& geometry = _geometry->getFBXGeometry(); if (_shapesAreDirty && _shapes.size() == _jointStates.size()) { for (int i = 0; i < _jointStates.size(); i++) { + const FBXJoint& joint = geometry.joints[i]; // shape positions are stored in world-frame - _shapes[i]->setPosition(_rotation * extractTranslation(_jointStates[i].transform) + _translation); + glm::vec3 meshCenter = _jointStates[i].combinedRotation * joint.averageVertex; + _shapes[i]->setPosition(_rotation * (extractTranslation(_jointStates[i].transform) + uniformScale * meshCenter) + _translation); _shapes[i]->setRotation(_jointStates[i].combinedRotation); } _shapesAreDirty = false; diff --git a/interface/src/renderer/Model.h b/interface/src/renderer/Model.h index eff2bb0594..12691dbf03 100644 --- a/interface/src/renderer/Model.h +++ b/interface/src/renderer/Model.h @@ -182,10 +182,10 @@ protected: class JointState { public: - glm::vec3 translation; - glm::quat rotation; - glm::mat4 transform; - glm::quat combinedRotation; + glm::vec3 translation; // translation relative to parent + glm::quat rotation; // rotation relative to parent + glm::mat4 transform; // rotation to world frame + translation in model frame + glm::quat combinedRotation; // rotation to world frame }; bool _shapesAreDirty;