【问题标题】:TrackballControls change eventsTrackballControls 更改事件
【发布时间】:2017-04-11 09:29:13
【问题描述】:

我有一个没有动画循环的静态场景,我正在尝试使用 TrackballControls 的更改事件来触发渲染函数,遵循thread 中的模式,即:

var controls = new THREE.TrackballControls( camera, renderer.domElement );
controls.addEventListener( 'change', render );
function render() {
    renderer.render( scene, camera );
}

这适用于 OrbitControls,但是当我替换 TrackballControls 时不会触发更改事件。但是,如果我添加以下行:

_this.update();

在 TrackballControls.js 中的 mousewheel()、mousemove() 和 touchmove() 函数结束时,我可以正确触发更改事件(在我的情况下,无论如何)。我不确定这是否是触发更改事件的最佳方式。对于这种情况,分叉 TrackballControls 的本地副本是最佳解决方案吗?我是否忽略了某些内容,或者更改 TrackballControls.js 是否有意义?

【问题讨论】:

    标签: three.js


    【解决方案1】:

    TrackballControls 被编写为需要一个动画循环,在该循环中调用controls.update()

    另一方面,OrbitControls 可用于仅在移动鼠标时才渲染场景的静态场景,如下所示:

    controls.addEventListener( 'change', render );
    

    在任何一种情况下,控件都是示例的一部分,而不是库的一部分,因此您可以根据自己的喜好随意修改它们。

    如果您的场景是静态的并且不需要阻尼,那么您的提议就可以了。

    编辑:更正了three.js r.73

    【讨论】:

    • 这就解释了。在多玩了两个控件之后,我确实喜欢阻尼效果。我最终可能会编写一些运行动画循环的代码,直到相机运动阻尼停止,这样我就可以获得效果并且仍然没有持续运行动画循环的开销。
    • 有没有一种更简洁的方式来运行 TrackballControls 而无需渲染循环,并且无需修改 TrackballControls.js 文件?我尝试使用 tb.addEventListener('mousemove',tb.update) 但它不起作用......
    • 我正在从 npm 上的三个轨迹球控件中获取 TrackballControls,因此破解它很不方便。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    相关资源
    最近更新 更多