Three.js - 带BVH和JSON模型的动态骨架动画(未烘焙)

时间:2017-03-15 13:46:14

标签: javascript json animation three.js

简要说明:如何使用Three.js和BVH-motion捕获文件动态动画JSON字符模型?如下所示:动画未烘焙到JSON文件中,而是使用BVHLoader.js从BVH文件加载和解析

我得到了加载BVH文件,将其数据附加到skeletonHelper,提取骨骼位置,根据它们的位置动画一些框(用于测试目标)和加载(希望?)装配的JSON模型。 请在此处查看演示:https://www.patrik-huebner.com/repo/JSON-BVH/

在此处查看动画的GIF:https://www.patrik-huebner.com/repo/JSON-BVH/demo.gif(遗憾的是,我无法发布图片)

我对这个主题做了相当广泛的研究,虽然有很多有用的提示[1]关于使用Three.js导出器和动画烘焙将网格从Blender导出到JSON的stackoverflow,我不是能够弄清楚如何

a)设置JSON文件/装配模型/它的骨架/骨骼,以便我可以动态地为它设置动画(我使用了blendswap.com/blends/view/21948中的一个装配好的低多边形) 。有任何推荐的设置吗?为了能够加载文件我必须检查"导出场景" -option我不太确定为什么这是必要的。

b)将BVH数据映射到JSON模型

如果您有任何我可以使用的建议和/或代码示例 - 或至少我可以研究的一些资源或关键字,我将非常感激!

使用提供的BVHLoader.js我可以加载动画并将其附加到skeletonHelper

            var loader = new THREE.BVHLoader();
            loader.load( "models/pirouette.bvh", function( result ) {
                skeletonHelper = new THREE.SkeletonHelper( result.skeleton.bones[0] );
                skeletonHelper.skeleton = result.skeleton; // allow animation mixer to bind to SkeletonHelper directly

                boneContainer = new THREE.Group();
                boneContainer.add( result.skeleton.bones[ 0 ] );

                scene.add( skeletonHelper );
                scene.add( boneContainer );

                mixer = new THREE.AnimationMixer( skeletonHelper );
                mixer.clipAction( result.clip ).setEffectiveWeight( 1.0 ).play();
            } );

虽然我很确定这不是它的完成方式:我可以访问skeletonHelper的Vector3数据并根据这些位置动画一些测试多维数据集(比较上面的代码示例和我的提供GIF动画)

            for (var i = 0; i < skeletonHelper.bones.length; i++) {
                var myPos = skeletonHelper.bones[i].getWorldPosition();
                cubeGroup.children[i].position.x = myPos.x;
                cubeGroup.children[i].position.y = myPos.y;
                cubeGroup.children[i].position.z = myPos.z;
            }

最后,我加载JSON文件并使用THREE.ObjectLoader将其添加到场景中(因为THREE.JSONLoader不接受我导出的模型)

            // Load the rigged JSON-file based on this character http://www.blendswap.com/blends/view/21948
            // converted to JSON with the Three.json-export-plugin
            var loader = new THREE.ObjectLoader();
            var s = 50;
            loader.load(
                    "models/lowPoly-rigged.json",
                    function ( obj ) {
                            var material = new THREE.MeshLambertMaterial({color: 0xff0000});
                            scene.add( obj );
                            obj.position.y = 0;
                            obj.children[0].material = material;
                            obj.scale.set(s,s,s);
                    },
                    function ( xhr ) {
                            console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
                    },
                    function ( xhr ) {
                            console.error( 'An error happened' );
                    }
            );

但现在:如何使用加载的BVH数据为模型设置动画。我是否必须将JSON模型中的骨骼数量与BVH相匹配?我是否可以向模型提供一些数据并让它发生?#34;神奇地&#34;?我已经看到一些在线演示动态加载BVH文件并将数据传递给模型[2]

[1]东西我做了研究(遗憾的是,我无法发布更多链接)没有帮助,对我想要达到的目标并不十分具体:

  • stackoverflow.com/questions/20433474/dynamic-bones-animation-in-three-js
  • stackoverflow.com/questions/29970791/animate-makehuman-character-with-bvh-using-three-js
  • stackoverflow.com/questions/40719572/three-js-wrong-bones-orientation(这确实看起来最有帮助,因为它实际上是关于组合加载的BVH文件和模型,但研究/实现我自己的代码模型导致关于材料的错误消息,这些消息表明我在从Blender到JSON的出口过程中对我的一些误解。)

[2]一些能够处理BVH文件并可以将这些动画附加到模型的资源:

  • Aki A.在BVExperiments上的BVH播放器:chromeexperiments.com/experiment/bvh-player
  • lo-th.github.io/root/blending2/index_bvh.html

再次,非常感谢任何输入!

0 个答案:

没有答案