|
@@ -30,13 +30,23 @@
|
|
|
|
|
|
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
|
|
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
|
|
import { FBXLoader } from 'three/addons/loaders/FBXLoader.js';
|
|
import { FBXLoader } from 'three/addons/loaders/FBXLoader.js';
|
|
|
|
+ import { GUI } from 'three/addons/libs/lil-gui.module.min.js';
|
|
|
|
|
|
- let camera, scene, renderer, stats;
|
|
|
|
-
|
|
|
|
|
|
+ let camera, scene, renderer, stats, object, loader, guiMorphsFolder;
|
|
const clock = new THREE.Clock();
|
|
const clock = new THREE.Clock();
|
|
|
|
|
|
let mixer;
|
|
let mixer;
|
|
|
|
|
|
|
|
+ const params = {
|
|
|
|
+ asset: 'Samba Dancing'
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ const assets = [
|
|
|
|
+ 'Samba Dancing',
|
|
|
|
+ 'morph_test'
|
|
|
|
+ ];
|
|
|
|
+
|
|
|
|
+
|
|
init();
|
|
init();
|
|
|
|
|
|
function init() {
|
|
function init() {
|
|
@@ -76,15 +86,75 @@
|
|
grid.material.opacity = 0.2;
|
|
grid.material.opacity = 0.2;
|
|
grid.material.transparent = true;
|
|
grid.material.transparent = true;
|
|
scene.add( grid );
|
|
scene.add( grid );
|
|
|
|
+
|
|
|
|
+ loader = new FBXLoader( );
|
|
|
|
+ loadAsset( params.asset );
|
|
|
|
+
|
|
|
|
+ renderer = new THREE.WebGLRenderer( { antialias: true } );
|
|
|
|
+ renderer.setPixelRatio( window.devicePixelRatio );
|
|
|
|
+ renderer.setSize( window.innerWidth, window.innerHeight );
|
|
|
|
+ renderer.setAnimationLoop( animate );
|
|
|
|
+ renderer.shadowMap.enabled = true;
|
|
|
|
+ container.appendChild( renderer.domElement );
|
|
|
|
+
|
|
|
|
+ const controls = new OrbitControls( camera, renderer.domElement );
|
|
|
|
+ controls.target.set( 0, 100, 0 );
|
|
|
|
+ controls.update();
|
|
|
|
+
|
|
|
|
+ window.addEventListener( 'resize', onWindowResize );
|
|
|
|
+
|
|
|
|
+ // stats
|
|
|
|
+ stats = new Stats();
|
|
|
|
+ container.appendChild( stats.dom );
|
|
|
|
+
|
|
|
|
+ const gui = new GUI();
|
|
|
|
+ gui.add( params, 'asset', assets ).onChange( function ( value ) {
|
|
|
|
+
|
|
|
|
+ loadAsset( value );
|
|
|
|
+
|
|
|
|
+ } );
|
|
|
|
+
|
|
|
|
+ guiMorphsFolder = gui.addFolder( 'Morphs' ).hide();
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ function loadAsset( asset ) {
|
|
|
|
+
|
|
|
|
+ loader.load( 'models/fbx/' + asset + '.fbx', function ( group ) {
|
|
|
|
+
|
|
|
|
+ if ( object ) {
|
|
|
|
|
|
- // model
|
|
|
|
- const loader = new FBXLoader();
|
|
|
|
- loader.load( 'models/fbx/Samba Dancing.fbx', function ( object ) {
|
|
|
|
|
|
+ object.traverse( function ( child ) {
|
|
|
|
|
|
- mixer = new THREE.AnimationMixer( object );
|
|
|
|
|
|
+ if ( child.material ) child.material.dispose();
|
|
|
|
+ if ( child.material && child.material.map ) child.material.map.dispose();
|
|
|
|
+ if ( child.geometry ) child.geometry.dispose();
|
|
|
|
|
|
- const action = mixer.clipAction( object.animations[ 0 ] );
|
|
|
|
- action.play();
|
|
|
|
|
|
+ } );
|
|
|
|
+
|
|
|
|
+ scene.remove( object );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //
|
|
|
|
+
|
|
|
|
+ object = group;
|
|
|
|
+
|
|
|
|
+ if ( object.animations && object.animations.length ) {
|
|
|
|
+
|
|
|
|
+ mixer = new THREE.AnimationMixer( object );
|
|
|
|
+
|
|
|
|
+ const action = mixer.clipAction( object.animations[ 0 ] );
|
|
|
|
+ action.play();
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ mixer = null;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ guiMorphsFolder.children.forEach( ( child ) => child.destroy() );
|
|
|
|
+ guiMorphsFolder.hide();
|
|
|
|
|
|
object.traverse( function ( child ) {
|
|
object.traverse( function ( child ) {
|
|
|
|
|
|
@@ -93,6 +163,18 @@
|
|
child.castShadow = true;
|
|
child.castShadow = true;
|
|
child.receiveShadow = true;
|
|
child.receiveShadow = true;
|
|
|
|
|
|
|
|
+ if ( child.morphTargetDictionary ) {
|
|
|
|
+
|
|
|
|
+ guiMorphsFolder.show();
|
|
|
|
+ const meshFolder = guiMorphsFolder.addFolder( child.name || child.uuid );
|
|
|
|
+ Object.keys( child.morphTargetDictionary ).forEach( ( key ) => {
|
|
|
|
+
|
|
|
|
+ meshFolder.add( child.morphTargetInfluences, child.morphTargetDictionary[ key ], 0, 1, 0.01 );
|
|
|
|
+
|
|
|
|
+ } );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
} );
|
|
} );
|
|
@@ -101,23 +183,6 @@
|
|
|
|
|
|
} );
|
|
} );
|
|
|
|
|
|
- renderer = new THREE.WebGLRenderer( { antialias: true } );
|
|
|
|
- renderer.setPixelRatio( window.devicePixelRatio );
|
|
|
|
- renderer.setSize( window.innerWidth, window.innerHeight );
|
|
|
|
- renderer.setAnimationLoop( animate );
|
|
|
|
- renderer.shadowMap.enabled = true;
|
|
|
|
- container.appendChild( renderer.domElement );
|
|
|
|
-
|
|
|
|
- const controls = new OrbitControls( camera, renderer.domElement );
|
|
|
|
- controls.target.set( 0, 100, 0 );
|
|
|
|
- controls.update();
|
|
|
|
-
|
|
|
|
- window.addEventListener( 'resize', onWindowResize );
|
|
|
|
-
|
|
|
|
- // stats
|
|
|
|
- stats = new Stats();
|
|
|
|
- container.appendChild( stats.dom );
|
|
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
|
|
function onWindowResize() {
|
|
function onWindowResize() {
|