Three.js OrbitControls 平移和场景旋转

bst*_*tst 4 three.js

我需要旋转环境。由于 Three.js 不支持多维数据集环境旋转,因此我将采用最简单的方法并修改scene.rotation.y,正如各地 Three.js 贡献者所建议的那样。

一切正常,直到相机平移。在这里亲自尝试一下https://stackblitz.com/edit/thirdjs-env-rotate并观察使用滑块旋转场景时相机的摆动。

我该如何纠正晃动?我似乎无法找到可以解决这个问题的算法。我尝试旋转controls.target,但也许我的 3D 数学有问题。

Sci*_*ode 5

您遇到的行为发生controls.target是因为不受 的影响scene.rotation,因此摆动是由于相机试图跟随指定目标而发生的。这意味着您还应该对 进行相同的旋转controls.target

但这还不够。当您在变换的影响下将相机直接连接到场景时,相机的矩阵会发生变化,但positionrotationscale不会发生变化。这使得 OrbitControls 的行为进一步偏离预期。

我建议您的解决方案是避免将相机连接到场景,而是与场景一起旋转相机的位置和控件的目标。

const radians = e.target.value * Math.PI / 180
controls.target.applyAxisAngle( camera.up, radians - scene.rotation.y )
camera.position.applyAxisAngle( camera.up, radians - scene.rotation.y )
scene.rotation.y = radians
Run Code Online (Sandbox Code Playgroud)

实例 - JSFiddle

  • 这正是我想要实现的目标,它就像一个魅力,所以我将接受这个答案。谢谢。 (2认同)