webgl_animation_skinning_blending.html 6.2 KB
Newer Older
1 2
<!DOCTYPE html>
<html lang="en">
M
Mr.doob 已提交
3 4 5 6 7 8 9 10 11 12
	<head>
		<title>three.js webgl - animation - skinning</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;
13

M
Mr.doob 已提交
14 15 16 17
				background-color: #fff;
				margin: 0px;
				overflow: hidden;
			}
18

M
Mr.doob 已提交
19 20 21 22 23 24 25 26 27 28 29 30 31 32
			#info {
				position: absolute;
				top: 0px; width: 100%;
				padding: 5px;
			}
		</style>
	</head>
	<body>
		<div id="container"></div>
		<div id="info">
			<a href="http://threejs.org" target="_blank">three.js</a> - Skeletal Animation Blending
			<br><br> Adjust blend weights to affect the animations that are currently playing.
			<br> Cross fades (and warping) blend between 2 animations and end with a single animation.
		</div>
33

M
Mr.doob 已提交
34
		<script src="../build/three.min.js"></script>
35

M
Mr.doob 已提交
36 37
		<script src="js/Detector.js"></script>
		<script src="js/libs/stats.min.js"></script>
38
		<script src="js/controls/OrbitControls.js"></script>
M
Mr.doob 已提交
39 40 41
		<script src="js/BlendCharacter.js"></script>
		<script src="js/BlendCharacterGui.js"></script>
		<script src="js/libs/dat.gui.min.js"></script>
42

M
Mr.doob 已提交
43
		<script>
44

M
Mr.doob 已提交
45
			if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
46

M
Mr.doob 已提交
47
			var container, stats;
48

M
Mr.doob 已提交
49
			var blendMesh, camera, scene, renderer, controls;
50

M
Mr.doob 已提交
51 52
			var clock = new THREE.Clock();
			var gui = null;
53

M
Mr.doob 已提交
54 55
			var isFrameStepping = false;
			var timeToStep = 0;
56

M
Mr.doob 已提交
57
			init();
58

M
Mr.doob 已提交
59
			function init() {
60

M
Mr.doob 已提交
61
				container = document.getElementById( 'container' );
62

M
Mr.doob 已提交
63 64
				scene = new THREE.Scene();
				scene.add ( new THREE.AmbientLight( 0xaaaaaa ) );
65

M
Mr.doob 已提交
66 67 68
				var light = new THREE.DirectionalLight( 0xffffff, 1.5 );
				light.position = new THREE.Vector3( 0, 0, 1000.0 );
				scene.add( light );
69

M
Mr.doob 已提交
70 71 72 73
				renderer = new THREE.WebGLRenderer( { antialias: true, alpha: false } );
				renderer.setClearColor( '#777777', 1 );
				renderer.setSize( window.innerWidth, window.innerHeight );
				renderer.autoClear = true;
74

M
Mr.doob 已提交
75
				container.appendChild( renderer.domElement );
76

M
Mr.doob 已提交
77
				//
78

M
Mr.doob 已提交
79 80 81 82
				stats = new Stats();
				stats.domElement.style.position = 'absolute';
				stats.domElement.style.top = '0px';
				container.appendChild( stats.domElement );
83

M
Mr.doob 已提交
84
				//
85

M
Mr.doob 已提交
86
				window.addEventListener( 'resize', onWindowResize, false );
87

M
Mr.doob 已提交
88 89 90 91 92 93 94 95 96
				// listen for messages from the gui
				window.addEventListener( 'start-animation', onStartAnimation );
				window.addEventListener( 'stop-animation', onStopAnimation );
				window.addEventListener( 'pause-animation', onPauseAnimation );
				window.addEventListener( 'step-animation', onStepAnimation );
				window.addEventListener( 'weight-animation', onWeightAnimation );
				window.addEventListener( 'crossfade', onCrossfade );
				window.addEventListener( 'warp', onWarp );
				window.addEventListener( 'toggle-lock-camera', onLockCameraToggle );
97
				window.addEventListener( 'toggle-show-skeleton', onShowSkeleton );
98
				window.addEventListener( 'toggle-show-model', onShowModel );
99

M
Mr.doob 已提交
100 101
				blendMesh = new THREE.BlendCharacter();
				blendMesh.load( "models/skinned/marine/marine_anims.js", start );
102

M
Mr.doob 已提交
103
			}
104

M
Mr.doob 已提交
105
			function onWindowResize() {
106

M
Mr.doob 已提交
107 108
				camera.aspect = window.innerWidth / window.innerHeight;
				camera.updateProjectionMatrix();
109

M
Mr.doob 已提交
110
				renderer.setSize( window.innerWidth, window.innerHeight );
111

M
Mr.doob 已提交
112
			}
113

M
Mr.doob 已提交
114
			function onStartAnimation( event ) {
115

M
Mr.doob 已提交
116
				var data = event.detail;
117

M
Mr.doob 已提交
118
				blendMesh.stopAll();
119

M
Mr.doob 已提交
120 121
				// the blend mesh will combine 1 or more animations
				for ( var i = 0; i < data.anims.length; ++i ) {
122

M
Mr.doob 已提交
123
					blendMesh.play(data.anims[i], data.weights[i]);
124

M
Mr.doob 已提交
125
				}
126

M
Mr.doob 已提交
127
				isFrameStepping = false;
128

M
Mr.doob 已提交
129
			}
130

M
Mr.doob 已提交
131
			function onStopAnimation( event ) {
132

M
Mr.doob 已提交
133 134
				blendMesh.stopAll();
				isFrameStepping = false;
135

M
Mr.doob 已提交
136
			}
137

M
Mr.doob 已提交
138
			function onPauseAnimation( event ) {
139

M
Mr.doob 已提交
140
				( isFrameStepping ) ? blendMesh.unPauseAll(): blendMesh.pauseAll();
141

M
Mr.doob 已提交
142
				isFrameStepping = false;
143

M
Mr.doob 已提交
144
			}
145

M
Mr.doob 已提交
146
			function onStepAnimation( event ) {
147

M
Mr.doob 已提交
148 149 150 151
				blendMesh.unPauseAll();
				isFrameStepping = true;
				timeToStep = event.detail.stepSize;
			}
152

M
Mr.doob 已提交
153
			function onWeightAnimation(event) {
154

M
Mr.doob 已提交
155 156
				var data = event.detail;
				for ( var i = 0; i < data.anims.length; ++i ) {
157

M
Mr.doob 已提交
158
					blendMesh.applyWeight(data.anims[i], data.weights[i]);
159

M
Mr.doob 已提交
160
				}
161

M
Mr.doob 已提交
162
			}
163

M
Mr.doob 已提交
164
			function onCrossfade(event) {
165

M
Mr.doob 已提交
166
				var data = event.detail;
167

M
Mr.doob 已提交
168 169
				blendMesh.stopAll();
				blendMesh.crossfade( data.from, data.to, data.time );
170

M
Mr.doob 已提交
171
				isFrameStepping = false;
172

M
Mr.doob 已提交
173
			}
174

M
Mr.doob 已提交
175
			function onWarp( event ) {
176

M
Mr.doob 已提交
177
				var data = event.detail;
178

M
Mr.doob 已提交
179 180
				blendMesh.stopAll();
				blendMesh.warp( data.from, data.to, data.time );
181

M
Mr.doob 已提交
182
				isFrameStepping = false;
183

M
Mr.doob 已提交
184
			}
185 186


M
Mr.doob 已提交
187
			function onLockCameraToggle( event ) {
188

M
Mr.doob 已提交
189 190
				var shouldLock = event.detail.shouldLock;
				controls.enabled = !shouldLock;
191

M
Mr.doob 已提交
192
			}
193

194
			function onShowSkeleton( event ) {
195

M
Mr.doob 已提交
196
				var shouldShow = event.detail.shouldShow;
197
				blendMesh.showSkeleton( shouldShow );
198

M
Mr.doob 已提交
199
			}
200

201 202 203 204 205 206 207
			function onShowModel( event ) {

				var shouldShow = event.detail.shouldShow;
				blendMesh.showModel( shouldShow );

			}

M
Mr.doob 已提交
208
			function start() {
209

M
Mr.doob 已提交
210 211
				blendMesh.rotation.y = Math.PI * -135 / 180;
				scene.add( blendMesh );
212

M
Mr.doob 已提交
213 214
				var aspect = window.innerWidth / window.innerHeight;
				var radius = blendMesh.geometry.boundingSphere.radius;
215

M
Mr.doob 已提交
216 217
				camera = new THREE.PerspectiveCamera( 45, aspect, 1, 10000 );
				camera.position.set( 0.0, radius, radius * 3.5 );
218

M
Mr.doob 已提交
219 220 221
				controls = new THREE.OrbitControls( camera );
				controls.target = new THREE.Vector3( 0, radius, 0 );
				controls.update();
222

M
Mr.doob 已提交
223
				// Set default weights
224

M
Mr.doob 已提交
225 226 227
				blendMesh.animations[ 'idle' ].weight = 1 / 3;
				blendMesh.animations[ 'walk' ].weight = 1 / 3;
				blendMesh.animations[ 'run' ].weight = 1 / 3;
228

M
Mr.doob 已提交
229
				gui = new BlendCharacterGui(blendMesh.animations);
230

M
Mr.doob 已提交
231 232
				animate();
			}
233

M
Mr.doob 已提交
234
			function animate() {
235

M
Mr.doob 已提交
236
				requestAnimationFrame( animate, renderer.domElement );
237

M
Mr.doob 已提交
238
				// step forward in time based on whether we're stepping and scale
239

M
Mr.doob 已提交
240 241 242
				var scale = gui.getTimeScale();
				var delta = clock.getDelta();
				var stepSize = (!isFrameStepping) ? delta * scale: timeToStep;
243

M
Mr.doob 已提交
244
				// modify blend weights
245

M
Mr.doob 已提交
246 247
				blendMesh.update( stepSize );
				gui.update();
248

M
Mr.doob 已提交
249
				THREE.AnimationHandler.update( stepSize );
250

M
Mr.doob 已提交
251 252
				renderer.render( scene, camera );
				stats.update();
253

M
Mr.doob 已提交
254 255
				// if we are stepping, consume time
				// ( will equal step size next time a single step is desired )
256

M
Mr.doob 已提交
257
				timeToStep = 0;
258

M
Mr.doob 已提交
259
			}
260

M
Mr.doob 已提交
261
		</script>
262

M
Mr.doob 已提交
263
	</body>
264 265
</html>