【问题标题】:How to reset the OrbitControls and when to use the update method?如何重置 OrbitControls 以及何时使用更新方法?
【发布时间】:2022-11-19 03:18:10
【问题描述】:

我想重置具有主动阻尼功能的相机。我尝试了不同的方法,但我不知道它们是否正确。

目标是停止阻尼并设置相机的初始位置,然后再次激活阻尼。我想避免在使用按钮重置控件后模型/相机稍微旋转。我会这样做:

controls.enableDamping = false;
controls.update();
camera.position.set( 10, 13, 10 );
camera.lookAt( 0, 0, 0 );
controls.enableDamping = true;
controls.update();

我的渲染函数由 EventListener 调用:

controls.addEventListener( "change", requestRenderer );

和渲染功能:

const renderer = new THREE.WebGLRenderer( { canvas: canvas, antialias: true, alpha: true } );       

let renderRequested = false;        

function render( time ) {           
    time *= 0.001;                  
    renderRequested = false;
    resizeRenderer( renderer, camera );
    controls.update();
    renderer.render( scene, camera );
}

function requestRenderer() {
   if( !renderRequested ) {
       renderRequested = true;
       requestAnimationFrame( render );
   }
}

这很好用。问题是这是否是正确的方法,我什么时候必须更新控件?我认为第一次更新是必要的,以告诉控件阻尼不再处于活动状态(但更新有什么作用?)而且我认为,我不需要第二次更新。

【问题讨论】:

    标签: three.js


    【解决方案1】:

    从您的代码来看,您似乎不需要第二次更新。你不是在改变一个钥匙关于控件的属性,在你的render()循环中:

    controls.update();
    

    这涵盖了所有其他情况。

    【讨论】:

    • 为什么我需要第一个?在 three.js 文档中,他们说:“更新控件。必须在对相机变换进行任何手动更改后调用,或者如果设置了 .autoRotate 或 .enableDamping,则必须在更新循环中调用。”那么(取消)激活阻尼会改变相机变换吗?
    • @stoex,是的,但是看起来您的渲染循环并不总是被调用?
    • 是的。我在事件监听器的帮助下按需渲染,如下所示:threejs.org/manual/#en/rendering-on-demand
    • 您应该创建另一个始终运行的 render() 循环,并将 controls.update() 放入其中。
    • 这有什么特别的原因吗?
    猜你喜欢
    • 1970-01-01
    • 2021-03-17
    • 2021-03-18
    • 2018-09-19
    • 2017-10-31
    • 1970-01-01
    • 2014-06-04
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多