使用MorphAnimation实现ThreeJS动画

16 篇文章 0 订阅
15 篇文章 0 订阅

效果:

 
 

代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8"/>
		<title>Horse</title>
		<style>body{background:#eee;margin:0;padding:0;overflow:hidden;}</style>
		<script src="js/three.min.js"></script>
	</head>
	<body>
		<script>
		var scene,camera,renderer;
		var mesh,animation;
		
		var width = window.innerWidth;
		var height = window.innerHeight;
		
		function init(){
			scene = new THREE.Scene();
			
			camera = new THREE.PerspectiveCamera(45, width/height, 1, 1000);
			camera.position.set(0, 0, 500);
			scene.add(camera);
				
			var loader = new THREE.JSONLoader(true);	//JSONLoader构造传入true,即showStatus=ture(显示加载进度)
			loader.load("models/animated/horse.js",function(geometry){
				mesh = new THREE.Mesh(geometry, new THREE.MeshLambertMaterial({color:0x606060,morphTargets:true}));
				mesh.position.y = -100;
				mesh.rotation.y = Math.PI/2;
				//mesh.scale.set(1.5, 1.5, 1.5);	//设置x,y,z的缩放比例
				scene.add(mesh);
				
				animation = new THREE.MorphAnimation(mesh);		//MorphAnimation是Mesh的封装,其update方法是对mesh.morphTargetInfluences的自动化处理(mesh.morphTargetInfluences和geometry.morphTargets对应)
				animation.play();		//播放动画
				//animation.pause();	//暂停动画
			});
			
			var light = new THREE.AmbientLight(0x606060, 0.5);
			scene.add(light);
			
			var drLight = new THREE.DirectionalLight(0xffffff);
			drLight.position.set(500, 500, 500);
			scene.add(drLight);
			
			renderer = new THREE.WebGLRenderer();
			renderer.setSize(width, height);
			renderer.setClearColor(0xeeeeee, 1.0);
			document.body.appendChild(renderer.domElement);
		}
		
		var delta = null;	//变量增量
		var clock = new THREE.Clock();	//创建一个时针/秒表
		function animate(){
			requestAnimationFrame(animate);
			
			if(mesh){
				mesh.rotation.y -= Math.PI/360;
			}
			
			delta = clock.getDelta();		//得到距离上一次调用render()过去的时间(以秒为单位)
			console.log(delta);
			if ( animation ) {
				animation.update(1000*delta);	//因为MorphAnimation类中this.duration=1000,即动画默认持续时间是1000毫秒,而delta是以秒为单位,所以乘以1000
			}
			
			renderer.render(scene, camera);
		}
		
		init();
		animate();
		</script>
	</body>
</html>

 附注:当前笔者使用的three.js版本是r69

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对整threeJS体系进行全面剖析。整理出全面的教学大纲,涵盖内容面非常广。此教学版本为threeJS107版本。关于版本不建议大家使用低于90的版本学习。以下是课程目录1-ThreeJS概览(基本图形简介,什么是点线面如何绘制点线面,什么是材质,什么是几何体,什么是相机,什么是渲染器,什么是场景)2-相机和渲染器(详解相机类型,渲染器如何使用,针对不同场景怎么用,怎么调效果,怎么渲染,怎么输出画布,如何解决透明问题等等)3-创建平面几何(常见的几何体如何使用,如何使用简单的几何体绘制出自定义自己想要的几何体,关于几何体的性能剖析,如何解决性能,几何体的渲染原理)4-高级图形算法常见库(求直线的斜率  计算线段与圆的交点 计算线段的长度 判断折线是否在多边形内 等等)5-sprite精灵(怎么让一个图标永远朝向屏幕,精灵的属性,精灵材质原理等,广告提示框必用)6-骨骼游戏动画(什么是模型动画,常见游戏案例,如何让人头进行各种攻击动作)7-3d模型加载(常见模型格式,如何渲染不同格式,不同格式的特点,什么格式性能优越,模型渲染异常,贴图不显示等问题详解)8-高阶动态纹理(你所不知道的纹理用法,我说你不知道,你肯定不知道)9-漫游轨迹以及其动画路径(怎么绘制贝塞尔曲线,如何使用曲线上的路径,跟随路径移动的原理,相机如何运动,物体如何运动)10-着色器(什么是着色器。初识着色器基础,着色器材质怎么用,怎么使用着色器库)11-常见渲染以及透明度问题12-对象拾取以及拖拽(3d世界里面如何拖拽物体,拖拽的原理,mousemove mouseon等的事件效果)13-世界坐标以及组的问题(什么是相对坐标,什么是世界坐标,什么是当前坐标,怎么转化父子坐标系,组的优化,为什么用组,组的优势)14-指定对象旋转中心(什么是物体的几何体中心,如何改变中心,如何绕轴转动)15-层级对象渲染(多个场景一键切换,切换的优势,针对大项目的用法)16-拓展了解系列(不定期不断更新案例,各种酷炫效果bloom,halo等,以及各种3d图表,粒子案例等,不断构建你的3d实践能力)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值