PrusaSlicer-NonPlainar/src/igl/deform_skeleton.cpp
2018-10-26 15:45:52 +02:00

59 lines
1.5 KiB
C++

// This file is part of libigl, a simple c++ geometry processing library.
//
// Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla Public License
// v. 2.0. If a copy of the MPL was not distributed with this file, You can
// obtain one at http://mozilla.org/MPL/2.0/.
#include "deform_skeleton.h"
void igl::deform_skeleton(
const Eigen::MatrixXd & C,
const Eigen::MatrixXi & BE,
const std::vector<
Eigen::Affine3d,Eigen::aligned_allocator<Eigen::Affine3d> > & vA,
Eigen::MatrixXd & CT,
Eigen::MatrixXi & BET)
{
using namespace Eigen;
assert(BE.rows() == (int)vA.size());
CT.resize(2*BE.rows(),C.cols());
BET.resize(BE.rows(),2);
for(int e = 0;e<BE.rows();e++)
{
BET(e,0) = 2*e;
BET(e,1) = 2*e+1;
Affine3d a = vA[e];
Vector3d c0 = C.row(BE(e,0));
Vector3d c1 = C.row(BE(e,1));
CT.row(2*e) = a * c0;
CT.row(2*e+1) = a * c1;
}
}
IGL_INLINE void igl::deform_skeleton(
const Eigen::MatrixXd & C,
const Eigen::MatrixXi & BE,
const Eigen::MatrixXd & T,
Eigen::MatrixXd & CT,
Eigen::MatrixXi & BET)
{
using namespace Eigen;
//assert(BE.rows() == (int)vA.size());
CT.resize(2*BE.rows(),C.cols());
BET.resize(BE.rows(),2);
for(int e = 0;e<BE.rows();e++)
{
BET(e,0) = 2*e;
BET(e,1) = 2*e+1;
Matrix4d t;
t << T.block(e*4,0,4,3).transpose(), 0,0,0,0;
Affine3d a;
a.matrix() = t;
Vector3d c0 = C.row(BE(e,0));
Vector3d c1 = C.row(BE(e,1));
CT.row(2*e) = a * c0;
CT.row(2*e+1) = a * c1;
}
}