簡體   English   中英

在Threejs中加載未定義的OBJ

[英]Undefined OBJ loaded in Threejs

我已經聲明了一個全局變量,以便以后存儲通過THREE.OBJLoader加載的OBJ,但是當我嘗試為所述對象的位置或旋轉設置動畫時(甚至使用console.log()進行了嘗試),我發現該變量未定義。

這是設置場景的方式(請注意變量spaceCraft):

    <script>
    var container;

    var camera, scene, renderer;

    var mouseX = 0,
        mouseY = 0;

    var windowHalfX = window.innerWidth / 2;
    var windowHalfY = window.innerHeight / 2;

    var spaceCraft;

    init();
    animate();


    function init() {

        container = document.createElement('div');
        document.body.appendChild(container);

        camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 2000);
        camera.position.z = 250;


        // scene

        scene = new THREE.Scene();
        var clearColor = 0xaaaaaa;
        scene.background = new THREE.Color(clearColor);

        var ambient = new THREE.AmbientLight(0xffffff);
        scene.add(ambient);

        var directionalLight = new THREE.DirectionalLight(0xffeedd, 100);
        directionalLight.position.set(0, 10, 0);
        scene.add(directionalLight);

        var ambientLight = new THREE.AmbientLight(0xffeedd, 100);
        ambientLight.position.set(0, 0, 0);
        scene.add(ambientLight);


        var manager = new THREE.LoadingManager();
        manager.onProgress = function(item, loaded, total) {

            console.log(item, loaded, total);

        };


        var onProgress = function(xhr) {
            if (xhr.lengthComputable) {
                var percentComplete = xhr.loaded / xhr.total * 100;
                console.log(Math.round(percentComplete, 2) + '% downloaded');
            }
        };

        var onError = function(xhr) {
        };

這是我加載模型的方式

        // model

        var loaderModello = new THREE.OBJLoader(manager);
        var OBJPath = 'spaceCraft3.obj';
        spaceCraft = loaderModello.load(OBJPath, function(object) {

            spaceCraft = object;
            spaceCraft.traverse(function(child) {

                if (child instanceof THREE.Mesh) {

                    child.material.map = texture;

                }

            });
            var scaleFactor = 7;
            spaceCraft.scale.set(scaleFactor, scaleFactor, scaleFactor);
            spaceCraft.rotation.set(0, 9.42, 0);
            scene.add(spaceCraft);

        }, onProgress, onError);

這是animate()和render()函數的最后一部分。

        //
        renderer = new THREE.WebGLRenderer();
        renderer.setPixelRatio(window.devicePixelRatio);
        renderer.setSize(window.innerWidth, window.innerHeight);
        container.appendChild(renderer.domElement);

        document.addEventListener('mousemove', onDocumentMouseMove, false);

        //

        window.addEventListener('resize', onWindowResize, false);

    }

    function onWindowResize() {

        windowHalfX = window.innerWidth / 2;
        windowHalfY = window.innerHeight / 2;

        camera.aspect = window.innerWidth / window.innerHeight;
        camera.updateProjectionMatrix();

        renderer.setSize(window.innerWidth, window.innerHeight);

    }

    function onDocumentMouseMove(event) {

        mouseX = (event.clientX - windowHalfX) / 2;
        mouseY = (event.clientY - windowHalfY) / 2;

    }

    //

    function animate() {

        requestAnimationFrame(animate);
        render();

    }

    function render() {

        camera.position.x += (mouseX - camera.position.x) * .05;
        camera.position.y += (-mouseY - camera.position.y) * .05;
        camera.lookAt(scene.position);

        renderer.render(scene, camera);

    }

</script>

有人可以給我提示嗎? 也許我還不清楚編譯器的工作方式/指令的處理順序。 另外,請告訴我是否可以說得更清楚。

它不是THREE.js相對的,而是javascript。 您不能將全局變量聲明為加載程序結果。 但是你可以添加到對象

您應該通過函數(ES6 +)傳遞該var:

(function(spacecraft, object) {

THREE.Loader.Handlers.add( /\.dds$/i, new THREE.DDSLoader() );

var mtlLoader = new THREE.MTLLoader();

mtlLoader.load( 'js/m.mtl', (function( weapon, object ) {

  return function(materials) {        
        materials.preload();
    var objLoader = new THREE.OBJLoader();
            objLoader.setMaterials( materials );
            objLoader.load( 'js/m.obj', (function ( weapon, object ) {
            return function(wp) {                

                // anything you want with object
                wp.position.set(weaponslot.x,weaponslot.y,weaponslot.z);
                wp.rotateZ(Math.PI);
                object.add( wp );

                }
            })(weaponslot, object));

  }

})(weaponslot, object));
})(weaponslot, object)

更明確地說,不僅創建全局var,而且聲明全局THREE.Object3D()並向其中添加模型,您可以移動或縮放該對象;

    var spaceCraft = new THREE.Object3D();
        scene.add(spaceCraft);
    var loaderModello = new THREE.OBJLoader(manager);
    var OBJPath = 'spaceCraft3.obj';
    //spaceCraft = loaderModello.load(OBJPath, function(object) {
    loaderModello.load(OBJPath, function(object) {

        //spaceCraft = object;
        object.traverse(function(child) {
            if (child instanceof THREE.Mesh) {
                child.material.map = texture;
            }
        });
        var scaleFactor = 7;
        spaceCraft.scale.set(scaleFactor, scaleFactor, scaleFactor);
        spaceCraft.rotation.set(0, 9.42, 0);
        spaceCraft.model = object;            
        spaceCraft.add(spaceCraft.model);

    }, onProgress, onError);

或者,您可以將模型定義為全局對象window.myobject的元素。

window.spaceCraft = {};
loaderModello.load(OBJPath, function(object) { .....////// 
window.spaceCraft = object;
scene.add(window.spaceCraft);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM