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

使用Animation实现ThreeJS动画

阅读更多

第一步:

画地面,并让地面旋转,以便观察

效果:

代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8"/>
		<title>Knight</title>
		<style>body{background:#fff;margin:0;padding:0;overflow:hidden;}</style>
		<script src="js/three.min.js"></script>
	</head>
	<body>
		<script>
			var width = window.innerWidth;
			var height = window.innerHeight;
			
			var scene = new THREE.Scene();
			
			var camera = new THREE.PerspectiveCamera(45, width/height, 1, 10000);
			//camera.position.z = 1000;
			camera.position.set(0, 0, 1000);
			//camera.up.z = 1;
			camera.lookAt({x:0,y:0,z:0});
			//scene.add(camera);
			
			var geometry = new THREE.PlaneBufferGeometry(500, 500, 1, 1);	//Palne是在x/y轴上绘制的(所有不用旋转90度即可看到)
			var material = new THREE.MeshPhongMaterial({emissive:0xbbbbbb});	//MeshPhongMaterial冯氏材质,即类玻璃的镜面材质;emissive:0xbbbbbb,即反射#bbbbbb颜色的光
			
			var ground = new THREE.Mesh(new THREE.PlaneBufferGeometry(500, 500, 1, 1), new THREE.MeshBasicMaterial({color:0xbbbbbb,side:THREE.DoubleSide}));
			//var ground = new THREE.Mesh(geometry, material);
			ground.position.set(0, 0, 0);
			//ground.rotation.x = -Math.PI/2;
			this.scene.add(ground);
			
			var ambientLight = new THREE.AmbientLight(0x222222);
			scene.add(ambientLight);
			
			var drLight = new THREE.DirectionalLight(0xeeeeee);
			drLight.position.set(100, 100, 100);
			scene.add(drLight);
			
			var renderer = new THREE.WebGLRenderer({antialias:true});
			renderer.setSize(width, height);
			renderer.setClearColor(0xffffff, 1.0);
			document.body.appendChild(renderer.domElement);
			
			var delta = 0;
			function render(){
				delta>Math.PI*2 ? delta=0 : delta+=Math.PI/180;
				//camera.lookAt({x:0,y:0,z:0});
				ground.rotation.x = delta;
				renderer.render(scene, camera);
				
				requestAnimationFrame(render);
			}
			render();
		</script>
	</body>
</html>

 

第二步:

加载模型

效果:

 代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8"/>
		<title>Knight</title>
		<style>body{background:#fff;margin:0;padding:0;overflow:hidden;}</style>
		<script src="js/three.min.js"></script>
	</head>
	<body>
		<script>
		var scene,camera,renderer;
		var mesh,ground;
		var width = window.innerWidth;
		var height = window.innerHeight;
		
		function init(){
			scene = new THREE.Scene();
			
			camera = new THREE.PerspectiveCamera(45, width/height, 1, 10000);
			camera.position.set(0, 0, 1000);
			camera.lookAt({x:0, y:0, z:0});
			scene.add(camera);
			
			var geometry = new THREE.PlaneBufferGeometry(500, 500, 1, 1);	//Palne是在x/y轴上绘制的(所有不用旋转90度即可看到)
			var material = new THREE.MeshPhongMaterial({emissive:0xbbbbbb});	//MeshPhongMaterial冯氏材质,即类玻璃的镜面材质;emissive:0xbbbbbb,即反射#bbbbbb颜色的光
			//var material = new THREE.MeshBasicMaterial({color:0xbbbbbb, side:THREE.DoubleSide});
			
			ground = new THREE.Mesh(geometry, material);
			ground.position.set(0, 0, 0);
			ground.rotation.x = -Math.PI/2;
			scene.add(ground);
			
			var loader = new THREE.JSONLoader();
			loader.load( "models/skinned/knight.js", function ( geometry, materials ) {
				var mesh = new THREE.SkinnedMesh( geometry, new THREE.MeshFaceMaterial( materials ) );	//蒙皮网格模型
				mesh.position.set( 0, 0, 0 );
				mesh.scale.set( 30, 30, 30 );
				scene.add( mesh );
			});
			
			var ambientLight = new THREE.AmbientLight(0x222222);
			scene.add(ambientLight);
			
			var drLight = new THREE.DirectionalLight(0xeeeeee);
			drLight.position.set(100, 100, 100);
			scene.add(drLight);
			
			renderer = new THREE.WebGLRenderer({antialias:true});
			renderer.setSize(width, height);
			renderer.setClearColor(0xffffff, 1.0);
			document.body.appendChild(renderer.domElement);
		}
		var delta = 0;
		function animate(){
			requestAnimationFrame(animate);
			
			delta>Math.PI*2 ? delta=0 : delta+=Math.PI/180;
			ground.rotation.x = delta;
			renderer.render(scene, camera);
		}
		
		init();
		animate();
		</script>
	</body>
</html>

 

第三步:

重新设定相机位置,并添加旋转控件,以便从各个方位观察模型

效果:

 代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8"/>
		<title>MyKnight</title>
		<style>body{background:#fff;margin:0;padding:0;overflow:hidden;}</style>
		<script src="js/three.min.js"></script>
		<script src="js/controls/TrackballControls.js"></script>
	</head>
	<body>
		<script>
		var scene,camera,renderer;
		var mesh,ground;
		var controls;
		var width = window.innerWidth;
		var height = window.innerHeight;
		
		function init(){
			scene = new THREE.Scene();
			
			camera = new THREE.PerspectiveCamera(45, width/height, 1, 10000);
			camera.position.set(-500, 500, 800);
			camera.lookAt({x:0, y:0, z:0});
			scene.add(camera);
			
			var geometry = new THREE.PlaneBufferGeometry(500, 500, 1, 1);	//Palne是在x/y轴上绘制的(所有不用旋转90度即可看到)
			//var material = new THREE.MeshPhongMaterial({emissive:0xbbbbbb});	//MeshPhongMaterial冯氏材质,即类玻璃的镜面材质;emissive:0xbbbbbb,即反射#bbbbbb颜色的光
			var material = new THREE.MeshBasicMaterial({color:0xbbbbbb, side:THREE.DoubleSide});
			
			ground = new THREE.Mesh(geometry, material);
			ground.position.set(0, 0, 0);
			ground.rotation.x = -Math.PI/2;
			ground.receiveShadow = true;
			scene.add(ground);
			
			var loader = new THREE.JSONLoader();
			loader.load( "models/skinned/knight.js", function ( geometry, materials ) {
				var mesh = new THREE.SkinnedMesh( geometry, new THREE.MeshFaceMaterial( materials ) );	//蒙皮网格模型
				mesh.position.set( 0, 0, 0 );
				mesh.scale.set( 30, 30, 30 );
				mesh.castShadow = true;
				scene.add( mesh );
			});
			
			var ambientLight = new THREE.AmbientLight(0x222222);
			scene.add(ambientLight);
			
			var drLight = new THREE.DirectionalLight(0xeeeeee);
			drLight.position.set(500, 500, 500);
			drLight.castShadow = true;
			scene.add(drLight);
			
			renderer = new THREE.WebGLRenderer({antialias:true});
			renderer.setSize(width, height);
			renderer.setClearColor(0xffffff, 1.0);
			renderer.shadowMapEnabled = true;
			document.body.appendChild(renderer.domElement);
			
			controls = new THREE.TrackballControls(camera);
			controls.staticMoving = true;
		}
		//var delta = 0;
		
		function animate(){
			requestAnimationFrame(animate);
			
			controls.update();
			//delta>Math.PI*2 ? delta=0 : delta+=Math.PI/180;
			//camera.rotation.y = delta;
			//camera.lookAt(scene.position);
			renderer.render(scene, camera);
		}
		
		init();
		animate();
		</script>
	</body>
</html>

 

第四步:

使用Animation播放动画模型,并使用THREE.Clock()做计时器

效果:


 代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8"/>
		<title>MyKnight</title>
		<style>body{background:#fff;margin:0;padding:0;overflow:hidden;}</style>
		<script src="js/three.min.js"></script>
		<script src="js/controls/TrackballControls.js"></script>
	</head>
	<body>
		<script>
		var scene,camera,renderer;
		var mesh,ground;
		var controls;
		var width = window.innerWidth;
		var height = window.innerHeight;
		
		function init(){
			scene = new THREE.Scene();
			
			camera = new THREE.PerspectiveCamera(45, width/height, 1, 10000);
			camera.position.set(-500, 500, 800);
			camera.lookAt({x:0, y:0, z:0});
			scene.add(camera);
			
			var geometry = new THREE.PlaneBufferGeometry(1000, 1000, 1, 1);	//Palne是在x/y轴上绘制的(所有不用旋转90度即可看到)
			//var material = new THREE.MeshPhongMaterial({emissive:0xbbbbbb});	//MeshPhongMaterial冯氏材质,即类玻璃的镜面材质;emissive:0xbbbbbb,即反射#bbbbbb颜色的光
			var material = new THREE.MeshBasicMaterial({color:0xbbbbbb, side:THREE.DoubleSide});
			
			var loader = new THREE.JSONLoader();
			loader.load( "models/skinned/knight.js", function ( geometry, materials ) {
				
				for ( var i = 0; i < materials.length; i ++ ) {
					var m = materials[ i ];
					m.skinning = true;		//蒙皮
					m.morphTargets = true;	//变形目标
				}
			
				mesh = new THREE.SkinnedMesh( geometry, new THREE.MeshFaceMaterial( materials ) );	//蒙皮网格模型
				//mesh.position.set( 0, 0, 100 );
				mesh.scale.set( 30, 30, 30 );
				mesh.castShadow = true;
				scene.add( mesh );
				
				var animation = new THREE.Animation( mesh, geometry.animation );
				animation.play();
			});
			
			ground = new THREE.Mesh(geometry, material);
			ground.position.set(0, 0, 0);
			ground.rotation.x = -Math.PI/2;
			ground.receiveShadow = true;
			scene.add(ground);
			
			var drLight = new THREE.DirectionalLight(0xeeeeee);
			drLight.position.set(500, 500, 500);
			drLight.castShadow = true;
			scene.add(drLight);
			
			renderer = new THREE.WebGLRenderer({antialias:true});
			renderer.setSize(width, height);
			renderer.setClearColor(0xffffff, 1.0);
			renderer.shadowMapEnabled = true;

			document.body.appendChild(renderer.domElement);
			
			controls = new THREE.TrackballControls(camera);
			controls.staticMoving = true;
		}
		
		var clock = new THREE.Clock();
		function animate(){
			requestAnimationFrame(animate);
			
			controls.update();
			
			THREE.AnimationHandler.update( 0.75*clock.getDelta() );		//控制动画速度(AnimationHandler类的update: function ( deltaTimeMS ) {...}方法,参数以ms为单位)

			renderer.render(scene, camera);
		}
		
		init();
		animate();
		</script>
	</body>
</html>

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

 

  • 大小: 28.6 KB
  • 大小: 35.3 KB
  • 大小: 39.8 KB
  • 大小: 39.1 KB
  • 大小: 36.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics