An automated algorithm to extract the linear blend skinning (LBS) from a set of example poses

Overview

Dem Bones

BSD3 Clause Version

This repository contains an implementation of Smooth Skinning Decomposition with Rigid Bones, an automated algorithm to extract the Linear Blend Skinning (LBS) with bone transformations from a set of example meshes. Skinning Decomposition can be used in various tasks:

  • converting any animated mesh sequence, e.g. geometry cache, to LBS, which can be replayed in popular game engines,
  • solving skinning weights from shapes and skeleton poses, e.g. converting blendshapes to LBS,
  • solving bone transformations for a mesh animation given skinning weights.

This project is named after "The Skeleton Dance" by Super Simple Songs.

Contents

  • include/DemBones: C++ header-only core library using Eigen and OpenMP. Check out the documentations in docs/index.html.
  • bin: pre-compiled command line tools for Windows, Linux, and MacOS that read and write FBX and Alembic files. Check out the usage by running DemBones --help.
  • src/command: source code for the command line tool. Check out AbcReader.cpp, FbxReader.cpp, and FbxWriter.cpp for the usage of the core library.
  • data: input/output test data for the command line tool. Run and check out the scripts run.bat (Windows) or ./run.sh (Linux/MacOS).

Compiling

Tested platforms:

  • Visual Studio 2019 on Windows 10 x64
  • g++ 9.3.0 on Ubuntu Linux 20.14
  • LLVM 10.0.0 (Homebrew) on MacOS 10.13.6

Compiling steps:

  1. Install cmake
  2. Copy the following libraries to their respective folders in ExtLibs so that cmake can find these paths:
  3. Run cmake:
mkdir build
cd build
cmake ..
  1. Build: $ cmake --build . --config Release --target install

Notes for Linux

Notes for MacOS

  • Apple Clang (default compiler) does not support OpenMP and Eigen. We recommend using LLVM. Assuming LLVM is installed in the default path: /usr/local/opt/llvm/bin, instead of cmake .., you can run:

    $ cmake -DCMAKE_C_COMPILER=/usr/local/opt/llvm/bin/clang -DCMAKE_CXX_COMPILER=/usr/local/opt/llvm/bin/clang++ ..
    
  • The pre-compiled tool bin/DemBones requires dynamic libomp for LLVM. If you have an error messeage related to OpenMP, please install libomp, e.g. with Homebrew using $ brew install libomp.

  • bin/MacOS/DemBones was compiled with the optimization flag -O3. It looks like LLVM uses fast math so the results are slightly different with those generated by Windows version. Removing optimization flags (in CMakeLists.txt) helps to reproduce the same results with Windows version but the tool will run 10x slower.

References

If you use the library or the command line tool, please cite the paper:

Binh Huy Le and Zhigang Deng. Smooth Skinning Decomposition with Rigid Bones. ACM Transactions on Graphics 31(6), Proceedings of ACM SIGGRAPH Asia 2012.

BibTeX:

@article{LeDeng2012,
    author = {Le, Binh Huy and Deng, Zhigang},
    title = {Smooth Skinning Decomposition with Rigid Bones},
    journal = {ACM Trans. Graph.},
    volume = {31},
    number = {6},
    year = {2012}
} 

The skinning weights smoothing regularization was published in the paper:

Binh Huy Le and Zhigang Deng. Robust and Accurate Skeletal Rigging from Mesh Sequences. ACM Transactions on Graphics 33(4), Proceedings of ACM SIGGRAPH 2014.

Authors


Search for Extraordinary Experiences Division (SEED) - Electronic Arts
http://seed.ea.com

We are a cross-disciplinary team within EA Worldwide Studios.
Our mission is to explore, build and help define the future of interactive entertainment.

Dem Bones was created by Binh Le ([email protected]). The logo was designed by Phuong Le.

Contributing

Before you can contribute, EA must have a Contributor License Agreement (CLA) on file that has been signed by each contributor. You can sign here: http://bit.ly/electronic-arts-cla

Licenses

  • The source code, including include/DemBones and src/command, uses BSD 3-Clause License as detailed in LICENSE.md
  • The pre-compiled command line tool bin/DemBones(.exe) uses third party libraries: Eigen, tclap, Alembic, FBXSDK, and zlib with licenses in 3RDPARTYLICENSES.md
Comments
  • Question about transAffine and transAffineNorm regularizers

    Question about transAffine and transAffineNorm regularizers

    Hi, I am really confused about the transAffine and transAffineNorm regularizers. I read the original SSDR paper and some following papers like the Robust SSDR in 2014, but can't find the reference for transAffineNorm regularizers.

    Would you please tell the reference about the transAffine and transAffineNorm regularizers? Thanks a lot!

    opened by pramanc 4
  • Infinite loop when initializing bones

    Infinite loop when initializing bones

    Occasionally I run in to cases where DemBones gets stuck in an infinite loop while trying to initialize the bones in DemBones.h init(). I've attached a sample fbx and abc that causes the issue.

    faceshapes.zip

    Any insight as to why?

    ../bin/DemBones.exe -i="neutral.fbx" -a="face_rom.abc" -b=64 -o="Decomposition_64.fbx"
    1 animated mesh sequence(s):
        "face_rom.abc" + "neutral.fbx" --> "Decomposition_64.fbx"
    Parameters:
        nBones (target)    = 64
        nInitIters         = 10 (default)
        nIters             = 30 (default)
        nTransIters        = 5 (default)
        nWeightsIters      = 3 (default)
        bindUpdate         = 0 (no update) (default)
        transAffine        = 10 (default)
        transAffineNorm    = 4 (default)
        nnz                = 8 (default)
        weightsSmooth      = 0.0001 (default)
        weightsSmoothStep  = 1 (default)
    Checking ABCs:
        "face_rom.abc": /Louise_asym/Louise_asymShape (57 frames)
    Reading ABCs......................................................... Done!
    Reading FBXs:
        "neutral.fbx"... Done!
        5034 vertices
    Initializing bones: 1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>1>
    
    opened by chadmv 4
  • Can dem-bones work directly on a PLY or OBJ sequence?

    Can dem-bones work directly on a PLY or OBJ sequence?

    Is it possible for Dem-Bones to directly convert a sequence of PLY or OBJ files into a single animated and skinned FBX, instead of using an animated Alembic files?

    opened by aapatre 2
  • Question about rigid transformation from covariance matrix

    Question about rigid transformation from covariance matrix

    Hi, Thanks for your code! Really nice work! I have one question about Best Rigid Transformation from covariance matrix. From the paper here https://igl.ethz.ch/projects/ARAP/svd_rot.pdf or the SSDR paper

    in the function qpT2m:

    Eigen::JacobiSVD svd(...) d(2, 2) = (svd.matrixU()*svd.matrixV.transpose()).determinant(); m.rotMat(k, j) = svd.matrixU()dsvd.matrixV().transpose();

    should be ?

    d(2, 2) = (svd.matrixV()*svd.matrixU.transpose()).determinant(); m.rotMat(k, j) = svd.matrixV()dsvd.matrixU().transpose();

    =================================== but definitly from the result, your implementation is right. I'm really confused!

    Thanks!

    opened by pramanc 2
  • how to compile in debug mode

    how to compile in debug mode

    I compile in debug mode in VS2019, Win10. all configures are in debug mode when configure cmake-gui. FBXSDK is debug version lib.

    but it seems Alembic from Alembic (from Maya 2020 Update 2 DevKit) only contains release libs. How to get Debug version Alembic? Should I compile Alembic from https://github.com/alembic/alembic? Then how to organize the catalogue? Which version of Alembic (from Maya 2020 Update 2 DevKit) is?

    The compile error is: 1>Alembic.lib(DataTypeRegistry.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MDd_DynamicDebug' in AbcReader.obj 1>Alembic.lib(SprImpl.cpp.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in AbcReader.obj 1>Alembic.lib(SprImpl.cpp.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MDd_DynamicDebug' in AbcReader.obj 1>Alembic.lib(AprImpl.cpp.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in AbcReader.obj 1>Alembic.lib(AprImpl.cpp.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MDd_DynamicDebug' in AbcReader.obj 1>Alembic.lib(ScalarPropertyWriter.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in AbcReader.obj 1>Alembic.lib(ScalarPropertyWriter.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MDd_DynamicDebug' in AbcReader.obj 1>Alembic.lib(ArrayPropertyWriter.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in AbcReader.obj 1>Alembic.lib(ArrayPropertyWriter.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MDd_DynamicDebug' in AbcReader.obj 1>Alembic.lib(ArrayPropertyReader.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in AbcReader.obj 1>Alembic.lib(ArrayPropertyReader.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MDd_DynamicDebug' in AbcReader.obj 1>Alembic.lib(ScalarSample.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in AbcReader.obj 1>Alembic.lib(ScalarSample.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MDd_DynamicDebug' in AbcReader.obj 1>AlembicHalf.lib(half.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in AbcReader.obj 1>AlembicHalf.lib(half.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MDd_DynamicDebug' in AbcReader.obj 1>AlembicIex.lib(IexBaseExc.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in AbcReader.obj 1>AlembicIex.lib(IexBaseExc.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MDd_DynamicDebug' in AbcReader.obj 1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library 1>D:\Projects\dem-bones\build_debug\Debug\DemBones.exe : fatal error LNK1319: 184 mismatches detected 1>Done building project "DemBonesCmd.vcxproj" -- FAILED. ========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========

    opened by tang1485 2
  • Question about lockW/lockM

    Question about lockW/lockM

    There are finished skin meshes and animations, and then I added some blend shapes. I added some new bones at the origin without animation, and set lockM to 0 for those new bones. (The original bone is set to 1) Set the lockW value of the deformation vertex to 0. (set Others to 1) Set matrix w and matrix m with original data,set w value of new bones to 0, and m value of new bones to Matrix4::Identity(). I want these bones to replace blend shapes,but it did not work. The result of the compute is that these bones are still at the origin, and there are no vertices with their weights. I don't know how to work properly

    opened by Space-Invader-GS 1
  • Could it be possible to transform joint scale?

    Could it be possible to transform joint scale?

    Hi and thanks a lot for this, it works very well !

    I was wondering if it could be possible to allow joint scale to better match the deformed geometry. I think, in some cases where scale is supported, it could help reduce the number of bone needed.

    Thanks again!

    opened by JonasOuellet 1
  • The translation data of bones are always the same! But it changes when view in Maya!

    The translation data of bones are always the same! But it changes when view in Maya!

    Hi, I recently used SSDR created a skeleton animation and write the animation into an .fbx file. Then I tried to use fbxsdk to extract the translation and rotation data of each bone from the animation.

    However, I found that the extracted translation or rotation(both Global or Local ) data are always the same as the initial value, but when I import the fbx file into Maya, the animation looks fine, and the local translation and rotation value of each bone varies over time. The data extraction code are shown below:

    One thing wierd is that I found the number of AnimStack in the .fbx which created by SSDR are always 2. I'm not sure whether this factor leads to my problem.

    bool readFbx(string file_path)
    {
    	FbxManager* Sdkmanager = NULL;
    	fbxsdk::FbxScene* Scene = NULL;
    	bool Result;
    	//prepare the FBX SDK
    	InitializeSdkObjects(Sdkmanager, Scene);
    	FbxString file(file_path.c_str());
    	Result = LoadScene(Sdkmanager, Scene, file.Buffer());
    	vector<FbxString>boneName;
    	vector<fbxsdk::FbxNode*>bone_Node;
    	if (Result == false)
    	{
    		FBXSDK_printf("\n\nAn error occurred while loading the scene...");
    		return Result;
    	}
            else
    	{
    		// get the name of each bones of the skeleton
    		fbxsdk::FbxNode* root = Scene->GetRootNode();
    		for (int i = 0; i < root->GetChildCount(); ++i)
    		{
    			fbxsdk::FbxNode* pNode = root->GetChild(i);
    			fbxsdk::FbxNodeAttribute::EType lAttributeType;
    			if (pNode->GetNodeAttribute() == NULL)
    			{
    				FBXSDK_printf("NULL Node Attribute\n\n");
    			}
    			else
    			{
    				lAttributeType = (pNode->GetNodeAttribute()->GetAttributeType());
    				switch (lAttributeType)
    				{
    				case fbxsdk::FbxNodeAttribute::eSkeleton:
    					GetSkeletonInformation(boneName, bone_Node, pNode);//遍历节点找到mesh节点
    					break;
    				case FbxNodeAttribute::eCamera:
    					break;
    				default:
    					break;
    				}
    			}
    		}
                    // read the global translation data over time
    		const int AnimStackCount = Scene->GetSrcObjectCount<fbxsdk::FbxAnimStack>();
    		for (int i = 0; i < AnimStackCount; ++i)
    		{
    			fbxsdk::FbxAnimStack* pstack = Scene->GetSrcObject<fbxsdk::FbxAnimStack>(i);
    			const char* stackname = pstack->GetName();
    			cout << "Stack: " << stackname << endl;
    
    			const int nLayerCount = pstack->GetMemberCount();
    			for (int j = 0; j < nLayerCount; ++j)
    			{
    				fbxsdk::FbxAnimLayer* pLayer = pstack->GetMember<fbxsdk::FbxAnimLayer>(j);
    				const char* layername = pLayer->GetName();
    				cout << "Layer: " << layername << endl;
    				fbxsdk::FbxAnimCurve* lCurveRX = bone_Node[0]->LclRotation.GetCurve(pLayer, FBXSDK_CURVENODE_COMPONENT_X, false);
    				if (lCurveRX == NULL)
    				{
    					continue;
    				}
    				int pRXCount = lCurveRX->KeyGetCount();
    				for (int s = 0; s < pRXCount; ++s)
    				{
    					FbxTime ktime = lCurveRX->KeyGetTime(s);
    					vector<float> bone_position;
    					for (int bone = 0; bone < bone_Node.size(); ++bone)
    					{
    						FbxAMatrix GLOBAL = bone_Node[bone]->EvaluateLocalTransform(ktime);
    						FbxVector4 T = GLOBAL.GetT();
    						
    						fbxsdk::FbxString tmpName("LiYuanQian_rig_v001:Root_M");
    						if (boneName[bone] == tmpName)
    						{
    							cout << tmpName.Buffer() << "frame: " << s << " trans:" << T[0] << "," << T[1] << "," << T[2] << "." << " ktime"  << endl;;
    						}
    						
    						for (int k = 0; k < 3; ++k)
    						{
    							bone_position.push_back(T[k]);
    							
    						}
    					}
    				}
    
    			}
    		}
    		return Result;
    	}
    }
    
    opened by ANYMS-A 1
  • Consultation about bone joints constraints

    Consultation about bone joints constraints

    Thanks sincerely for sharing your code on Github, But I still have a few confusion. I don't see any code implementing bone joints constraints. I don't know if I missed something or you have not updated it yet.

    opened by OvidZheng 1
  • Template error message in VS2019

    Template error message in VS2019

    Hello,

    I am getting the following error messages when I compile demBones in VS2019:

    Error: Dem::DemBones: use of class templates requires template argument list

    Error C2352 'Dem::DemBones<_Scalar,_AniMeshScalar>::clear': illegal call of non-static member function cmt C:\Users\max\source\repos\cmt\src\DemBones\DemBonesExt.h 108

    The line error is in bold text.

    DemBonesExt.h ... /** @brief Clear all data */ void clear() { fTime.resize(0); boneName.resize(0); parent.resize(0); bind.resize(0, 0); preMulInv.resize(0, 0); rotOrder.resize(0, 0); DemBones::clear(); }

    Any idea? Thx, Max

    opened by mmallmann 1
  • Returning reference to temporary(results in seg fault or undefined behavior)

    Returning reference to temporary(results in seg fault or undefined behavior)

    gcc 7.4.0 reports an warning to this line

    https://github.com/electronicarts/dem-bones/blob/2ab9b0447ad4b8bf4a141b9c65af717e7e2c2e0f/include/DemBones/DemBones.h#L297

    Returning reference to temporary triggers segmentation fault or undefined behavior. Work around is creating an variable.

            VectorX x0 = w.col(i).toDense().cwiseMax(0.0);
            x=indexing_vector(x0, idx.head(nnzi));
    

    Although it is better to fix not returning temp address in Indexing.h

    /home/syoyo/work/dem-bones/include/DemBones/Indexing.h: In instantiation of ‘const typename ArgType::Scalar& Dem::indexing_functor_vector<ArgType, IndexType>::operator()(Eigen::Index) const [with ArgType = Eigen::CwiseBinaryOp<Eigen::internal::scalar_max_op<double, double>, const Eigen::Matrix<double, -1, 1>, const Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1> > >; IndexType = Eigen::VectorBlock<Eigen::Array<int, -1, 1>, -1>; typename ArgType::Scalar = double; Eigen::Index = long int]’:
    /home/syoyo/work/dem-bones/ExtLibs/Eigen/Eigen/src/Core/CoreEvaluators.h:430:110:   required from ‘Scalar Eigen::internal::nullary_wrapper<Scalar, NullaryOp, false, true, false>::operator()(const NullaryOp&, IndexType) const [with IndexType = long int; Scalar = double; NullaryOp = Dem::indexing_functor_vector<Eigen::CwiseBinaryOp<Eigen::internal::scalar_max_op<double, double>, const Eigen::Matrix<double, -1, 1>, const Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1> > >, Eigen::VectorBlock<Eigen::Array<int, -1, 1>, -1> >]’
    /home/syoyo/work/dem-bones/ExtLibs/Eigen/Eigen/src/Core/CoreEvaluators.h:533:37:   required from ‘Eigen::internal::evaluator<Eigen::CwiseNullaryOp<NullaryOp, PlainObjectType> >::CoeffReturnType Eigen::internal::evaluator<Eigen::CwiseNullaryOp<NullaryOp, PlainObjectType> >::coeff(IndexType) const [with IndexType = long int; NullaryOp = Dem::indexing_functor_vector<Eigen::CwiseBinaryOp<Eigen::internal::scalar_max_op<double, double>, const Eigen::Matrix<double, -1, 1>, const Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1> > >, Eigen::VectorBlock<Eigen::Array<int, -1, 1>, -1> >; PlainObjectType = Eigen::Matrix<double, -1, 1>; Eigen::internal::evaluator<Eigen::CwiseNullaryOp<NullaryOp, PlainObjectType> >::CoeffReturnType = double]’
    /home/syoyo/work/dem-bones/ExtLibs/Eigen/Eigen/src/Core/AssignEvaluator.h:642:5:   required from ‘void Eigen::internal::generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor, Version>::assignCoeff(Eigen::Index) [with DstEvaluatorTypeT = Eigen::internal::evaluator<Eigen::Matrix<double, -1, 1> >; SrcEvaluatorTypeT = Eigen::internal::evaluator<Eigen::CwiseNullaryOp<Dem::indexing_functor_vector<Eigen::CwiseBinaryOp<Eigen::internal::scalar_max_op<double, double>, const Eigen::Matrix<double, -1, 1>, const Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1> > >, Eigen::VectorBlock<Eigen::Array<int, -1, 1>, -1> >, Eigen::Matrix<double, -1, 1> > >; Functor = Eigen::internal::assign_op<double, double>; int Version = 0; Eigen::Index = long int]’
    /home/syoyo/work/dem-bones/ExtLibs/Eigen/Eigen/src/Core/AssignEvaluator.h:501:7:   required from ‘static void Eigen::internal::dense_assignment_loop<Kernel, 1, 0>::run(Kernel&) [with Kernel = Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<double, -1, 1> >, Eigen::internal::evaluator<Eigen::CwiseNullaryOp<Dem::indexing_functor_vector<Eigen::CwiseBinaryOp<Eigen::internal::scalar_max_op<double, double>, const Eigen::Matrix<double, -1, 1>, const Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1> > >, Eigen::VectorBlock<Eigen::Array<int, -1, 1>, -1> >, Eigen::Matrix<double, -1, 1> > >, Eigen::internal::assign_op<double, double>, 0>]’
    /home/syoyo/work/dem-bones/ExtLibs/Eigen/Eigen/src/Core/AssignEvaluator.h:767:37:   required from ‘void Eigen::internal::call_dense_assignment_loop(DstXprType&, const SrcXprType&, const Functor&) [with DstXprType = Eigen::Matrix<double, -1, 1>; SrcXprType = Eigen::CwiseNullaryOp<Dem::indexing_functor_vector<Eigen::CwiseBinaryOp<Eigen::internal::scalar_max_op<double, double>, const Eigen::Matrix<double, -1, 1>, const Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1> > >, Eigen::VectorBlock<Eigen::Array<int, -1, 1>, -1> >, Eigen::Matrix<double, -1, 1> >; Functor = Eigen::internal::assign_op<double, double>]’
    /home/syoyo/work/dem-bones/ExtLibs/Eigen/Eigen/src/Core/AssignEvaluator.h:926:31:   [ skipping 3 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
    /home/syoyo/work/dem-bones/ExtLibs/Eigen/Eigen/src/Core/AssignEvaluator.h:808:18:   required from ‘void Eigen::internal::call_assignment(Dst&, const Src&) [with Dst = Eigen::Matrix<double, -1, 1>; Src = Eigen::CwiseNullaryOp<Dem::indexing_functor_vector<Eigen::CwiseBinaryOp<Eigen::internal::scalar_max_op<double, double>, const Eigen::Matrix<double, -1, 1>, const Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1> > >, Eigen::VectorBlock<Eigen::Array<int, -1, 1>, -1> >, Eigen::Matrix<double, -1, 1> >]’
    /home/syoyo/work/dem-bones/ExtLibs/Eigen/Eigen/src/Core/PlainObjectBase.h:779:32:   required from ‘Derived& Eigen::PlainObjectBase<Derived>::_set(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::CwiseNullaryOp<Dem::indexing_functor_vector<Eigen::CwiseBinaryOp<Eigen::internal::scalar_max_op<double, double>, const Eigen::Matrix<double, -1, 1>, const Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1> > >, Eigen::VectorBlock<Eigen::Array<int, -1, 1>, -1> >, Eigen::Matrix<double, -1, 1> >; Derived = Eigen::Matrix<double, -1, 1>]’
    /home/syoyo/work/dem-bones/ExtLibs/Eigen/Eigen/src/Core/Matrix.h:225:24:   required from ‘Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::operator=(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::CwiseNullaryOp<Dem::indexing_functor_vector<Eigen::CwiseBinaryOp<Eigen::internal::scalar_max_op<double, double>, const Eigen::Matrix<double, -1, 1>, const Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1> > >, Eigen::VectorBlock<Eigen::Array<int, -1, 1>, -1> >, Eigen::Matrix<double, -1, 1> >; _Scalar = double; int _Rows = -1; int _Cols = 1; int _Options = 0; int _MaxRows = -1; int _MaxCols = 1]’
    /home/syoyo/work/dem-bones/include/DemBones/DemBones.h:303:6:   required from ‘void Dem::DemBones<_Scalar, _AniMeshScalar>::computeWeights() [with _Scalar = double; _AniMeshScalar = float]’
    /home/syoyo/work/dem-bones/include/DemBones/DemBones.h:344:18:   required from ‘void Dem::DemBones<_Scalar, _AniMeshScalar>::compute() [with _Scalar = double; _AniMeshScalar = float]’
    /home/syoyo/work/dem-bones/src/command/mainCmd.cpp:171:16:   required from here
    /home/syoyo/work/dem-bones/include/DemBones/Indexing.h:106:30: warning: returning reference to temporary [-Wreturn-local-addr]
       return m_arg(m_indices[idx]);
    
    opened by syoyo 1
  • 20 bones are generated in the setting, but 1 bone is actually generated

    20 bones are generated in the setting, but 1 bone is actually generated

    企业微信截图_16717911703795

    Initializing bones: 1>1 Only 1 bone was generated in .fbx file Is there anything not set? How to generate 20 bones normally。 Looking forward to your reply

    opened by Wyhzxc 0
  • Patience & Tolerance values hard-coded to 3 and 1e-3 respectively

    Patience & Tolerance values hard-coded to 3 and 1e-3 respectively

    In class MyDemBones of mainCmd.cpp, the member variables tolerance and patience are initialized to (1e-3) and (3).

    However, these values are never updated to those passed in via the command line.

    It looks like the following lines must be added to the main function to ensure that the user-provided arguments are being respected:

    model.tolerance = dbOptions.tolerance;
    model.patience = dbOptions.patience;
    
    opened by RajatG-SideFX 0
  • Can it decompose multi sequences with the same initial pose in the meantime?

    Can it decompose multi sequences with the same initial pose in the meantime?

    I have some .abc files and the init pose .fbx.

    Do I need to concatenate all the motion sequences into one .abc file? or I can use some scripts to decompose multi sequences in the meantime?

    opened by kunkun0w0 0
  • Weird Composition Result

    Weird Composition Result

    image

    The script I used: call "../bin/Windows/DemBones.exe" -i="dress.fbx" -a="dress_shape00_01_01.abc" -b=40 -o="dress_40.fbx" -n=100 --nWeightsIters=3 -z=8

    The decomposition result looks terrible. Can you give some suggestions?

    image

    opened by kunkun0w0 0
  • Animation of the skeleton fitted to mesh animation with only rotation change in each keyframe

    Animation of the skeleton fitted to mesh animation with only rotation change in each keyframe

    Hi, First, I want to say that I'm very impressed with DemBones solution and its possibilities. I'm wondering if it is possible to obtain the output animation of the RIG with changed only the rotation in the joints (translation would be only applied to the root). From the documentation of the parameters, it is not obvious to me how to achieve this. There is a demLockparameter, but it seems to lock the whole transformation of the joint in the animation.

    opened by ArcaneShadow82 8
  • The dem bones llvm library  executable not working on M1 Macbooks

    The dem bones llvm library executable not working on M1 Macbooks

    The issue is as :

    [email protected] MacOS % ./dembones -a=a.abc -i=a.fbx -o=out.fbx -b=16 dyld: Library not loaded: /usr/local/opt/llvm/lib/libomp.dylib Referenced from: /Users/mac/Desktop/dem-bones-1.2.0/bin/MacOS/./dembones Reason: no suitable image found. Did find: /usr/local/opt/llvm/lib/libomp.dylib: mach-o, but wrong architecture /usr/local/opt/llvm/lib/libomp.dylib: mach-o, but wrong architecture zsh: abort ./dembones -a=a.abc -i=a.fbx -o=out.fbx -b=16

    opened by Tekh-ops 2
Releases(v1.2.1)
  • v1.2.1(Jun 17, 2021)

  • v1.2.0(Jul 21, 2020)

    • Add stop on convergence to cbIterEnd(), cbWeightsIterEnd(), cbTransformationsIterEnd()
    • Add --bindUpdate=2 flag in the command line tool to group joints
    • Add --tolerance and --patience flags in the command line tool using cbIterEnd()
    Source code(tar.gz)
    Source code(zip)
  • v1.1.0(Jul 9, 2020)

    • Add per-bone transformation hard-lock and per-vertex weights soft-lock
    • Fix initialization issue on cluster splitting
    • Support joint orientation in command line tools
    • Add command line tool for Linux
    • FBXSDK 2020, Alembic (from Maya 2020 DevKit)
    Source code(tar.gz)
    Source code(zip)
  • v1.0.1(Jun 18, 2020)

  • v1.0.0(Jun 18, 2020)

RATE: Overcoming Noise and Sparsity of Textual Features in Real-Time Location Estimation (CIKM'17)

RATE: Overcoming Noise and Sparsity of Textual Features in Real-Time Location Estimation This is the implementation of RATE: Overcoming Noise and Spar

Yu Zhang 5 Feb 10, 2022
Generating retro pixel game characters with Generative Adversarial Networks. Dataset "TinyHero" included.

pixel_character_generator Generating retro pixel game characters with Generative Adversarial Networks. Dataset "TinyHero" included. Dataset TinyHero D

Agnieszka Mikołajczyk 88 Nov 17, 2022
Tensorflow implementation of soft-attention mechanism for video caption generation.

SA-tensorflow Tensorflow implementation of soft-attention mechanism for video caption generation. An example of soft-attention mechanism. The attentio

Paul Chen 153 Nov 14, 2022
A denoising diffusion probabilistic model synthesises galaxies that are qualitatively and physically indistinguishable from the real thing.

Realistic galaxy simulation via score-based generative models Official code for 'Realistic galaxy simulation via score-based generative models'. We us

Michael Smith 32 Dec 20, 2022
StorSeismic: An approach to pre-train a neural network to store seismic data features

StorSeismic: An approach to pre-train a neural network to store seismic data features This repository contains codes and resources to reproduce experi

Seismic Wave Analysis Group 11 Dec 05, 2022
Official PyTorch Implementation of HELP: Hardware-adaptive Efficient Latency Prediction for NAS via Meta-Learning (NeurIPS 2021 Spotlight)

[NeurIPS 2021 Spotlight] HELP: Hardware-adaptive Efficient Latency Prediction for NAS via Meta-Learning [Paper] This is Official PyTorch implementatio

42 Nov 01, 2022
Logsig-RNN: a novel network for robust and efficient skeleton-based action recognition

GCN_LogsigRNN This repository holds the codebase for the paper: Logsig-RNN: a novel network for robust and efficient skeleton-based action recognition

7 Oct 14, 2022
Official implementation of "MetaSDF: Meta-learning Signed Distance Functions"

MetaSDF: Meta-learning Signed Distance Functions Project Page | Paper | Data Vincent Sitzmann*, Eric Ryan Chan*, Richard Tucker, Noah Snavely Gordon W

Vincent Sitzmann 100 Jan 01, 2023
A curated list of awesome open source libraries to deploy, monitor, version and scale your machine learning

Awesome production machine learning This repository contains a curated list of awesome open source libraries that will help you deploy, monitor, versi

The Institute for Ethical Machine Learning 12.9k Jan 04, 2023
Yolov5-lite - Minimal PyTorch implementation of YOLOv5

Yolov5-Lite: Minimal YOLOv5 + Deep Sort Overview This repo is a shortened versio

Kadir Nar 57 Nov 28, 2022
PyTorch implementation for Stochastic Fine-grained Labeling of Multi-state Sign Glosses for Continuous Sign Language Recognition.

Stochastic CSLR This is the PyTorch implementation for the ECCV 2020 paper: Stochastic Fine-grained Labeling of Multi-state Sign Glosses for Continuou

Zhe Niu 28 Dec 19, 2022
Using machine learning to predict and analyze high and low reader engagement for New York Times articles posted to Facebook.

How The New York Times can increase Engagement on Facebook Using machine learning to understand characteristics of news content that garners "high" Fa

Jessica Miles 0 Sep 16, 2021
A project which aims to protect your privacy using inexpensive hardware and easily modifiable software

Protecting your privacy using an ESP32, an IR sensor and a python script This project, which I personally call the "never-gonna-catch-me-in-the-act-ev

8 Oct 10, 2022
Patch SVDD for Image anomaly detection

Patch SVDD Patch SVDD for Image anomaly detection. Paper: https://arxiv.org/abs/2006.16067 (published in ACCV 2020). Original Code : https://github.co

Hong-Jeongmin 0 Dec 03, 2021
Speckle-free Holography with Partially Coherent Light Sources and Camera-in-the-loop Calibration

Speckle-free Holography with Partially Coherent Light Sources and Camera-in-the-loop Calibration Project Page | Paper Yifan Peng*, Suyeon Choi*, Jongh

Stanford Computational Imaging Lab 19 Dec 11, 2022
ICSS - Interactive Continual Semantic Segmentation

Presentation This repository contains the code of our paper: Weakly-supervised c

Alteia 9 Jul 23, 2022
This project aims to segment 4 common retinal lesions from Fundus Images.

This project aims to segment 4 common retinal lesions from Fundus Images.

Husam Nujaim 1 Oct 10, 2021
A Loss Function for Generative Neural Networks Based on Watson’s Perceptual Model

This repository contains the similarity metrics designed and evaluated in the paper, and instructions and code to re-run the experiments. Implementation in the deep-learning framework PyTorch

Steffen 86 Dec 27, 2022
Benchmarking Pipeline for Prediction of Protein-Protein Interactions

B4PPI Benchmarking Pipeline for the Prediction of Protein-Protein Interactions How this benchmarking pipeline has been built, and how to use it, is de

Loïc Lannelongue 4 Jun 27, 2022
Python package for covariance matrices manipulation and Biosignal classification with application in Brain Computer interface

pyRiemann pyRiemann is a python package for covariance matrices manipulation and classification through Riemannian geometry. The primary target is cla

447 Jan 05, 2023