123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- THREE.UCSCharacter = function() {
- var scope = this;
- var mesh;
- this.scale = 1;
- this.root = new THREE.Object3D();
- this.numSkins = undefined;
- this.numMorphs = undefined;
- this.skins = [];
- this.materials = [];
- this.morphs = [];
- this.mixer = new THREE.AnimationMixer( this.root );
- this.onLoadComplete = function () {};
- this.loadCounter = 0;
- this.loadParts = function ( config ) {
- this.numSkins = config.skins.length;
- this.numMorphs = config.morphs.length;
- // Character geometry + number of skins
- this.loadCounter = 1 + config.skins.length;
- // SKINS
- this.skins = loadTextures( config.baseUrl + "skins/", config.skins );
- this.materials = createMaterials( this.skins );
- // MORPHS
- this.morphs = config.morphs;
- // CHARACTER
- var loader = new THREE.JSONLoader();
- console.log( config.baseUrl + config.character );
- loader.load( config.baseUrl + config.character, function( geometry ) {
- geometry.computeBoundingBox();
- geometry.computeVertexNormals();
- mesh = new THREE.SkinnedMesh( geometry, new THREE.MultiMaterial() );
- mesh.name = config.character;
- scope.root.add( mesh );
- var bb = geometry.boundingBox;
- scope.root.scale.set( config.s, config.s, config.s );
- scope.root.position.set( config.x, config.y - bb.min.y * config.s, config.z );
- mesh.castShadow = true;
- mesh.receiveShadow = true;
- scope.mixer.clipAction( geometry.animations[0], mesh ).play();
- scope.setSkin( 0 );
- scope.checkLoadComplete();
- } );
- };
- this.setSkin = function( index ) {
- if ( mesh && scope.materials ) {
- mesh.material = scope.materials[ index ];
- }
- };
- this.updateMorphs = function( influences ) {
- if ( mesh ) {
- for ( var i = 0; i < scope.numMorphs; i ++ ) {
- mesh.morphTargetInfluences[ i ] = influences[ scope.morphs[ i ] ] / 100;
- }
- }
- };
- function loadTextures( baseUrl, textureUrls ) {
- var textureLoader = new THREE.TextureLoader();
- var textures = [];
- for ( var i = 0; i < textureUrls.length; i ++ ) {
- textures[ i ] = textureLoader.load( baseUrl + textureUrls[ i ], scope.checkLoadComplete );
- textures[ i ].mapping = THREE.UVMapping;
- textures[ i ].name = textureUrls[ i ];
- }
- return textures;
- }
- function createMaterials( skins ) {
- var materials = [];
- for ( var i = 0; i < skins.length; i ++ ) {
- materials[ i ] = new THREE.MeshLambertMaterial( {
- color: 0xeeeeee,
- specular: 10.0,
- map: skins[ i ],
- skinning: true,
- morphTargets: true
- } );
- }
- return materials;
- }
- this.checkLoadComplete = function () {
- scope.loadCounter -= 1;
- if ( scope.loadCounter === 0 ) {
- scope.onLoadComplete();
- }
- }
- };
|