MDDLoader.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. ( function () {
  2. /**
  3. * MDD is a special format that stores a position for every vertex in a model for every frame in an animation.
  4. * Similar to BVH, it can be used to transfer animation data between different 3D applications or engines.
  5. *
  6. * MDD stores its data in binary format (big endian) in the following way:
  7. *
  8. * number of frames (a single uint32)
  9. * number of vertices (a single uint32)
  10. * time values for each frame (sequence of float32)
  11. * vertex data for each frame (sequence of float32)
  12. */
  13. var MDDLoader = function ( manager ) {
  14. THREE.Loader.call( this, manager );
  15. };
  16. MDDLoader.prototype = Object.assign( Object.create( THREE.Loader.prototype ), {
  17. constructor: MDDLoader,
  18. load: function ( url, onLoad, onProgress, onError ) {
  19. var scope = this;
  20. var loader = new THREE.FileLoader( this.manager );
  21. loader.setPath( this.path );
  22. loader.setResponseType( 'arraybuffer' );
  23. loader.load( url, function ( data ) {
  24. onLoad( scope.parse( data ) );
  25. }, onProgress, onError );
  26. },
  27. parse: function ( data ) {
  28. var view = new DataView( data );
  29. var totalFrames = view.getUint32( 0 );
  30. var totalPoints = view.getUint32( 4 );
  31. var offset = 8; // animation clip
  32. var times = new Float32Array( totalFrames );
  33. var values = new Float32Array( totalFrames * totalFrames ).fill( 0 );
  34. for ( var i = 0; i < totalFrames; i ++ ) {
  35. times[ i ] = view.getFloat32( offset );
  36. offset += 4;
  37. values[ totalFrames * i + i ] = 1;
  38. }
  39. var track = new THREE.NumberKeyframeTrack( '.morphTargetInfluences', times, values );
  40. var clip = new THREE.AnimationClip( 'default', times[ times.length - 1 ], [ track ] ); // morph targets
  41. var morphTargets = [];
  42. for ( var i = 0; i < totalFrames; i ++ ) {
  43. var morphTarget = new Float32Array( totalPoints * 3 );
  44. for ( var j = 0; j < totalPoints; j ++ ) {
  45. var stride = j * 3;
  46. morphTarget[ stride + 0 ] = view.getFloat32( offset );
  47. offset += 4; // x
  48. morphTarget[ stride + 1 ] = view.getFloat32( offset );
  49. offset += 4; // y
  50. morphTarget[ stride + 2 ] = view.getFloat32( offset );
  51. offset += 4; // z
  52. }
  53. var attribute = new THREE.BufferAttribute( morphTarget, 3 );
  54. attribute.name = 'morph_' + i;
  55. morphTargets.push( attribute );
  56. }
  57. return {
  58. morphTargets: morphTargets,
  59. clip: clip
  60. };
  61. }
  62. } );
  63. THREE.MDDLoader = MDDLoader;
  64. } )();