| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- /**
- * @author mikael emtinger / http://gomo.se/
- * @author alteredq / http://alteredqualia.com/
- * @author ikerr / http://verold.com
- */
- import { Mesh } from './Mesh.js';
- import { Matrix4 } from '../math/Matrix4.js';
- import { Vector4 } from '../math/Vector4.js';
- function SkinnedMesh( geometry, material ) {
- if ( geometry && geometry.isGeometry ) {
- console.error( 'THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );
- }
- Mesh.call( this, geometry, material );
- this.type = 'SkinnedMesh';
- this.bindMode = 'attached';
- this.bindMatrix = new Matrix4();
- this.bindMatrixInverse = new Matrix4();
- }
- SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {
- constructor: SkinnedMesh,
- isSkinnedMesh: true,
- bind: function ( skeleton, bindMatrix ) {
- this.skeleton = skeleton;
- if ( bindMatrix === undefined ) {
- this.updateMatrixWorld( true );
- this.skeleton.calculateInverses();
- bindMatrix = this.matrixWorld;
- }
- this.bindMatrix.copy( bindMatrix );
- this.bindMatrixInverse.getInverse( bindMatrix );
- },
- pose: function () {
- this.skeleton.pose();
- },
- normalizeSkinWeights: function () {
- var vector = new Vector4();
- var skinWeight = this.geometry.attributes.skinWeight;
- for ( var i = 0, l = skinWeight.count; i < l; i ++ ) {
- vector.x = skinWeight.getX( i );
- vector.y = skinWeight.getY( i );
- vector.z = skinWeight.getZ( i );
- vector.w = skinWeight.getW( i );
- var scale = 1.0 / vector.manhattanLength();
- if ( scale !== Infinity ) {
- vector.multiplyScalar( scale );
- } else {
- vector.set( 1, 0, 0, 0 ); // do something reasonable
- }
- skinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );
- }
- },
- updateMatrixWorld: function ( force ) {
- Mesh.prototype.updateMatrixWorld.call( this, force );
- if ( this.bindMode === 'attached' ) {
- this.bindMatrixInverse.getInverse( this.matrixWorld );
- } else if ( this.bindMode === 'detached' ) {
- this.bindMatrixInverse.getInverse( this.bindMatrix );
- } else {
- console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );
- }
- },
- clone: function () {
- return new this.constructor( this.geometry, this.material ).copy( this );
- }
- } );
- export { SkinnedMesh };
|