所以我正在开发一个基本的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改变数字似乎没有任何区别。所以我的问题是;这段代码是什么,改变这个数字会有什么作用?
答案 0 :(得分:1)
所以进一步玩耍。我已经意识到这(非常明显)只是一个检查,以确保球员保持在地面上。 10和0之间的变化似乎什么也没做,但它实际上只是相机高度的微小变化(几乎没有注意到)。移除线条时发生的摇晃相机外观,只是当你从地板上掉下来时飞过的地形。