为什么在Three.js PointerLockControls源中,yawObject位置被强制为最大10?

时间:2014-02-09 10:49:47

标签: javascript three.js

所以我正在开发一个基本的Demo FPS引擎,我在这里使用了Three.js源代码中的PointerLockControls示例: https://github.com/mrdoob/three.js/blob/master/examples/js/controls/PointerLockControls.js

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

THREE.PointerLockControls = function ( camera ) {

    var scope = this;

    camera.rotation.set( 0, 0, 0 );

    var pitchObject = new THREE.Object3D();
    pitchObject.add( camera );

    var yawObject = new THREE.Object3D();
    yawObject.position.y = 10;
    yawObject.add( pitchObject );

    var moveForward = false;
    var moveBackward = false;
    var moveLeft = false;
    var moveRight = false;

    var isOnObject = false;
    var canJump = false;

    var velocity = new THREE.Vector3();

    var PI_2 = Math.PI / 2;

    var onMouseMove = function ( event ) {

        if ( scope.enabled === false ) return;

        var movementX = event.movementX || event.mozMovementX || event.webkitMovementX || 0;
        var movementY = event.movementY || event.mozMovementY || event.webkitMovementY || 0;

        yawObject.rotation.y -= movementX * 0.002;
        pitchObject.rotation.x -= movementY * 0.002;

        pitchObject.rotation.x = Math.max( - PI_2, Math.min( PI_2, pitchObject.rotation.x ) );

    };

    var onKeyDown = function ( event ) {

        switch ( event.keyCode ) {

            case 38: // up
            case 87: // w
                moveForward = true;
                break;

            case 37: // left
            case 65: // a
                moveLeft = true; break;

            case 40: // down
            case 83: // s
                moveBackward = true;
                break;

            case 39: // right
            case 68: // d
                moveRight = true;
                break;

            case 32: // space
                if ( canJump === true ) velocity.y += 10;
                canJump = false;
                break;

        }

    };

    var onKeyUp = function ( event ) {

        switch( event.keyCode ) {

            case 38: // up
            case 87: // w
                moveForward = false;
                break;

            case 37: // left
            case 65: // a
                moveLeft = false;
                break;

            case 40: // down
            case 83: // s
                moveBackward = false;
                break;

            case 39: // right
            case 68: // d
                moveRight = false;
                break;

        }

    };

    document.addEventListener( 'mousemove', onMouseMove, false );
    document.addEventListener( 'keydown', onKeyDown, false );
    document.addEventListener( 'keyup', onKeyUp, false );

    this.enabled = false;

    this.getObject = function () {

        return yawObject;

    };

    this.isOnObject = function ( boolean ) {

        isOnObject = boolean;
        canJump = boolean;

    };

    this.getDirection = function() {

        // assumes the camera itself is not rotated

        var direction = new THREE.Vector3( 0, 0, -1 );
        var rotation = new THREE.Euler( 0, 0, 0, "YXZ" );

        return function( v ) {

            rotation.set( pitchObject.rotation.x, yawObject.rotation.y, 0 );

            v.copy( direction ).applyEuler( rotation );

            return v;

        }

    }();

    this.update = function ( delta ) {

        if ( scope.enabled === false ) return;

        delta *= 0.1;

        velocity.x += ( - velocity.x ) * 0.08 * delta;
        velocity.z += ( - velocity.z ) * 0.08 * delta;

        velocity.y -= 0.25 * delta;

        if ( moveForward ) velocity.z -= 0.12 * delta;
        if ( moveBackward ) velocity.z += 0.12 * delta;

        if ( moveLeft ) velocity.x -= 0.12 * delta;
        if ( moveRight ) velocity.x += 0.12 * delta;

        if ( isOnObject === true ) {

            velocity.y = Math.max( 0, velocity.y );

        }

        yawObject.translateX( velocity.x );
        yawObject.translateY( velocity.y ); 
        yawObject.translateZ( velocity.z );

        if ( yawObject.position.y < 10 ) {

            velocity.y = 0;
            yawObject.position.y = 10;

            canJump = true;

        }

    };

};

当我试图准确地了解它是如何工作的时候,我试图理解代码的主要部分,但是有一部分源代码我不明白,那部分是这样的:

(上面链接的第169行)

if ( yawObject.position.y < 10 ) {
    velocity.y = 0;
    yawObject.position.y = 10;
    canJump = true;
}

我真的不明白代码的这一部分是什么。我发现如果我将其删除,播放器的相机将失去控制。我还发现,如果我从10改变数字似乎没有任何区别。所以我的问题是;这段代码是什么,改变这个数字会有什么作用?

1 个答案:

答案 0 :(得分:1)

所以进一步玩耍。我已经意识到这(非常明显)只是一个检查,以确保球员保持在地面上。 10和0之间的变化似乎什么也没做,但它实际上只是相机高度的微小变化(几乎没有注意到)。移除线条时发生的摇晃相机外观,只是当你从地板上掉下来时飞过的地形。