瀏覽代碼

Merge pull request #14642 from donmccurdy/examples-keyframes-glb-v2

Examples: Merge animation "keyframes" and "scene" examples.
Mr.doob 7 年之前
父節點
當前提交
6201c9ac8c

+ 1 - 2
examples/files.js

@@ -1,8 +1,7 @@
 var files = {
 	"webgl": [
 		"webgl_animation_cloth",
-		"webgl_animation_keyframes_json",
-		"webgl_animation_scene",
+		"webgl_animation_keyframes",
 		"webgl_animation_skinning_blending",
 		"webgl_animation_skinning_morph",
 		"webgl_camera",

二進制
examples/models/gltf/LittlestTokyo.glb


文件差異過大導致無法顯示
+ 0 - 1769
examples/models/json/pump/pump.json


二進制
examples/models/json/pump/pump_body.jpg


二進制
examples/models/json/pump/pump_gears.jpg


二進制
examples/models/json/pump/pump_metalreflect.jpg


文件差異過大導致無法顯示
+ 0 - 2700
examples/models/json/scene-animation.json


+ 55 - 13
examples/webgl_animation_keyframes_json.html → examples/webgl_animation_keyframes.html

@@ -1,12 +1,11 @@
 <!DOCTYPE html>
 <html lang="en">
 	<head>
-		<title>three.js webgl - animation - keyframes - json</title>
+		<title>three.js webgl - animation - keyframes</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 {
-				color: #fff;
 				font-family:Monospace;
 				font-size:13px;
 				text-align:center;
@@ -19,6 +18,12 @@
 				top: 0px; width: 100%;
 				padding: 5px;
 			}
+			#info p {
+				max-width: 600px;
+				margin-left: auto;
+				margin-right: auto;
+				padding: 0 2em;
+			}
 			a {
 				color: #2983ff;
 			}
@@ -30,18 +35,25 @@
 		<div id="container"></div>
 
 		<div id="info">
-			<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - animation - keyframes - json
+			<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - animation - keyframes
+			<p>
+				Model: <a href="https://sketchfab.com/models/94b24a60dc1b48248de50bf087c0f042" target="_blank" rel="noopener">Littlest Tokyo</a> by
+				<a href="https://sketchfab.com/glenatron" target="_blank" rel="noopener">glenatron</a>, CC Attribution.
+			</p>
 		</div>
 
 		<script src="../build/three.js"></script>
 
 		<script src="js/Detector.js"></script>
 		<script src="js/libs/stats.min.js"></script>
+		<script src="js/controls/OrbitControls.js"></script>
+		<script src="js/loaders/DRACOLoader.js"></script>
+		<script src="js/loaders/GLTFLoader.js"></script>
 
 		<script>
 
 			var scene, camera, pointLight, stats;
-			var renderer, mixer, animationClip;
+			var renderer, mixer, controls;
 
 			var clock = new THREE.Clock();
 			var container = document.getElementById( 'container' );
@@ -52,17 +64,19 @@
 			renderer = new THREE.WebGLRenderer( { antialias: true } );
 			renderer.setPixelRatio( window.devicePixelRatio );
 			renderer.setSize( window.innerWidth, window.innerHeight );
+			renderer.gammaOutput = true;
+			renderer.gammaFactor = 2.2;
 			container.appendChild( renderer.domElement );
 
 			scene = new THREE.Scene();
-
-			var grid = new THREE.GridHelper( 20, 20, 0x888888, 0x888888 );
-			grid.position.set( 0, - 1.1, 0 );
-			scene.add( grid );
+			scene.background = new THREE.Color( 0xbfe3dd );
 
 			camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 100 );
-			camera.position.set( - 5.00, 3.43, 11.31 );
-			camera.lookAt( new THREE.Vector3( - 1.22, 2.18, 4.58 ) );
+			camera.position.set( 5, 2, 8 );
+
+			controls = new THREE.OrbitControls( camera, renderer.domElement );
+			controls.target.set( 0, 0.5, 0 );
+			controls.enablePan = false;
 
 			scene.add( new THREE.AmbientLight( 0x404040 ) );
 
@@ -70,15 +84,41 @@
 			pointLight.position.copy( camera.position );
 			scene.add( pointLight );
 
-			new THREE.ObjectLoader().load( 'models/json/pump/pump.json', function ( model ) {
+			// envmap
+			var path = 'textures/cube/Park2/';
+			var format = '.jpg';
+			var envMap = new THREE.CubeTextureLoader().load( [
+				path + 'posx' + format, path + 'negx' + format,
+				path + 'posy' + format, path + 'negy' + format,
+				path + 'posz' + format, path + 'negz' + format
+			] );
+
+			THREE.DRACOLoader.setDecoderPath( 'js/libs/draco/gltf/' );
+
+			var loader = new THREE.GLTFLoader();
+			loader.setDRACOLoader( new THREE.DRACOLoader() );
+			loader.load( 'models/gltf/LittlestTokyo.glb', function ( gltf ) {
+
+				var model = gltf.scene;
+				model.position.set( 1, 1, 0 );
+				model.scale.set( 0.01, 0.01, 0.01 );
+				model.traverse( function ( child ) {
+
+					if ( child.isMesh ) child.material.envMap = envMap;
+
+				} );
 
 				scene.add( model );
 
 				mixer = new THREE.AnimationMixer( model );
-				mixer.clipAction( model.animations[ 0 ] ).play();
+				mixer.clipAction( gltf.animations[ 0 ] ).play();
 
 				animate();
 
+			}, undefined, function ( e ) {
+
+				console.error( e );
+
 			} );
 
 
@@ -96,7 +136,9 @@
 
 				requestAnimationFrame( animate );
 
-				mixer.update( clock.getDelta() );
+				var delta = clock.getDelta();
+				mixer.update( delta );
+				controls.update( delta );
 
 				stats.update();
 

+ 0 - 157
examples/webgl_animation_scene.html

@@ -1,157 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-	<head>
-		<title>three.js webgl - scene animation</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 {
-				color: #000;
-				font-family:Monospace;
-				font-size:13px;
-				text-align:center;
-
-				background-color: #fff;
-				margin: 0px;
-				overflow: hidden;
-			}
-
-			#info {
-				position: absolute;
-				top: 0px; width: 100%;
-				padding: 5px;
-			}
-
-			a {
-				color: #0af;
-			}
-		</style>
-	</head>
-
-	<body>
-
-		<div id="container"></div>
-
-		<div id="info">
-		<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - scene animation - <a href="https://clara.io/view/96106133-2e99-40cf-8abd-64defd153e61">Three Gears Scene</a> courtesy of David Sarno
-		<br><br>camera orbit/zoom/pan with left/middle/right mouse button</div>
-
-		<script src="../build/three.js"></script>
-		<script src="js/controls/OrbitControls.js"></script>
-
-		<script src="js/Detector.js"></script>
-		<script src="js/libs/stats.min.js"></script>
-
-		<script>
-
-			var scene, camera, controls, stats;
-			var renderer, mixer;
-
-			var clock = new THREE.Clock();
-			var url = 'models/json/scene-animation.json';
-
-			var SCREEN_WIDTH = window.innerWidth;
-			var SCREEN_HEIGHT = window.innerHeight;
-
-			var container = document.getElementById( 'container' );
-
-
-			stats = new Stats();
-			container.appendChild( stats.dom );
-
-			renderer = new THREE.WebGLRenderer( { antialias: true } );
-			renderer.setPixelRatio( window.devicePixelRatio );
-			renderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
-			container.appendChild( renderer.domElement );
-
-
-			// Load a scene with objects, lights and camera from a JSON file
-
-			new THREE.ObjectLoader().load( url, function ( loadedScene ) {
-
-				scene = loadedScene;
-				scene.background = new THREE.Color( 0xffffff );
-
-				// If the loaded file contains a perspective camera, use it with adjusted aspect ratio...
-
-				scene.traverse( function ( sceneChild ) {
-
-					if ( sceneChild.type === 'PerspectiveCamera' ) {
-
-						camera = sceneChild;
-						camera.aspect = SCREEN_WIDTH / SCREEN_HEIGHT;
-						camera.updateProjectionMatrix();
-
-					}
-
-				} );
-
-				// ... else create a new camera and use it in the loaded scene
-
-				if ( camera === undefined ) {
-
-					camera = new THREE.PerspectiveCamera( 30, SCREEN_WIDTH / SCREEN_HEIGHT, 1, 10000 );
-					camera.position.set( - 200, 0, 200 );
-
-				}
-
-				controls = new THREE.OrbitControls( camera );
-
-				// Ground plane and fog: examples for applying additional children and new property values to the loaded scene
-
-				var geometry = new THREE.PlaneBufferGeometry( 20000, 20000 );
-				var material = new THREE.MeshPhongMaterial( { shininess: 0.1 } );
-				var ground = new THREE.Mesh( geometry, material );
-
-				ground.position.set( 0, - 250, 0 );
-				ground.rotation.x = - Math.PI / 2;
-
-				scene.add( ground );
-
-				scene.fog = new THREE.Fog( 0xffffff, 1000, 10000 );
-
-				// Initialization of the loaded animations
-
-				var animationClip = scene.animations[ 0 ];
-				mixer = new THREE.AnimationMixer( scene );
-				mixer.clipAction( animationClip ).play();
-
-				animate();
-
-			} );
-
-
-			window.onresize = function () {
-
-				camera.aspect = window.innerWidth / window.innerHeight;
-				camera.updateProjectionMatrix();
-
-				renderer.setSize( window.innerWidth, window.innerHeight );
-
-			};
-
-
-			function animate() {
-
-				requestAnimationFrame( animate );
-				render();
-
-			}
-
-
-			function render() {
-
-				var delta = 0.75 * clock.getDelta();
-
-				mixer.update( delta );
-				stats.update();
-
-				renderer.render( scene, camera );
-
-			}
-
-
-		</script>
-
-	</body>
-</html>

部分文件因文件數量過多而無法顯示