【问题标题】:PointerLockControls does not decelerate (threejs)PointerLockControls 不减速(threejs)
【发布时间】:2014-03-11 01:18:32
【问题描述】:

我正在尝试在我的项目中使用THREE.PointerLockControls,因为它已在此example (code here) 中实现。我已经翻译了看起来与示例中使用的代码完全相同的代码,但由于某种原因,一旦控制器开始移动,我就无法让控制器减速。此外,我的控制器比示例中的加速要慢得多。下面是包含我的控制器逻辑的代码的 sn-p。我把它从我的actual code 瘦了一点。

var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 35);
var controls = new THREE.PointerLockControls(camera);
scene.add( controls.getObject() );

var ray = new THREE.Raycaster();
var renderer = new THREE.WebGLRenderer();
var clock = new THREE.Clock();
var objects = [];
var block3Dsize = 5;

var blocker = document.getElementById( 'blocker' );
var instructions = document.getElementById( 'instructions' );

// http://www.html5rocks.com/en/tutorials/pointerlock/intro/

var havePointerLock = 'pointerLockElement' in document || 'mozPointerLockElement' in document || 'webkitPointerLockElement' in document;

if ( havePointerLock ) {

    var element = document.body;

    var pointerlockchange = function ( event ) {

        if ( document.pointerLockElement === element || document.mozPointerLockElement === element || document.webkitPointerLockElement === element ) {
            controls.enabled = true;
            blocker.style.display = 'none';
        } else {
            controls.enabled = false;
            blocker.style.display = '-webkit-box';
            blocker.style.display = '-moz-box';
            blocker.style.display = 'box';
            instructions.style.display = '';
        }
    }

    var pointerlockerror = function ( event ) {

        instructions.style.display = '';
    }

    // Hook pointer lock state change events
    document.addEventListener( 'pointerlockchange', pointerlockchange, false );
    document.addEventListener( 'mozpointerlockchange', pointerlockchange, false );
    document.addEventListener( 'webkitpointerlockchange', pointerlockchange, false );

    document.addEventListener( 'pointerlockerror', pointerlockerror, false );
    document.addEventListener( 'mozpointerlockerror', pointerlockerror, false );
    document.addEventListener( 'webkitpointerlockerror', pointerlockerror, false );

    instructions.addEventListener( 'click', function ( event ) {

        instructions.style.display = 'none';

        // Ask the browser to lock the pointer
        element.requestPointerLock = element.requestPointerLock || element.mozRequestPointerLock || element.webkitRequestPointerLock;

        if ( /Firefox/i.test( navigator.userAgent ) ) {

            var fullscreenchange = function ( event ) {
                if ( document.fullscreenElement === element || document.mozFullscreenElement === element || document.mozFullScreenElement === element ) {

                    document.removeEventListener( 'fullscreenchange', fullscreenchange );
                    document.removeEventListener( 'mozfullscreenchange', fullscreenchange );
                    element.requestPointerLock();
                }
            }

            document.addEventListener( 'fullscreenchange', fullscreenchange, false );
            document.addEventListener( 'mozfullscreenchange', fullscreenchange, false );

            element.requestFullscreen = element.requestFullscreen || element.mozRequestFullscreen || element.mozRequestFullScreen || element.webkitRequestFullscreen;

            element.requestFullscreen();

        } else {

            element.requestPointerLock();
        }

    }, false );

} else {

    instructions.innerHTML = 'Your browser doesn\'t seem to support Pointer Lock API';
}

init();
animate();          

function init(){

    var hemisphereLight = new THREE.HemisphereLight(0xffffff);
    hemisphereLight.position.set(1, 1, 1).normalize();
    scene.add(hemisphereLight);
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);

    ray.ray.direction.set( 0, -1, 0 );
}

function animate() {

    requestAnimationFrame( animate );

    controls.isOnObject( false );
    ray.ray.origin.copy( controls.getObject().position );
    ray.ray.origin.y -= 10;

    var intersections = ray.intersectObjects( objects );

    if ( intersections.length > 0 ) {

        var distance = intersections[ 0 ].distance;

        if ( distance > 0 && distance < 10 ) {

            controls.isOnObject( true );
        }
    }

    controls.update( clock.getDelta() );
    renderer.render( scene, camera );

}

另外,有没有办法设置控制器/相机组合的位置?使用controller.getObject().position.x = 10 不起作用。

谢谢!

【问题讨论】:

    标签: javascript 3d three.js


    【解决方案1】:

    我认为问题在于将clock.getDelta() 传递给controls.update()。前者返回以秒为单位的值,而后者期望以毫秒为单位的值。与THREE.PointerLockControls的内部工作原理不同。

    试试controls.update( clock.getDelta()*1000 ); 看看是否能解决问题。

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 2014-05-21
      相关资源
      最近更新 更多