Threejs加載模型代碼

/**
 * @author mrdoob / http://mrdoob.com/
 */

var APP = {

    Player: function () {

        var loader = new THREE.ObjectLoader();
        var camera, scene, renderer;

        var events = {};

        var dom = document.createElement('div');

        this.dom = dom;
        var soider = ['fbx/soilder_JPN_01.fbx', 'fbx/soilder_JPN_01_die01.fbx', 'fbx/soilder_JPN_01_die02.fbx', 'fbx/soilder_JPN_01_run01.fbx', 'fbx/soilder_JPN_01_shoot01.fbx'];

        this.width = 500;
        this.height = 500;

        var mixers = [];
        var clock = new THREE.Clock();

        this.load = function (json) {

            renderer = new THREE.WebGLRenderer({antialias: true});
            renderer.setClearColor(0x000000);
            renderer.setPixelRatio(window.devicePixelRatio);

            if (json.project.gammaInput) renderer.gammaInput = true;
            if (json.project.gammaOutput) renderer.gammaOutput = true;

            if (json.project.shadows) {

                renderer.shadowMap.enabled = true;
                // renderer.shadowMap.type = THREE.PCFSoftShadowMap;

            }

            if (json.project.vr) {

                renderer.vr.enabled = true;

            }

            dom.appendChild(renderer.domElement);

            this.setScene(loader.parse(json.scene));
            this.setCamera(loader.parse(json.camera));

            events = {
                init: [],
                start: [],
                stop: [],
                keydown: [],
                keyup: [],
                mousedown: [],
                mouseup: [],
                mousemove: [],
                touchstart: [],
                touchend: [],
                touchmove: [],
                update: []
            };

            var scriptWrapParams = 'player,renderer,scene,camera';
            var scriptWrapResultObj = {};

            for (var eventKey in events) {

                scriptWrapParams += ',' + eventKey;
                scriptWrapResultObj[eventKey] = eventKey;

            }

            var scriptWrapResult = JSON.stringify(scriptWrapResultObj).replace(/\"/g, '');

            //添加環境光
            _ambient = new THREE.AmbientLight(0xffffff);
            scene.add(_ambient);
            //燈光屬性
            _spotLight = new THREE.SpotLight(0xffffff);
            _spotLight.castShadow = true;
            _spotLight.shadowCameraVisible = true;
            _spotLight.position.set(100, 100, 100);
            //設置陰影貼圖精度
            _spotLight.shadowMapWidth = _spotLight.shadowMapHeight = 1024 * 4;
            scene.add(_spotLight);

            var loadt = new THREE.FBXLoader();
            var loadtt = new THREE.FBXLoader();
            //加載日本人
            for (var i = 0; i < soider.length; i++) {


                if (i == 1) {
                    loadtt.load(soider[i], function (obj) {

                        obj.mixer = new THREE.AnimationMixer(obj);
                        mixers.push(obj.mixer);
                        var action = obj.mixer.clipAction(obj.animations[0]);
                        action.play();
                        obj.position.x = 22;
                        obj.position.z = 5;
                        obj.scale.x = 3;
                        obj.scale.y = 3;
                        obj.scale.z = 3;
                        obj.rotateY(110);
                        scene.add(obj);

                    });
                }
                if (i == 2) {
                    loadt.load(soider[i], function (obj) {

                        obj.mixer = new THREE.AnimationMixer(obj);
                        mixers.push(obj.mixer);
                        var action = obj.mixer.clipAction(obj.animations[0]);
                        action.play();
                        obj.position.x = 1;
                        obj.position.z = 5;
                        obj.scale.x = 3;
                        obj.scale.y = 3;
                        obj.scale.z = 3;
                        obj.rotateY(110);
                        scene.add(obj);


                    });
                }

                if (i == 3) {
                    loadt.load(soider[i], function (obj) {

                        obj.mixer = new THREE.AnimationMixer(obj);
                        mixers.push(obj.mixer);
                        var action = obj.mixer.clipAction(obj.animations[0]);
                        action.play();
                        obj.position.x = -25;
                        obj.position.z = 32;
                        obj.scale.x = 3;
                        obj.scale.y = 3;
                        obj.scale.z = 3;
                        obj.rotateY(110);
                        scene.add(obj);

                        //循環移動動畫,改變js的位置信息
                        moveAmation(obj);



                    });
                }
                if (i == 4) {
                    loadt.load(soider[i], function (obj) {

                        obj.mixer = new THREE.AnimationMixer(obj);
                        mixers.push(obj.mixer);
                        var action = obj.mixer.clipAction(obj.animations[0]);
                        action.play();
                        obj.position.x = -5;
                        obj.position.z = 18;
                        obj.scale.x = 3;
                        obj.scale.y = 3;
                        obj.scale.z = 3;
                        obj.rotateY(110);
                        scene.add(obj);


                    });
                }



            }

            //向前移動的動畫
            function moveAmation(obj){
                //向前移動
                var time = setInterval(showTime, 50);
                var step=32;
                function showTime() {
                    if (step == -45) {
                        moveAmation(obj);
                        clearInterval(time);

                    }
                     step--;

                    obj.position.z = step*0.9;

                }





            }
            for (var uuid in json.scripts) {

                var object = scene.getObjectByProperty('uuid', uuid, true);
                console.log(object);

                if (object === undefined) {

                    console.warn('APP.Player: Script without object.', uuid);
                    continue;

                }

                var scripts = json.scripts[uuid];

                for (var i = 0; i < scripts.length; i++) {

                    var script = scripts[i];

                    var functions = (new Function(scriptWrapParams, script.source + '\nreturn ' + scriptWrapResult + ';').bind(object))(this, renderer, scene, camera);

                    for (var name in functions) {

                        if (functions[name] === undefined) continue;

                        if (events[name] === undefined) {

                            console.warn('APP.Player: Event type not supported (', name, ')');
                            continue;

                        }

                        events[name].push(functions[name].bind(object));

                    }

                }

            }
            dispatch(events.init, arguments);

        };

        this.setCamera = function (value) {

            camera = value;
            camera.aspect = this.width / this.height;
            camera.updateProjectionMatrix();

            if (renderer.vr.enabled) {

                WEBVR.checkAvailability().catch(function (message) {

                    dom.appendChild(WEBVR.getMessageContainer(message));

                });

                WEBVR.getVRDisplay(function (device) {

                    renderer.vr.setDevice(device);
                    dom.appendChild(WEBVR.getButton(device, renderer.domElement));

                });

            }

        };

        this.setScene = function (value) {

            scene = value;

        };

        this.setSize = function (width, height) {

            this.width = width;
            this.height = height;

            if (camera) {

                camera.aspect = this.width / this.height;
                camera.updateProjectionMatrix();

            }

            if (renderer) {

                renderer.setSize(width, height);

            }

        };

        function dispatch(array, event) {

            for (var i = 0, l = array.length; i < l; i++) {

                array[i](event);

            }

        }

        var prevTime;


        function animate(time) {
            try {

                dispatch(events.update, {time: time, delta: time - prevTime});

            } catch (e) {

                console.error((e.message || e), (e.stack || ""));

            }

            if (mixers.length > 0) {
                console.log(mixers.length);
                var time=clock.getDelta();
                for (var i = 0; i < mixers.length; i++) {
                    mixers[i].update(time);
                }

            }
            renderer.render(scene, camera);

            prevTime = time;

        }

        this.play = function () {

            prevTime = performance.now();
            document.addEventListener('keydown', onDocumentKeyDown);
            document.addEventListener('keyup', onDocumentKeyUp);
            document.addEventListener('mousedown', onDocumentMouseDown);
            document.addEventListener('mouseup', onDocumentMouseUp);
            document.addEventListener('mousemove', onDocumentMouseMove);
            document.addEventListener('touchstart', onDocumentTouchStart);
            document.addEventListener('touchend', onDocumentTouchEnd);
            document.addEventListener('touchmove', onDocumentTouchMove);

            dispatch(events.start, arguments);

            renderer.animate(animate);

        };

        this.stop = function () {

            document.removeEventListener('keydown', onDocumentKeyDown);
            document.removeEventListener('keyup', onDocumentKeyUp);
            document.removeEventListener('mousedown', onDocumentMouseDown);
            document.removeEventListener('mouseup', onDocumentMouseUp);
            document.removeEventListener('mousemove', onDocumentMouseMove);
            document.removeEventListener('touchstart', onDocumentTouchStart);
            document.removeEventListener('touchend', onDocumentTouchEnd);
            document.removeEventListener('touchmove', onDocumentTouchMove);

            dispatch(events.stop, arguments);

            renderer.animate(null);

        };

        this.dispose = function () {

            while (dom.children.length) {

                dom.removeChild(dom.firstChild);

            }

            renderer.dispose();

            camera = undefined;
            scene = undefined;
            renderer = undefined;

        };

        //

        function onDocumentKeyDown(event) {

            dispatch(events.keydown, event);

        }

        function onDocumentKeyUp(event) {

            dispatch(events.keyup, event);

        }

        function onDocumentMouseDown(event) {

            dispatch(events.mousedown, event);

        }

        function onDocumentMouseUp(event) {

            dispatch(events.mouseup, event);

        }

        function onDocumentMouseMove(event) {

            dispatch(events.mousemove, event);

        }

        function onDocumentTouchStart(event) {

            dispatch(events.touchstart, event);

        }

        function onDocumentTouchEnd(event) {

            dispatch(events.touchend, event);

        }

        function onDocumentTouchMove(event) {

            dispatch(events.touchmove, event);

        }

    }

};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章