首页 > 解决方案 > 将相机重新定位到对象和lookAt()(反应三纤维)

问题描述

我正在尝试在单个随机放置的对象的“缩小”和“放大”视图之间平稳camera.position过渡。camera.lookAt

定位效果很好。然而, LerpinglookAt()似乎并不能很好地与传统 ThreeJS 的其他解决方案配合使用(请参阅@bovesan 的答案here),也没有通过 react-three-fiber 文档(链接)上的相关示例解决。

放大z轴会使相机翻转,并且在角落处它会严重失真。

你可以在这里看到我的进度:https ://codesandbox.io/s/three-fiber-zoom-to-object-rlme0?file=/src/App.js

相关代码位App.js在第 63 行:

 useFrame((state) => {
    const step = 0.05;

    // `focus` is a state variable that sends a Vec3 of the objects position
    zoom ? vec.set(focus.x, focus.y, focus.z + 0.2) : vec.set(0, 0, 5);

    // HERE, looking for a way to lerp camera lookAt in a way that can toggle.
    state.camera.lookAt(0, 0, 0);
    state.camera.position.lerp(vec, step);

    state.camera.updateProjectionMatrix();
  });

我花了几个小时寻找相关的例子/教程,但没有想出太多。不过,恐怕我没有足够的 ThreeJs 经验来寻找正确的方向,所以任何方向的帮助都将受到欢迎。

标签: javascriptreactjsthree.js3dreact-three-fiber

解决方案


对于后来发生这种情况的任何人,@drcmda 已经找到了解决方案。

您可以在此处找到一个工作示例:

https://codesandbox.io/s/three-fiber-zoom-to-object-camera-controls-solution-final-sbgx0?file=/src/App.js

这只是@drcmda 实现相机控制的一个微小变化,使用正常的 lerping 来移动相机。它并不完美(一方面,相机控件中的过渡时间似乎不可编辑,因此当您缩小时会发生奇怪的摆动)但它确实解决了问题。(非常感谢@looeee 和@forerunrun 提供的额外帮助。)

如果您不想使用另一个库,@forerunrun 在原始线程中的答案也很有效,但我无法对其进行足够的调试以使其可靠。(见convo。)


推荐阅读