pose( mesh, vpd, params = {} ) {

			if ( params.resetPose !== false ) mesh.pose();
			const bones = mesh.skeleton.bones;
			const boneParams = vpd.bones;
			const boneNameDictionary = {};

			for ( let i = 0, il = bones.length; i < il; i ++ ) {

				boneNameDictionary[ bones[ i ].name ] = i;

			}

			const vector = new THREE.Vector3();
			const quaternion = new THREE.Quaternion();

			for ( let i = 0, il = boneParams.length; i < il; i ++ ) {

				const boneParam = boneParams[ i ];
				const boneIndex = boneNameDictionary[ boneParam.name ];
				if ( boneIndex === undefined ) continue;
				const bone = bones[ boneIndex ];
				bone.position.add( vector.fromArray( boneParam.translation ) );
				bone.quaternion.multiply( quaternion.fromArray( boneParam.quaternion ) );

			}

			mesh.updateMatrixWorld( true ); // PMX animation system special path

			if ( this.configuration.pmxAnimation && mesh.geometry.userData.MMD && mesh.geometry.userData.MMD.format === 'pmx' ) {

				const sortedBonesData = this._sortBoneDataArray( mesh.geometry.userData.MMD.bones.slice() );

				const ikSolver = params.ik !== false ? this._createCCDIKSolver( mesh ) : null;
				const grantSolver = params.grant !== false ? this.createGrantSolver( mesh ) : null;

				this._animatePMXMesh( mesh, sortedBonesData, ikSolver, grantSolver );

			} else {

				if ( params.ik !== false ) {

					this._createCCDIKSolver( mesh ).update();

				}

				if ( params.grant !== false ) {

					this.createGrantSolver( mesh ).update();

				}

			}

			return this;

		}
Changes the pose of SkinnedMesh as VPD specifies.

@param {THREE.SkinnedMesh} mesh
@param {Object} vpd - VPD content parsed MMDParser
@param {Object} params - (optional)
@param {boolean} params.resetPose - Default is true.
@param {boolean} params.ik - Default is true.
@param {boolean} params.grant - Default is true.
@return {MMDAnimationHelper}