相关文章推荐
玩滑板的凉面  ·  Selenium ...·  7 月前    · 
爱健身的鼠标垫  ·  在NPOI ...·  11 月前    · 
知识渊博的柚子  ·  Sql server ...·  1 年前    · 
害羞的海龟  ·  Pytorch Norm 层 - 简书·  1 年前    · 

关于Three.js-加载含有动画的js模型

目标:3d max 动画模型 使用three.js在浏览器端展示

设计给了个max的动画模型,需要把这个模型用three.js加载到浏览器上

通过网上资料,发现three.js可以用blender转成的js格式加载

所以有了以下 流程:

1.使用3d max 将 银刀.max 转换成银刀.fbx文件

2.使用blender导入银刀.fbx文件 检查无误后用three.js文档中的转换插件将银刀.fbx转换成 yindao.js

3.使用three.js的jsonloader加载js文件


1.3d Max导出FBX

3d Max打开后直接导出成FBX文件


背包: 获得银刀.fbx文件

2.使用blender将fbx文件转换成js文件

第一步、导入转换插件

插件目录:

three.js-master\utils\exporters\blender\addons

将io_three文件夹(名字各个版本可能不同)

复制到Blender安装目录(以我的安装路径为例)

D:\Program Files\Blender\Foundation\Blender\2.79\scripts\addons

使用blender打开FBX文件

导出成js

参数如下:

注意:

Skeletal animation不能选 不然导出会报错,可能模型问题?

版本 :blender:2.74 three.js R88

three转换插件:旧版 (新版js格式不一样) 具体区别移步 下载地址

背包: 获得银刀.js文件

3.使用Three.js加载js动画模型

添加相机
添加轨迹控件
添加时钟,场景,AnimationMixer
加载js
添加光
添加渲染器
添加帧率显示器
添加控制动画的事件
动画渲染

完整代码如下:

<!DOCTYPE html>
<html lang="en">
		<title>three.js webgl - blender -json</title>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
		<style>
			body {
				background:#777;
				padding:0;
				margin:0;
				font-weight: bold;
				overflow:hidden;
				color: #ffffff;
		</style>
	</head>
		<div id="container"></div>
		<script src="three.js"></script>
        <script type="text/javascript" src="OrbitControls.js"></script>
		<script src="Detector.js"></script>
		<script src="stats.min.js"></script>
		<script>
			if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
			var container, stats, clock, mixer;
			var camera, scene, renderer, active;
			init();
			animate();
		function init() {
		container = document.getElementById( 'container' );
                //创建相机
                camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 1, 2000 );
				//设置相机
                camera.position.set( 0, 0, 8 );
                camera.rotateY(30)
                //创建控件
                controls = new THREE.OrbitControls( camera );
                controls.dampingFactor = 0.1;
                controls.update();
                //创建时钟
		clock = new THREE.Clock();	
                //创建场景
                scene = new THREE.Scene();
                //创建坐标辅助线
                var axesHelper = new THREE.AxesHelper( 5 );
                scene.add( axesHelper );
                //创建动画混合器
		mixer = new THREE.AnimationMixer( scene );
                //创建JSONLoader
                var loader = new THREE.JSONLoader();
		loader.load( '132_1.js', function ( geometry, materials ) {
                    //允许变形动画
		        for(let i = 0;i<materials.length;i++){
                        materials[i].morphTargets = true;
                    //创建mesh
		    var mesh = new THREE.Mesh( geometry, materials );
                    //舍子mesh属性
                    mesh.rotateX(29.8);
		    mesh.position.set( 0, 0, 0 );	    
                    //添加到场景
                    scene.add( mesh );	    
                    //初始化clipAction
                    active = mixer.clipAction( geometry.animations[ 0 ], mesh )	    
                    //设置播放时间 5s
                    active.setDuration( 5 )			// one second            				
				} );
                // lights
                //环境光
		    var ambientLight = new THREE.AmbientLight( 0xffffff );
		    scene.add( ambientLight );	
                //点光源
                var pointLight = new THREE.PointLight( 0xffffff, 5, 30 );
		pointLight.position.set( 5, 0, 10 );
		scene.add( pointLight );
                //点光源
                var pointLight1 = new THREE.PointLight( 0xffffff, 5, 30 );
		pointLight1.position.set( 5, 0, -10 );
		scene.add( pointLight1 );		
                // 初始化渲染器
		renderer = new THREE.WebGLRenderer();
                //设置渲染器
                renderer.setClearColor(0xffffff); //画布颜色
		renderer.setPixelRatio( window.devicePixelRatio );
		renderer.setSize( window.innerWidth, window.innerHeight );
		container.appendChild( renderer.domElement );	
                // 初始化状态台
				stats = new Stats();
				container.appendChild( stats.dom );	
                // 事件
		window.addEventListener( 'resize', onWindowResize, false );
                window.addEventListener("keydown",function(e){
                    if(e.code == "Space"){
                        active.clampWhenFinished = true;
                        active.play()
			//窗口重置
			function onWindowResize( event ) {
				renderer.setSize( window.innerWidth, window.innerHeight );
				camera.aspect = window.innerWidth / window.innerHeight;
				camera.updateProjectionMatrix();
			// 动画
			function animate() {
				requestAnimationFrame( animate );
				render();
                                controls.update();
				stats.update();
			function render() {
				mixer.update( clock.getDelta() );
                              if(active.time >5.8){
                                   active.paused = true
				camera.lookAt( scene.position );