1 line
40 KiB
Plaintext
1 line
40 KiB
Plaintext
|
|
{"version":3,"file":"MMDAnimationHelper.cjs","sources":["../../src/animation/MMDAnimationHelper.js"],"sourcesContent":["import { AnimationMixer, Object3D, Quaternion, Vector3 } from 'three'\nimport { CCDIKSolver } from '../animation/CCDIKSolver'\nimport { MMDPhysics } from '../animation/MMDPhysics'\n\n/**\n * MMDAnimationHelper handles animation of MMD assets loaded by MMDLoader\n * with MMD special features as IK, Grant, and Physics.\n *\n * Dependencies\n * - ammo.js https://github.com/kripken/ammo.js\n * - MMDPhysics\n * - CCDIKSolver\n *\n * TODO\n * - more precise grant skinning support.\n */\nclass MMDAnimationHelper {\n /**\n * @param {Object} params - (optional)\n * @param {boolean} params.sync - Whether animation durations of added objects are synched. Default is true.\n * @param {Number} params.afterglow - Default is 0.0.\n * @param {boolean} params.resetPhysicsOnLoop - Default is true.\n */\n constructor(params = {}) {\n this.meshes = []\n\n this.camera = null\n this.cameraTarget = new Object3D()\n this.cameraTarget.name = 'target'\n\n this.audio = null\n this.audioManager = null\n\n this.objects = new WeakMap()\n\n this.configuration = {\n sync: params.sync !== undefined ? params.sync : true,\n afterglow: params.afterglow !== undefined ? params.afterglow : 0.0,\n resetPhysicsOnLoop: params.resetPhysicsOnLoop !== undefined ? params.resetPhysicsOnLoop : true,\n pmxAnimation: params.pmxAnimation !== undefined ? params.pmxAnimation : false,\n }\n\n this.enabled = {\n animation: true,\n ik: true,\n grant: true,\n physics: true,\n cameraAnimation: true,\n }\n\n this.onBeforePhysics = function (/* mesh */) {}\n\n // experimental\n this.sharedPhysics = false\n this.masterPhysics = null\n }\n\n /**\n * Adds an Three.js Object to helper and setups animation.\n * The anmation durations of added objects are synched\n * if this.configuration.sync is true.\n *\n * @param {THREE.SkinnedMesh|THREE.Camera|THREE.Audio} object\n * @param {Object} params - (optional)\n * @param {THREE.AnimationClip|Array<THREE.AnimationClip>} params.animation - Only for THREE.SkinnedMesh and THREE.Camera. Default is undefined.\n * @param {boolean} params.physics - Only for THREE.SkinnedMesh. Default is true.\n * @param {Integer} params.warmup - Only for THREE.SkinnedMesh and physics is true. Default is 60.\n * @param {Number} params.unitStep - Only for THREE.SkinnedMesh and physics is true. Default is 1 / 65.\n * @param {Integer} params.maxStepNum - Only for THREE.SkinnedMesh and physics is true. Default is 3.\n * @param {Vector3} params.gravity - Only for THREE.SkinnedMesh and physics is true. Default ( 0, - 9.8 * 10, 0 ).\n * @param {Number} params.delayTime - Only for THREE.Audio. Default is 0.0.\n * @return {MMDAnimationHelper}\n */\n add(object, params = {}) {\n if (object.isSkinnedMesh) {\n this._addMesh(object, params)\n } else if (object.isCamera) {\n this._setupCamera(object, params)\n } else if (object.type === 'Audio') {\n this._setupAudio(object, params)\n } else {\n throw new Error(\n 'THREE.MMDAnimationHelper.add: ' +\n 'accepts only ' +\n 'THREE.SkinnedMesh or ' +\n 'THREE.Camera or ' +\n 'THREE.Audio instance.',\n )\n }\n\n if (this.configuration.sync) this._syncDuration()\n\n return this\n }\n\n /**\n * Removes an Three.js Object from helper.\n *\n * @param {THREE.SkinnedMesh|THREE.Camera|THREE.Audio} object\n * @return {MMDAnimationHelper}\n */\n remove(object) {\n if (object.isSkinnedMesh) {\n this._removeMesh(object)\n } else if (object.isCamera) {\n this._clearCamera(object)\n } else if (object.type === 'Audio') {\n this._clearAudio(object)\n } else {\n throw new Error(\n 'THREE.MMDAnimationHelper.remove: ' +\n 'accepts only ' +\n 'THREE.SkinnedMesh or ' +\n 'THREE.Camera or ' +\n 'THREE.Audio instance.',\n )
|