MDDLoader.js 2.4 KB

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