ソースを参照

some modification for r74 dev.

takahiro 9 年 前
コミット
baddf04607

+ 33 - 0
examples/js/animation/CCDIKSolver.js

@@ -22,6 +22,14 @@ THREE.CCDIKSolver = function ( mesh ) {
 
 
 	this.mesh = mesh;
 	this.mesh = mesh;
 
 
+	var bones = mesh.skeleton.bones;
+	this.orgBones = [];
+	for ( var i = 0; i < bones.length; i++ ) {
+
+		this.orgBones.push( bones[ i ].clone() );
+
+	}
+
 };
 };
 
 
 THREE.CCDIKSolver.prototype = {
 THREE.CCDIKSolver.prototype = {
@@ -133,5 +141,30 @@ THREE.CCDIKSolver.prototype = {
 
 
 	},
 	},
 
 
+	resetLinks: function () {
+
+		var bones = this.mesh.skeleton.bones;
+		var iks = this.mesh.geometry.iks;
+
+		for ( var i = 0, il = iks.length; i < il; i++ ) {
+
+			var ik = iks[ i ];
+			var links = ik.links;
+
+			for ( var j = 0; j < links.length; j++ ) {
+
+				var link = links[ j ];
+				var index = link.index;
+				var b = bones[ index ];
+				var b2 = this.orgBones[ index ];
+				//b.position.copy( b2.position );
+				b.quaternion.copy( b2.quaternion );
+
+			}
+
+		}
+
+	}
+
 };
 };
 
 

+ 13 - 2
examples/js/loaders/MMDLoader.js

@@ -1653,8 +1653,19 @@ THREE.MMDLoader.prototype.createMesh = function ( model, vmd, texturePath, onPro
 
 
 		for ( var i = 1; i < orderedMorphs.length; i++ ) {
 		for ( var i = 1; i < orderedMorphs.length; i++ ) {
 
 
-			var h = morphAnimation.hierarchy[ i ];
-			tracks.push( new THREE.NumberKeyframeTrack( '.morphTargetInfluences[' + i + ']', h.keys ) );
+			var keys = morphAnimation.hierarchy[ i ].keys;
+			var times = [];
+			var values = [];
+
+			for ( var j = 0; j < keys.length; j++ ) {
+
+				var key = keys[ j ];
+				times.push( key.time );
+				values.push( key.value );
+
+			}
+
+			tracks.push( new THREE.NumberKeyframeTrack( '.morphTargetInfluences[' + i + ']', times, values ) );
 
 
 		}
 		}
 
 

+ 12 - 8
examples/webgl_loader_mmd.html

@@ -100,8 +100,8 @@
 					scene.add( mesh );
 					scene.add( mesh );
 
 
 					mixer = new THREE.AnimationMixer( mesh );
 					mixer = new THREE.AnimationMixer( mesh );
-					mixer.addAction( new THREE.AnimationAction( mesh.geometry.animations[ 0 ] ) );
-					mixer.addAction( new THREE.AnimationAction( mesh.geometry.morphAnimations[ 0 ] ) ) ;
+					mixer.clipAction( mesh.geometry.animations[ 0 ] ).play();
+					mixer.clipAction( mesh.geometry.morphAnimations[ 0 ] ).play();
 
 
 					ikSolver = new THREE.CCDIKSolver( mesh );
 					ikSolver = new THREE.CCDIKSolver( mesh );
 
 
@@ -162,12 +162,16 @@
 
 
 					mixer.update( clock.getDelta() );
 					mixer.update( clock.getDelta() );
 
 
-					// this may should be in THREE.AnimationMixer or somewhere
-					if( ikSolver ) {
-
-						ikSolver.update();
-
-					}
+					/* Note: ikSolver.resetLinks() is workaround for r74dev.
+					 *       THREE.PropertyMixer.apply() seems to have buffer cache
+					 *       when mixer.update() is called.
+					 *       ikSolver.update() change bone position/quaternion
+					 *       without mixer.update() then buffer cache will be inconsistent.
+					 *       ikSolver.resetLinks() explicitly resets IK link bones quaternion and
+					 *       tries to avoid issues caused by this inconsistent.
+					 */
+					ikSolver.resetLinks();
+					ikSolver.update();
 
 
 				}
 				}