diff --git a/examples/js/loaders/MMDLoader.js b/examples/js/loaders/MMDLoader.js index 1cdf401dae6cf2dd0fcf393b4339871b2ffcf04f..91dc626c1b53bc0b54be58ce1813ca03a3c10f00 100644 --- a/examples/js/loaders/MMDLoader.js +++ b/examples/js/loaders/MMDLoader.js @@ -354,7 +354,15 @@ THREE.MMDLoader.prototype.pourVmdIntoCamera = function ( camera, vmd, name ) { } - return new THREE.MMDLoader[ type ]( node, times, values, interpolations ); + var track = new THREE[ type ]( node, times, values ); + + track.createInterpolant = function InterpolantFactoryMethodCubicBezier( result ) { + + return new THREE.MMDLoader.CubicBezierInterpolation( this.times, this.values, this.getValueSize(), result, new Float32Array( interpolations ) ); + + }; + + return track; }; @@ -378,16 +386,6 @@ THREE.MMDLoader.prototype.pourVmdIntoCamera = function ( camera, vmd, name ) { position.add( center ); position.applyQuaternion( quaternion ); - /* - * Note: This is a workaround not to make Animation system calculate lerp - * if the diff from the last frame is 1 frame (in 30fps). - */ - if ( times.length > 0 && time < times[ times.length - 1 ] + ( 1 / 30 ) * 1.5 ) { - - times[ times.length - 1 ] = time - 1e-13; - - } - times.push( time ); pushVector3( centers, center ); @@ -419,10 +417,10 @@ THREE.MMDLoader.prototype.pourVmdIntoCamera = function ( camera, vmd, name ) { var tracks = []; - tracks.push( createTrack( '.center', 'VectorKeyframeTrackEx', times, centers, cInterpolations ) ); - tracks.push( createTrack( '.quaternion', 'QuaternionKeyframeTrackEx', times, quaternions, qInterpolations ) ); - tracks.push( createTrack( '.position', 'VectorKeyframeTrackEx', times, positions, pInterpolations ) ); - tracks.push( createTrack( '.fov', 'NumberKeyframeTrackEx', times, fovs, fInterpolations ) ); + tracks.push( createTrack( '.center', 'VectorKeyframeTrack', times, centers, cInterpolations ) ); + tracks.push( createTrack( '.quaternion', 'QuaternionKeyframeTrack', times, quaternions, qInterpolations ) ); + tracks.push( createTrack( '.position', 'VectorKeyframeTrack', times, positions, pInterpolations ) ); + tracks.push( createTrack( '.fov', 'NumberKeyframeTrack', times, fovs, fInterpolations ) ); var clip = new THREE.AnimationClip( name === undefined ? THREE.Math.generateUUID() : name, - 1, tracks ); @@ -1528,6 +1526,20 @@ THREE.MMDLoader.prototype.createAnimation = function ( mesh, vmd, name ) { }; + var createTrack = function ( node, type, times, values, interpolations ) { + + var track = new THREE[ type ]( node, times, values ); + + track.createInterpolant = function InterpolantFactoryMethodCubicBezier( result ) { + + return new THREE.MMDLoader.CubicBezierInterpolation( this.times, this.values, this.getValueSize(), result, new Float32Array( interpolations ) ); + + }; + + return track; + + }; + for ( var i = 0; i < orderedMotions.length; i ++ ) { var times = []; @@ -1574,8 +1586,8 @@ THREE.MMDLoader.prototype.createAnimation = function ( mesh, vmd, name ) { var boneName = '.bones[' + bone.name + ']'; - tracks.push( new THREE.MMDLoader.VectorKeyframeTrackEx( boneName + '.position', times, positions, pInterpolations ) ); - tracks.push( new THREE.MMDLoader.QuaternionKeyframeTrackEx( boneName + '.quaternion', times, rotations, rInterpolations ) ); + tracks.push( createTrack( boneName + '.position', 'VectorKeyframeTrack', times, positions, pInterpolations ) ); + tracks.push( createTrack( boneName + '.quaternion', 'QuaternionKeyframeTrack', times, rotations, rInterpolations ) ); } @@ -1759,83 +1771,6 @@ THREE.MMDLoader.DataCreationHelper.prototype = { }; -/* - * extends existing KeyframeTrack for bone and camera animation. - * - use Float64Array for times - * - use Cubic Bezier curves interpolation - */ -THREE.MMDLoader.VectorKeyframeTrackEx = function ( name, times, values, interpolationParameterArray ) { - - this.interpolationParameters = new Float32Array( interpolationParameterArray ); - - THREE.VectorKeyframeTrack.call( this, name, times, values ); - -}; - -THREE.MMDLoader.VectorKeyframeTrackEx.prototype = Object.create( THREE.VectorKeyframeTrack.prototype ); -THREE.MMDLoader.VectorKeyframeTrackEx.prototype.constructor = THREE.MMDLoader.VectorKeyframeTrackEx; -THREE.MMDLoader.VectorKeyframeTrackEx.prototype.TimeBufferType = Float64Array; - -THREE.MMDLoader.VectorKeyframeTrackEx.prototype.InterpolantFactoryMethodCubicBezier = function ( result ) { - - return new THREE.MMDLoader.CubicBezierInterpolation( this.times, this.values, this.getValueSize(), result, this.interpolationParameters ); - -}; - -THREE.MMDLoader.VectorKeyframeTrackEx.prototype.setInterpolation = function ( interpolation ) { - - this.createInterpolant = this.InterpolantFactoryMethodCubicBezier; - -}; - -THREE.MMDLoader.QuaternionKeyframeTrackEx = function ( name, times, values, interpolationParameterArray ) { - - this.interpolationParameters = new Float32Array( interpolationParameterArray ); - - THREE.QuaternionKeyframeTrack.call( this, name, times, values ); - -}; - -THREE.MMDLoader.QuaternionKeyframeTrackEx.prototype = Object.create( THREE.QuaternionKeyframeTrack.prototype ); -THREE.MMDLoader.QuaternionKeyframeTrackEx.prototype.constructor = THREE.MMDLoader.QuaternionKeyframeTrackEx; -THREE.MMDLoader.QuaternionKeyframeTrackEx.prototype.TimeBufferType = Float64Array; - -THREE.MMDLoader.QuaternionKeyframeTrackEx.prototype.InterpolantFactoryMethodCubicBezier = function ( result ) { - - return new THREE.MMDLoader.CubicBezierInterpolation( this.times, this.values, this.getValueSize(), result, this.interpolationParameters ); - -}; - -THREE.MMDLoader.QuaternionKeyframeTrackEx.prototype.setInterpolation = function ( interpolation ) { - - this.createInterpolant = this.InterpolantFactoryMethodCubicBezier; - -}; - -THREE.MMDLoader.NumberKeyframeTrackEx = function ( name, times, values, interpolationParameterArray ) { - - this.interpolationParameters = new Float32Array( interpolationParameterArray ); - - THREE.NumberKeyframeTrack.call( this, name, times, values ); - -}; - -THREE.MMDLoader.NumberKeyframeTrackEx.prototype = Object.create( THREE.NumberKeyframeTrack.prototype ); -THREE.MMDLoader.NumberKeyframeTrackEx.prototype.constructor = THREE.MMDLoader.NumberKeyframeTrackEx; -THREE.MMDLoader.NumberKeyframeTrackEx.prototype.TimeBufferType = Float64Array; - -THREE.MMDLoader.NumberKeyframeTrackEx.prototype.InterpolantFactoryMethodCubicBezier = function ( result ) { - - return new THREE.MMDLoader.CubicBezierInterpolation( this.times, this.values, this.getValueSize(), result, this.interpolationParameters ); - -}; - -THREE.MMDLoader.NumberKeyframeTrackEx.prototype.setInterpolation = function ( interpolation ) { - - this.createInterpolant = this.InterpolantFactoryMethodCubicBezier; - -}; - THREE.MMDLoader.CubicBezierInterpolation = function ( parameterPositions, sampleValues, sampleSize, resultBuffer, params ) { THREE.Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); @@ -1856,7 +1791,8 @@ THREE.MMDLoader.CubicBezierInterpolation.prototype.interpolate_ = function ( i1, var offset1 = i1 * stride; var offset0 = offset1 - stride; - var weight1 = ( t - t0 ) / ( t1 - t0 ); + // No interpolation if next key frame is in one frame in 30fps. This is from MMD animation spec. + var weight1 = ( ( t1 - t0 ) < 1 / 30 * 1.5 ) ? 0.0 : ( t - t0 ) / ( t1 - t0 ); if ( stride === 4 ) { // Quaternion