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;