`
18211103738
  • 浏览: 82684 次
  • 性别: 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
分享到:
评论

相关推荐

    3D 签到墙 ThreeJS动画

    **3D签到墙ThreeJS动画详解** Three.js是一个基于WebGL的JavaScript库,用于在浏览器中创建3D图形。这个“3D签到墙”项目利用Three.js的强大功能,为活动、年会等场合提供一种新颖且互动的签到体验。通过WebGL,它...

    基于Threejs的火焰烟雾动画效果代码

    Three.js 提供了`THREE.Animation`和`THREE.KeyframeAnimation`等类来支持这种动画形式。此外,还可以利用`requestAnimationFrame`函数来实现连续的帧更新,以达到流畅的动画效果。 **火焰和烟雾效果** 创建火焰和...

    threejs 消防报警 报警精灵 动画

    综上所述,"threejs 消防报警 报警精灵 动画"项目利用Three.js的强大功能,创建了一个逼真的3D消防报警系统,通过动画效果增强了用户体验。通过深入学习和实践Three.js,开发者可以创造出更多富有创新和实用性的3D...

    three.js 动画帧切割

    首先,要理解的是,three.js中的动画是通过关键帧(Keyframe)和动画控制器(AnimationClip)来实现的。关键帧是时间轴上的特定时刻,模型的特定属性(如位置、旋转、缩放)在这些时刻的值。动画剪辑是包含一系列...

    canvas、threejs动画绘制效果

    在"004(特效)"这个文件中,可能包含了使用Canvas和Three.js实现的各种动画绘制效果。这些效果可能涵盖了以下知识点: 1. **基本图形绘制**:使用Canvas API创建简单的2D图形,如矩形、圆形、线条等,并通过改变颜色...

    ThreeJS使用Curve曲线让物体沿轨迹运动DEMO

    本示例"ThreeJS使用Curve曲线让物体沿轨迹运动DEMO"探讨了如何利用Three.js中的Curve类来创建自定义的路径,并使物体沿着这条路径移动。 首先,让我们理解什么是Curve。在Three.js中,Curve是定义二维空间中路径的...

    three.js仿人行走的动画效果

    5. **动画效果**:在Three.js中,可以使用`THREE.Animation`或`THREE.AnimationMixer`类来控制和混合动画。`AnimationMixer`尤其适用于复杂的动画控制,它可以同时管理多个动画,并根据需要进行时间线混合,使动画更...

    基于threejs实现的地球酷炫3D飞行轨迹线.zip

    动画的实现可以通过Three.js提供的动画系统,如`THREE.Animation`或使用`requestAnimationFrame`函数来更新场景。在每一帧中,开发者会更新粒子或线条的位置,使得轨迹线随时间变化,同时地球也会根据设定的速度旋转...

    vue3.0导入threejs三维模型,实现模型放大,缩小,拖动及其动画效果,鼠标点击规划空间路径。

    在本项目中,我们主要探讨如何在Vue3.0框架中整合Three.js库,以便导入三维模型,并实现模型的缩放、平移、旋转以及添加交互式动画效果,特别是通过鼠标点击来规划空间路径。Three.js是JavaScript的一个强大库,用于...

    threejs 室内机房源码

    【描述】提到的"threejs 室内机房源码"意味着这个代码集包含了实现以下功能的脚本: 1. **场景构建**:使用Three.js创建3D场景,包括地板、墙壁、天花板、设备等元素。 2. **模型导入**:可能涉及到将3D模型(如OBJ...

    基于Threejs的鼠标移动图片跟随变形动画特效

    【基于Threejs的鼠标移动图片跟随变形动画特效】是一个利用HTML5库Three.js实现的交互式视觉效果。Three.js是一个强大的JavaScript库,专门用于在Web浏览器中创建和展示3D图形,无需用户安装任何插件。它使得Web...

    基于threejs的3D爆炸碎片轮播图特效

    【基于threejs的3D爆炸碎片轮播图特效】是一个运用了HTML5库技术,特别是Three.js库,来实现一种创新且引人注目的视觉效果。Three.js是JavaScript的一个库,专为在Web浏览器中创建和展示三维图形而设计。这个特效...

    ThreeJs官方案例源码

    7. **动画(Animation)**:Three.js提供了多种方式实现3D物体的动画效果,如`THREE.Object3D.rotation.y += ...`手动更新旋转角度,或者使用`THREE.AnimationMixer`结合JSON动画数据进行更复杂的动画控制。...

    threejs测试文件格式汇总

    - 动画的加载和播放可能需要额外的处理,例如使用 `THREE.AnimationClip` 和 `THREE.AnimationMixer`。 总之,"threejs测试文件格式汇总" 提供了一个全面的资源集合,可以帮助开发者了解和实践在Three.js 中如何...

    网页模板——基于threejs实现3D爆炸碎片轮播图特效.zip

    【标题】中的“网页模板——基于threejs实现3D爆炸碎片轮播图特效”表明这是一个使用Web技术,特别是three.js库来创建的3D视觉效果。Three.js是JavaScript的一个库,专为在Web浏览器中创建和展示三维图形设计。这个...

    基于threejs的3d学校示例

    "基于threejs的3d学校示例"项目旨在展示如何使用Three.js来构建一个3D的学校环境。这个项目可能包括建筑物、道路、植被等元素,通过交互式的方式,让用户能够自由浏览、缩放、旋转这个3D空间。这样的应用可以用于...

    ThreeJS中文API文档

    这个"ThreeJS中文API文档"是为开发者提供的一种详细、易懂的参考资源,旨在帮助他们更好地理解和使用THREE.JS库。以下是对这个API文档中可能包含的一些关键知识点的详细解释: 1. **对象和类**:THREE.JS中的所有...

    html5+three.js彩色液态流动背景动画特效.zip

    在本项目中,“html5+three.js彩色液态流动背景动画特效.zip”是一个利用HTML5和Three.js库实现的特效代码包。Three.js是一个基于WebGL的JavaScript 3D库,它简化了在浏览器中创建3D图形的过程。 首先,`index....

    基于threejs实现3D爆炸碎片轮播图特效.zip

    【标题】中的“基于threejs实现3D爆炸碎片轮播图特效”表明这是一个关于使用Three.js库在前端开发中创建3D动态效果的项目。Three.js是一个JavaScript库,它为Web浏览器提供了丰富的3D图形渲染功能,使得开发者无需...

    LearningThreeJs_ThreeJS_three.jslearn_Threejs学习_

    动画和交互性是Three.js的另一个亮点。通过时间线(Animation)和事件监听,我们可以实现3D对象的动态行为,如旋转、平移、缩放等。此外,还可以添加鼠标或触摸事件,让用户与3D场景进行互动,如点击、拖动等。 ...

Global site tag (gtag.js) - Google Analytics