webgl_loader_mmd.html 5.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
<!DOCTYPE html>
<html lang="en">
	<head>
		<title>three.js webgl - loaders - MMD loader</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 {
				font-family: Monospace;
				background-color: #fff;
				color: #000;
				margin: 0px;
				overflow: hidden;
			}
			#info {
				color: #000;
				position: absolute;
				top: 10px;
				width: 100%;
				text-align: center;
				z-index: 100;
				display:block;
			}
			#info a, .button { color: #f00; font-weight: bold; text-decoration: underline; cursor: pointer }
		</style>
	</head>

	<body>
		<div id="info">
		<a href="http://threejs.org" target="_blank">three.js</a> - MMDLoader test<br />
		Copyright
T
takahiro 已提交
32 33
		<a href="http://www.geocities.jp/higuchuu4/index_e.htm" target="_blank">Model Data</a>
		<a href="http://www.nicovideo.jp/watch/sm13147122" target="_blank">Dance Data</a>
34 35
		</div>

W
WestLangley 已提交
36
		<script src="../build/three.js"></script>
37 38

		<script src="js/libs/charsetencoder.min.js"></script>
T
takahiro 已提交
39
		<script src="js/libs/ammo.js"></script>
T
takahiro 已提交
40
		<script src="js/loaders/TGALoader.js"></script>
41 42
		<script src="js/loaders/MMDLoader.js"></script>
		<script src="js/animation/CCDIKSolver.js"></script>
T
takahiro 已提交
43
		<script src="js/animation/MMDPhysics.js"></script>
44 45 46 47 48 49 50 51

		<script src="js/Detector.js"></script>
		<script src="js/libs/stats.min.js"></script>

		<script>

			var container, stats;

T
takahiro 已提交
52 53
			var mesh, camera, scene, renderer;
			var helper;
54

T
takahiro 已提交
55
			var mouseX = 0, mouseY = 0;
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

			var windowHalfX = window.innerWidth / 2;
			var windowHalfY = window.innerHeight / 2;

			var clock = new THREE.Clock();

			init();
			animate();

			function init() {

				container = document.createElement( 'div' );
				document.body.appendChild( container );

				camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 2000 );
				camera.position.z = 25;

				// scene

				scene = new THREE.Scene();

T
takahiro 已提交
77
				var ambient = new THREE.AmbientLight( 0x666666 );
78 79
				scene.add( ambient );

T
takahiro 已提交
80
				var directionalLight = new THREE.DirectionalLight( 0x887766 );
81 82 83
				directionalLight.position.set( -1, 1, 1 ).normalize();
				scene.add( directionalLight );

T
takahiro 已提交
84 85
				//

86
				renderer = new THREE.WebGLRenderer( { antialias: true } );
T
takahiro 已提交
87 88 89 90 91
				renderer.setPixelRatio( window.devicePixelRatio );
				renderer.setSize( window.innerWidth, window.innerHeight );
				renderer.setClearColor( new THREE.Color( 0xffffff ) );
				container.appendChild( renderer.domElement );

92 93 94 95 96 97 98 99 100 101 102 103
				// model

				var onProgress = function ( xhr ) {
					if ( xhr.lengthComputable ) {
						var percentComplete = xhr.loaded / xhr.total * 100;
						console.log( Math.round(percentComplete, 2) + '% downloaded' );
					}
				};

				var onError = function ( xhr ) {
				};

T
takahiro 已提交
104 105 106 107 108
				var modelFile = 'models/mmd/miku/miku_v2.pmd';
				var vmdFiles = [ 'models/mmd/vmd/wavefile_v2.vmd' ];

				helper = new THREE.MMDHelper( renderer );

109
				var loader = new THREE.MMDLoader();
T
takahiro 已提交
110 111 112
				loader.setDefaultTexturePath( './models/mmd/default/' );

				loader.load( modelFile, vmdFiles, function ( object ) {
113 114 115 116

					mesh = object;
					mesh.position.y = -10;

T
takahiro 已提交
117 118
					helper.add( mesh );
					helper.setAnimation( mesh );
119

T
takahiro 已提交
120 121 122 123 124 125 126
					/*
					 * Note: You must set Physics
					 *       before you add mesh to scene or any other 3D object.
					 * Note: Physics calculation is pretty heavy.
					 *       It may not be acceptable for most mobile devices yet.
			 		 */
					if ( ! isMobileDevice() ) {
T
takahiro 已提交
127

T
takahiro 已提交
128
						helper.setPhysics( mesh );
T
takahiro 已提交
129

T
takahiro 已提交
130
					}
131

132
					helper.unifyAnimationDuration( { afterglow: 2.0 } );
133

T
takahiro 已提交
134
					scene.add( mesh );
135

T
takahiro 已提交
136
				}, onProgress, onError );
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180

				document.addEventListener( 'mousemove', onDocumentMouseMove, false );

				//

				window.addEventListener( 'resize', onWindowResize, false );

			}

			function onWindowResize() {

				windowHalfX = window.innerWidth / 2;
				windowHalfY = window.innerHeight / 2;

				camera.aspect = window.innerWidth / window.innerHeight;
				camera.updateProjectionMatrix();

				renderer.setSize( window.innerWidth, window.innerHeight );

			}

			function onDocumentMouseMove( event ) {

				mouseX = ( event.clientX - windowHalfX ) / 2;
				mouseY = ( event.clientY - windowHalfY ) / 2;

			}

			//

			function animate() {

				requestAnimationFrame( animate );
				render();

			}

			function render() {

				camera.position.x += ( - mouseX - camera.position.x ) * .05;
				camera.position.y += ( - mouseY - camera.position.y ) * .05;

				camera.lookAt( scene.position );

T
takahiro 已提交
181 182
				if ( mesh ) {

T
takahiro 已提交
183 184
					helper.animate( clock.getDelta() );
					helper.render( scene, camera );
T
takahiro 已提交
185

T
takahiro 已提交
186
				} else {
T
takahiro 已提交
187

T
takahiro 已提交
188 189
					renderer.clear();
					renderer.render( scene, camera );
T
takahiro 已提交
190 191 192 193 194

				}

			}

T
takahiro 已提交
195 196
			// easy mobile device detection
			function isMobileDevice () {
T
takahiro 已提交
197

T
takahiro 已提交
198
				if ( navigator === undefined || navigator.userAgent === undefined ) {
T
takahiro 已提交
199

T
takahiro 已提交
200
					return true;
T
takahiro 已提交
201 202 203

				}

T
takahiro 已提交
204
				var s = navigator.userAgent;
T
takahiro 已提交
205

T
takahiro 已提交
206 207 208 209 210 211 212
				if (    s.match( /iPhone/i )
//				     || s.match( /iPad/i )
				     || s.match( /iPod/i )
				     || s.match( /webOS/i )
				     || s.match( /BlackBerry/i )
				     || ( s.match( /Windows/i ) && s.match( /Phone/i ) )
				     || ( s.match( /Android/i ) && s.match( /Mobile/i ) ) ) {
T
takahiro 已提交
213

T
takahiro 已提交
214
					return true;
T
takahiro 已提交
215 216 217

				}

T
takahiro 已提交
218 219
				return false;

220 221 222 223 224 225
			}

		</script>

	</body>
</html>