Центрирование и изменение размеров GLTF-моделей автоматически в Three.js - PullRequest
0 голосов
/ 11 сентября 2018

После загрузки 3D-моделей с sketchfab.com и импорта их в сцену Three.js они в большинстве случаев не центрированы, а их размер очень велик.

Существует ли способ автоматического центрирования имасштабировать модели gltf, используя скрипт или программное обеспечение (работающее в Linux) или иным образом, чтобы делать это на лету в Three.js и иметь камеру для перемещения по объекту с помощью OrbitControls.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018
var loader = new THREE.GLTFLoader();
loader.load( 'models/yourmodel.gltf', 
function ( gltf ) {
    gltf.scene.traverse( function ( child ) {
        if ( child.isMesh ) {
            child.geometry.center(); // center here
        }
    });
    gltf.scene.scale.set(10,10,10) // scale here
    scene.add( gltf.scene );
}, (xhr) => xhr, ( err ) => console.error( e ));

Для перемещения по объекту используйте controls.target () https://threejs.org/docs/#examples/controls/OrbitControls.target

0 голосов
/ 11 сентября 2018

Да. Этот код берет узел и находит его размер и центральную точку, затем масштабирует его так, чтобы максимальный экстент равнялся 1, а его центр находился в 0,0,0, а над землей - по оси y.

    var mroot = yourScene;
    var bbox = new THREE.Box3().setFromObject(mroot);
    var cent = bbox.getCenter(new THREE.Vector3());
    var size = bbox.getSize(new THREE.Vector3());

    //Rescale the object to normalized space
    var maxAxis = Math.max(size.x, size.y, size.z);
    mroot.scale.multiplyScalar(1.0 / maxAxis);
    bbox.setFromObject(mroot);
    bbox.getCenter(cent);
    bbox.getSize(size);
    //Reposition to 0,halfY,0
    mroot.position.copy(cent).multiplyScalar(-1);
    mroot.position.y-= (size.y * 0.5);
...