`
18211103738
  • 浏览: 81154 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

使用MorphAnimMesh实现ThreeJS动画

阅读更多

效果:

 

 

代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8"/>
		<title>Morph-Bird</title>
		<style>body{background:#eeeeee;margin:0;padding:0;overflow:hidden;}</style>
		<script src="js/three.min.js"></script>
		<!--<script src="js/stats.min.js"></script>
		<script src="js/Detector.js"></script>-->
	</head>
	<body>
		<script>
		var morphs = [];
		var clock = new THREE.Clock();	//创建一个时针/秒表
		
		var width = window.innerWidth;
		var height = window.innerHeight;
		
		var scene = new THREE.Scene();
		
		var camera = new THREE.PerspectiveCamera( 40, width/2 / height, 1, 10000 );
		camera.position.y = 300;
		camera.target = new THREE.Vector3( 0, 150, 0 );
		//scene.add(camera);
		
		var loader = new THREE.JSONLoader();
		loader.load("models/animated/flamingo.js", function(geometry){
			morphColorsToFaceColors( geometry );
			geometry.computeMorphNormals();		//计算面的每一个法线(这样才能得到正确的关照效果)
			
			var material = new THREE.MeshLambertMaterial( { color: 0xffffff, morphTargets: true, morphNormals: true, vertexColors: THREE.FaceColors, shading: THREE.FlatShading } );
			/*MorphAnimMesh类是Mesh的扩展类,封装了对mesh.morphTargetInfluences的处理*/
			var morphAnimMesh = new THREE.MorphAnimMesh( geometry, material );	//动画网格模型(本质和Mesh一样,都表示一个可以显示的对象,所不同的是他包含几个动画帧,可以通过播放帧来看到动画)
			//morphAnimMesh.playAnimation();
			
			morphAnimMesh.duration = 1500;		//持续时间(单位ms)

			morphAnimMesh.scale.set( 1.5, 3.0, 1.5 );	//设置模型比例(放大了一些)
			morphAnimMesh.position.y = 150;		//设置位置(在y轴上)

			scene.add( morphAnimMesh );
			morphs.push( morphAnimMesh );
		});
		
		/*将geometry.morpColors中存储的颜色复制到geometry.faces信息中,因为绘制的时候会用到faces中的颜色*/
		function morphColorsToFaceColors( geometry ) {

			if ( geometry.morphColors && geometry.morphColors.length ) {

				var colorMap = geometry.morphColors[ 0 ];

				for ( var i = 0; i < colorMap.colors.length; i ++ ) {

					geometry.faces[ i ].color = colorMap.colors[ i ];
					geometry.faces[ i ].color.offsetHSL( 0, 0.3, 0 );	//模型的饱和度提高0.3

				}

			}

		}
		
		var upLight = new THREE.DirectionalLight(0xffffff, 1.3);
		upLight.position.set(1, 1, 1);
		scene.add(upLight);
		
		var downLight = new THREE.DirectionalLight(0xffffff, 0.1);
		//downLight.position.set(0.25, -1, 0);
		downLight.position.set(-1, -1, -1);
		scene.add(downLight);
		
		var renderer = new THREE.WebGLRenderer({antialias:true});
		renderer.setSize(width, height);
		renderer.setClearColor(0xeeeeee, 1.0);
		
		renderer.sortObjects = false;
		renderer.autoClear = false;

		renderer.gammaInput = true;
		renderer.gammaOutput = true;
		
		document.body.appendChild(renderer.domElement);
		
		var theta = 0;
		var delta = null;
		var radius = 600;
		function render() {

			theta += 0.1;	//每帧0.1度(如果1秒钟60帧,那么1秒钟就是6度)
			
			/*相机绕y轴以半径为600的圆旋转*/
			camera.position.x = radius * Math.sin( THREE.Math.degToRad( theta ) );
			camera.position.z = radius * Math.cos( THREE.Math.degToRad( theta ) );

			camera.lookAt( camera.target );		//相机聚焦于相机的焦点(一般为(0,0,0))

			delta = clock.getDelta();		//得到距离上一次调用render()过去的时间(单位秒)
			
			for ( var i = 0; i < morphs.length; i ++ ) {
				morph = morphs[ i ];
				//console.log(i);		//永远是0
				morph.updateAnimation( 1000 * delta );		//更新动画的每一帧,并在其中渲染动画
			}		

			renderer.clear();		//清空渲染器

			renderer.setViewport( 0, 0, width, height ); //设置视口(等于窗口的位置和大小)
			renderer.render( scene, camera );
			
			requestAnimationFrame(render);
		}
		render();
		</script>
	</body>
</html>

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

  • 大小: 31.1 KB
分享到:
评论

相关推荐

    基于matlab实现实现了基于项目的协同过滤代码,MATLAB实现.rar

    基于matlab实现实现了基于项目的协同过滤代码,MATLAB实现.rar

    各地区年末城镇登记失业人员及失业率.xls

    数据来源:中国劳动统计NJ-2023版

    企业固定资产信息管理系统设计与实现.doc

    企业固定资产信息管理系统设计与实现.doc

    node-v11.14.0-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v8.9.1-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v12.10.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于VB实现的学生成绩管理系统(源代码+系统+开题报告+答辩PPT).zip

    【作品名称】:基于VB实现的学生成绩管理系统(源代码+系统+开题报告+答辩PPT) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    银行信贷管理系统设计与实现-(毕业设计)1.docx

    银行信贷管理系统设计与实现-(毕业设计)1.docx

    基于VB实现的银行代扣代发工资系统(源代码+系统+开题报告).zip

    【作品名称】:基于VB实现的银行代扣代发工资系统(源代码+系统+开题报告) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    (更新至2022年)全国镇分年龄、性别的人口数.xls

    数据来源:中国人口与就业统计NJ-2023版

    基于Java的考试管理系统

    java,大学课后作业

    数据更新至2020年分地区发电装机容量增速(风电).xls

    数据来源:中国电力统计NJ-2021版

    基于VB实现的网上餐饮管理系统设计(论文+源代码+开题报告+英文文献).zip

    【作品名称】:基于VB实现的网上餐饮管理系统设计(论文+源代码+开题报告+英文文献) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    基于matlab实现烟花算法进行函数最小-最大值寻优,对十多个测试函数进行了寻优,效果良好,代码附带详细说明.rar

    基于matlab实现烟花算法进行函数最小_最大值寻优,对十多个测试函数进行了寻优,效果良好,代码附带详细说明.rar

    数据更新至2020年分地区单机6000千瓦及以上 水力发电机组分类情况(合计).xls

    数据来源:中国电力统计NJ-2021版

    基于VB实现的商场管理系统设计(源代码+系统).zip

    【作品名称】:基于VB实现的商场管理系统设计(源代码+系统) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    (更新至2022年)全国按年龄、性别分的就业人员受教育程度构成.xls

    数据来源:中国劳动统计NJ-2023版

    数据更新至2020年分地区6000千瓦及以上电厂发电量(太阳能发电).xls

    数据来源:中国电力统计NJ-2021版

    数据更新至2020年分地区发电装机容量增速(合计).xls

    数据来源:中国电力统计NJ-2021版

    各地区劳动能力鉴定情况(2022年).xls

    数据来源:中国劳动统计NJ-2023版

Global site tag (gtag.js) - Google Analytics