Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions momentum/character/blend_shape_skinning.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,7 @@ void skinWithBlendShapes(
// first create a list of transformations from bindpose to final output pose
std::vector<Eigen::Matrix4<T>> transformations(state.jointState.size());
for (size_t i = 0; i < state.jointState.size(); i++) {
transformations[i] =
(state.jointState[i].transformation * inverseBindPose[i].cast<T>()).matrix();
transformations[i] = (state.jointState[i].transform * inverseBindPose[i].cast<T>()).toMatrix();
}

MT_CHECK(
Expand Down
23 changes: 12 additions & 11 deletions momentum/character/character.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ CharacterT<T>::CharacterT(
BlendShape_const_p blendShapes,
BlendShapeBase_const_p faceExpressionBlendShapes,
const std::string& nameIn,
const momentum::TransformationList& inverseBindPose_in,
const momentum::TransformList& inverseBindPose_in,
const SkinnedLocatorList& skinnedLocators)
: skeleton(s),
parameterTransform(pt),
Expand Down Expand Up @@ -262,7 +262,7 @@ CharacterT<T> CharacterT<T>::simplifySkeleton(const std::vector<bool>& activeJoi
}
// calculate the new offset of the joint in the new parent space
if (sIndex != kInvalidIndex) {
offset = referenceState.jointState[sIndex].transformation.inverse() *
offset = referenceState.jointState[sIndex].transform.inverse() *
referenceState.jointState[aIndex].translation();
} else {
offset = referenceState.jointState[aIndex].translation();
Expand Down Expand Up @@ -356,8 +356,9 @@ CharacterT<T> CharacterT<T>::simplifySkeleton(const std::vector<bool>& activeJoi
for (auto&& c : *result.collision) {
const auto oldParent = c.parent;
c.parent = result.jointMap[c.parent];
c.transformation = targetBindState.jointState[c.parent].transformation.inverse() *
sourceBindState.jointState[oldParent].transformation * c.transformation;
c.transformation =
(targetBindState.jointState[c.parent].transform.inverse() *
sourceBindState.jointState[oldParent].transform * c.transformation);
}
}

Expand Down Expand Up @@ -496,15 +497,15 @@ ParameterLimits CharacterT<T>::remapParameterLimits(
data.parent = targetParent;

const auto targetTransformationInverse =
targetBindState.jointState[targetParent].transformation.inverse();
const auto sourceTransformation = sourceBindState.jointState[sourceParent].transformation;
targetBindState.jointState[targetParent].transform.inverse();
const auto sourceTransformation = sourceBindState.jointState[sourceParent].transform;
data.offset = targetTransformationInverse * sourceTransformation * data.offset;

const auto sourceEllipsoidParent = data.ellipsoidParent;
data.ellipsoidParent = jointMap[data.ellipsoidParent];
const auto targetEllipsoidInverse =
targetBindState.jointState[data.ellipsoidParent].transformation.inverse();
const auto sourceEllipsoid = sourceBindState.jointState[sourceEllipsoidParent].transformation;
targetBindState.jointState[data.ellipsoidParent].transform.inverse();
const auto sourceEllipsoid = sourceBindState.jointState[sourceEllipsoidParent].transform;
data.ellipsoid = targetEllipsoidInverse * sourceEllipsoid * data.ellipsoid;
data.ellipsoidInv = data.ellipsoid.inverse();
}
Expand Down Expand Up @@ -597,8 +598,8 @@ LocatorList CharacterT<T>::remapLocators(
result.emplace_back(sourceLocator);
auto& loc = result.back();
loc.parent = jointMap[loc.parent];
loc.offset = targetBindState.jointState[loc.parent].transformation.inverse() *
sourceBindState.jointState[sourceLocator.parent].transformation * sourceLocator.offset;
loc.offset = targetBindState.jointState[loc.parent].transform.inverse() *
sourceBindState.jointState[sourceLocator.parent].transform * sourceLocator.offset;
}

return result;
Expand Down Expand Up @@ -634,7 +635,7 @@ void CharacterT<T>::initInverseBindPose() {
}
inverseBindPose.reserve(bindState.jointState.size());
for (const auto& t : bindState.jointState) {
inverseBindPose.push_back(t.transformation.inverse());
inverseBindPose.push_back(t.transform.inverse());
}
}

Expand Down
4 changes: 2 additions & 2 deletions momentum/character/character.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ struct CharacterT {
BlendShapeBase_const_p faceExpressionBlendShape;

/// Inverse of the bind pose transformations for each joint
TransformationList inverseBindPose;
TransformList inverseBindPose;

/// Maps from original joint indices to simplified joint indices
std::vector<size_t> jointMap;
Expand Down Expand Up @@ -104,7 +104,7 @@ struct CharacterT {
BlendShape_const_p blendShapes = {},
BlendShapeBase_const_p faceExpressionBlendShapes = {},
const std::string& nameIn = "",
const momentum::TransformationList& inverseBindPose = {},
const momentum::TransformList& inverseBindPose = {},
const SkinnedLocatorList& skinnedLocators = {});

/// Copy constructor
Expand Down
34 changes: 15 additions & 19 deletions momentum/character/character_utility.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,21 +71,19 @@ std::unique_ptr<CollisionGeometry> scale(

auto result = std::make_unique<CollisionGeometry>(*geom);
for (auto& capsule : (*result)) {
capsule.transformation.translation() *= scale;
capsule.transformation.translation *= scale;
capsule.radius *= scale;
capsule.length *= scale;
}

return result;
}

TransformationList scaleInverseBindPose(
const TransformationList& transformations,
const float scale) {
TransformationList result = transformations;
TransformList scaleInverseBindPose(const TransformList& transformations, const float scale) {
TransformList result = transformations;
MT_CHECK(scale > 0.0f);
for (auto& t : result) {
t.translation() *= scale;
t.translation *= scale;
}
return result;
}
Expand Down Expand Up @@ -326,16 +324,16 @@ Character scaleCharacter(const Character& character, float s) {

namespace {

Skeleton transformSkeleton(const Skeleton& skeleton, const Eigen::Affine3f& xform) {
const Eigen::Vector3f singularValues = xform.linear().jacobiSvd().singularValues();
Skeleton transformSkeleton(const Skeleton& skeleton, const Transform& xform) {
const Eigen::Vector3f singularValues = xform.toLinear().jacobiSvd().singularValues();
for (Eigen::Index i = 0; i < 3; ++i) {
MT_CHECK(
singularValues(i) > 0.99 && singularValues(i) < 1.01,
"Transform should not include scale or shear.");
}

const Eigen::Quaternionf rotation(xform.linear());
const Eigen::Vector3f translation(xform.translation());
const Eigen::Quaternionf rotation(xform.toLinear());
const Eigen::Vector3f translation(xform.translation);

Skeleton result(skeleton);
MT_CHECK(!result.joints.empty());
Expand Down Expand Up @@ -389,7 +387,7 @@ BlendShape_const_p transformBlendShape(
return blendShapeTransformed;
}

std::unique_ptr<Mesh> transformMesh(const std::unique_ptr<Mesh>& mesh, const Eigen::Affine3f& xf) {
std::unique_ptr<Mesh> transformMesh(const std::unique_ptr<Mesh>& mesh, const Transform& xf) {
if (!mesh) {
return {};
}
Expand All @@ -400,18 +398,16 @@ std::unique_ptr<Mesh> transformMesh(const std::unique_ptr<Mesh>& mesh, const Eig
}

for (auto& v : result->normals) {
v = xf.linear() * v;
v = xf.toLinear() * v;
}

return result;
}

TransformationList transformInverseBindPose(
const TransformationList& inverseBindPose,
const Eigen::Affine3f& xf) {
TransformationList result;
TransformList transformInverseBindPose(const TransformList& inverseBindPose, const Transform& xf) {
TransformList result;
result.reserve(inverseBindPose.size());
const Eigen::Affine3f xfInv = xf.inverse();
const Transform xfInv = xf.inverse();
for (const auto& m : inverseBindPose) {
result.push_back(m * xfInv);
}
Expand All @@ -420,7 +416,7 @@ TransformationList transformInverseBindPose(

} // namespace

Character transformCharacter(const Character& character, const Affine3f& xform) {
Character transformCharacter(const Character& character, const Transform& xform) {
return {
transformSkeleton(character.skeleton, xform),
character.parameterTransform,
Expand All @@ -430,7 +426,7 @@ Character transformCharacter(const Character& character, const Affine3f& xform)
character.skinWeights.get(),
character.collision.get(),
character.poseShapes.get(),
transformBlendShape(character.blendShape, xform),
transformBlendShape(character.blendShape, xform.toAffine3()),
character.faceExpressionBlendShape,
character.name,
transformInverseBindPose(character.inverseBindPose, xform)};
Expand Down
2 changes: 1 addition & 1 deletion momentum/character/character_utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ namespace momentum {
/// @param[in] character Character to be transformed
/// @param[in] xform Transformation to apply
/// @return A new Character object that has been transformed
[[nodiscard]] Character transformCharacter(const Character& character, const Affine3f& xform);
[[nodiscard]] Character transformCharacter(const Character& character, const Transform& xform);

/// Replaces the part of target_character's skeleton rooted at target_root with the part of
/// source_character's skeleton rooted at source_root.
Expand Down
5 changes: 3 additions & 2 deletions momentum/character/collision_geometry.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <momentum/character/types.h>
#include <momentum/common/memory.h>
#include <momentum/math/constants.h>
#include <momentum/math/transform.h>
#include <momentum/math/utility.h>

namespace momentum {
Expand All @@ -24,7 +25,7 @@ struct TaperedCapsuleT {

/// Transformation defining the orientation and starting point relative to the parent coordinate
/// system.
Affine3<S> transformation;
TransformT<S> transformation;

/// Radii at the two endpoints of the capsule.
Vector2<S> radius;
Expand All @@ -36,7 +37,7 @@ struct TaperedCapsuleT {
S length;

TaperedCapsuleT()
: transformation(Affine3<S>::Identity()),
: transformation(TransformT<S>()),
radius(Vector2<S>::Zero()),
parent(kInvalidIndex),
length(S(0)) {
Expand Down
8 changes: 4 additions & 4 deletions momentum/character/collision_geometry_state.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ void CollisionGeometryStateT<T>::update(
for (size_t i = 0; i < numElements; ++i) {
const auto& tc = collisionGeometry[i];
const auto& js = skeletonState.jointState[tc.parent];
const Affine3<T> transform = js.transformation * tc.transformation.cast<T>();
origin[i] = transform.translation();
direction[i].noalias() = transform.linear().col(0) * tc.length;
radius[i].noalias() = tc.radius.cast<T>() * js.scale();
const TransformT<T> transform = js.transform * tc.transformation.cast<T>();
origin[i] = transform.translation;
direction[i].noalias() = transform.getAxisX() * transform.scale * tc.length;
radius[i].noalias() = tc.radius.cast<T>() * js.transform.scale;
delta[i] = radius[i][1] - radius[i][0];
}
}
Expand Down
8 changes: 1 addition & 7 deletions momentum/character/joint_state.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ void JointStateT<T>::set(
// calculate state based on parameters and parent transform
if (computeDeriv) {
if (parentState != nullptr) {
translationAxis = parentState->transformation.linear();
translationAxis = parentState->transform.toLinear();
} else {
translationAxis.setIdentity();
}
Expand All @@ -65,9 +65,6 @@ void JointStateT<T>::set(

// set global transformation
transform = parent * localTransform;

// TODO: Remove
transformation = transform.toAffine3();
}

template <typename T>
Expand All @@ -90,9 +87,6 @@ Vector3<T> JointStateT<T>::getScaleDerivative(const Vector3<T>& ref) const noexc
template <typename T>
template <typename T2>
void JointStateT<T>::set(const JointStateT<T2>& rhs) {
// TODO: Remove
transformation = rhs.transformation.template cast<T>();

localTransform = rhs.localTransform.template cast<T>();
transform = rhs.transform.template cast<T>();

Expand Down
5 changes: 0 additions & 5 deletions momentum/character/joint_state.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,6 @@ namespace momentum {
/// Each joint has 7 parameters: 3 translation, 3 rotation, and 1 scale.
template <typename T>
struct JointStateT {
using Affine3 = Eigen::Transform<T, 3, Eigen::Affine>;

/// Complete transformation matrix from local to global space (legacy, to be removed)
Affine3 transformation; // TODO: Remove

/// Local transformation relative to parent joint
///
/// Defined by the joint parameters (translation, rotation, scale)
Expand Down
Loading
Loading