Three.js相机看起来不起作用

时间:2016-05-12 00:44:40

标签: javascript three.js

我正在尝试使用Vector3更改相机所在的位置,但相机会继续查看场景的原点。我不确定为什么这不起作用。我见过的所有例子都很简单。有什么想法吗?

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript" src="/three.js"></script>
    <script type="text/javascript" src="/MTLLoader.js"></script>
    <script type="text/javascript" src="/OBJLoader.js"></script>

    <script type="text/javascript" src="/stats.js"></script>
    <style>
        body {
            /* set margin to 0 and overflow to hidden, to go fullscreen */
            margin: 0;
            overflow: hidden;
        }
    </style>
</head>
<body>
<script type="text/javascript" src="/World.js"></script>
<script type="text/javascript" src="/Controls.js"></script>
<script type="text/javascript">
    // Initialize our new world object which will 
    //  setup our scene, camera, lights, and renderer.
    var world = new World(true);
    var controls = new Controls();

    // Load the map for this given level. 
    // A reference to every model loaded is saved in world.model[*name_of_file*]
    world.modelLoader('meter_grid');
    world.modelLoader('skybox1');
    world.modelLoader('test_character');

    // Render loop. Important things happens in here.
    (function render() {
        if(world.stats){
            world.stats.update();
        }
        //console.log(JSON.stringify(world.camera.position));
        world.updateRotation(controls.left, controls.right);
        requestAnimationFrame(render);
        world.renderer.render(world.scene, world.camera);
    }());
</script>
<script src="/domevents.js"></script>
</body>
</html>

以下是世界&#34;班级&#34;正在建造场景的地方

// =======================================================
//  The World.
// =======================================================
var World = function(showStats){

    this.currentTime = (+new Date()) / 1000.0;
    this.stats = showStats ? this.initStats() : false;

    // Create scene object, add fog to scene: Fog( hex, near, far )
    this.scene = new THREE.Scene();

    // Create camera object: PerspectiveCamera( fov, aspect, near, far )
    this.camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);
    this.camera.position.x = 0;
    this.camera.position.y = 5;
    this.camera.position.z = 5;

    this.look = new THREE.Vector3(5, 0, -5);
    this.camera.lookAt(this.look);

    this.scene.add(this.camera);

    // Create ambient light
    this.light = new THREE.AmbientLight( 0x444444 );
    this.light.intensity = 5;
    this.scene.add( this.light );

    // Create renderer and bind to dom element
    this.renderer = new THREE.WebGLRenderer();
    this.renderer.setClearColor(0xffffff);
    this.renderer.setPixelRatio(window.devicePixelRatio);
    this.renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(this.renderer.domElement);
    this.rotationSpeed = .02;
};

World.prototype.modelLoader = function(filename){
    var scope = this;
    var mtlLoader = new THREE.MTLLoader();
    mtlLoader.setBaseUrl( '/obj_assets/' );
    mtlLoader.setPath( '/obj_assets/' );
    mtlLoader.load( filename + '.mtl', function( materials ) {
        materials.preload();

        var objLoader = new THREE.OBJLoader();
        objLoader.setMaterials( materials );
        objLoader.setPath( '/obj_assets/' );
        objLoader.load( filename + '.obj', function ( object ) {

            object.name = filename;
            scope.scene.add( object );

            if(filename === 'test_character'){
                scope.moveCharacter(filename, 0, 0);
            }
        });
    }); 
};
World.prototype.render = function(){  
    if(this.stats){
        this.stats.update();
    }
    this.controls.update();
    requestAnimationFrame(this.render);
    this.renderer.render(this.scene, this.camera);
};

World.prototype.initStats = function(){
    var stats = new Stats();
    stats.setMode(0); // 0: fps, 1: ms

    // Align top left
    stats.domElement.style.position = 'absolute';
    stats.domElement.style.left = '0px';
    stats.domElement.style.top = '0px';

    document.body.appendChild(stats.domElement);
    return stats;
};

World.prototype.updateRotation = function(key_left, key_right){
    var x = this.camera.position.x,
        y = this.camera.position.y,
        z = this.camera.position.z;
    if (key_right){ 
        this.camera.position.x = x * Math.cos(this.rotationSpeed) + z * Math.sin(this.rotationSpeed);
        this.camera.position.z = z * Math.cos(this.rotationSpeed) - x * Math.sin(this.rotationSpeed);
    } else if (key_left){
        this.camera.position.x = x * Math.cos(this.rotationSpeed) - z * Math.sin(this.rotationSpeed);
        this.camera.position.z = z * Math.cos(this.rotationSpeed) + x * Math.sin(this.rotationSpeed);
    }
    this.camera.lookAt(this.scene.position);
};
// Move the character from a 2D xy grid perspective
World.prototype.moveCharacter = function(name, x, y){

    this.scene.getObjectByName(name).position.x = x;
    this.scene.getObjectByName(name).position.z = -y;    
};

1 个答案:

答案 0 :(得分:0)

已解决:关闭我的updateRotation方法(如示例中所示)覆盖了初始camera.lookAt调用场景的位置。