three.js создает меш из возражений gltf - PullRequest
0 голосов
/ 28 сентября 2018

Я создал объект gltf в three.js, но проблема в том, что я не думаю, что он содержит меш.Я хочу использовать Ray Caster для перемещения объекта с помощью обработчика события при нажатии.У меня есть весь код для этого, но он не регистрируется, когда я нажимаю.

Код для загрузки объекта:

    var loader = new THREE.GLTFLoader();

loader.load(
    // resource URL
    './vitra_eames_plastic_chair/scene.gltf',
    // called when the resource is loaded
    function ( object ) {

        object.animations; // Array<THREE.AnimationClip>
        object.scene; // THREE.Scene
        object.scenes; // Array<THREE.Scene>
        object.cameras; // Array<THREE.Camera>
        object.asset; // Object

        var object = new THREE.Mesh(gltf.asset, new THREE.MeshLambertMaterial({ color: Math.random() * 0xffffff }));
        object.scene.position.x = -75;
        object.scene.position.y = -75;
        object.scene.position.z = -75;
        object.scene.rotation.x = 50;
        object.scene.rotation.y = 50;
        object.scene.rotation.z = 50;
        object.scene.scale.x = .5;
        object.scene.scale.y = .5;
        object.scene.scale.z = .5;
        object.scene.castShadow = true;
        object.scene.receiveShadow = true;
        boxScene.add(object.scene);
        objects.push(object.scene);
    },
    // called while loading is progressing
    function ( xhr ) {
        console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' );
    },
    // called when loading has errors
    function ( error ) {

        console.log( 'An error happened' );

    }
);

У меня также есть этот код, который генерирует ящики.Здесь обработчик событий работает, но, очевидно, объект загружался по-другому.Любой совет будет принята с благодарностью.

    var geometry = new THREE.BoxGeometry(1, 1, 1);
for (var i = 0; i < 50; i++) {
    var object = new THREE.Mesh(geometry, new THREE.MeshLambertMaterial({ color: Math.random() * 0xffffff }));
    object.position.x = Math.random() * 50 - 25;
    object.position.y = Math.random() * 10 + 1;
    object.position.z = Math.random() * 50 - 25;
    object.rotation.x = Math.random() * 2 * Math.PI;
    object.rotation.y = Math.random() * 2 * Math.PI;
    object.rotation.z = Math.random() * 2 * Math.PI;
    object.scale.x = Math.random() * 3 + 1;
    object.scale.y = Math.random() * 3 + 1;
    object.scale.z = Math.random() * 3 + 1;
    object.castShadow = true;
    object.receiveShadow = true;
    boxScene.add(object);
    objects.push(object);
}

1 Ответ

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

Я думаю, вы должны изменить свой onLoad() обратный вызов GLTFLoader.load(), чтобы решить проблему.Вы создаете меш с object.asset, что не правильно.Вместо этого вы можете добавить object.scene непосредственно в граф сцены.Поэтому в большинстве случаев обратный вызов может быть просто таким:

var loader = new THREE.GLTFLoader();
loader.load( function( gltf ) {

    scene.add( gltf.scene );

) };

Посмотрите исходный код следующего примера, чтобы увидеть этот подход в действии.

https://threejs.org/examples/webgl_loader_gltf.html

...