gpt4 book ai didi

javascript - Three.js 上的平滑相机控制开关

转载 作者:行者123 更新时间:2023-11-29 10:37:33 24 4
gpt4 key购买 nike

我正在开发一个网站,该网站允许用户使用 VRControls 查看天空中的物体,并使用轨迹球控件查看他们最喜欢的物体,点击物体即可初始化。这是演示。 https://jsfiddle.net/tushuhei/4f1Lum5n/6/

function focus (obj, target) {
var dummyCamera = camera.clone();
controls = new THREE.TrackballControls(dummyCamera);
controls.target.set(obj.point.x, obj.point.y, obj.point.z);
new TWEEN.Tween(camera.position)
.to(target, 1000)
.onComplete(function() {
transitioning = false;
controls.dispose();
controls = new THREE.TrackballControls(camera);
controls.target.set(obj.point.x, obj.point.y, obj.point.z);
}).start();
}

TWEEN 非常适合从 WebVR 到轨迹球模式的转换,反之亦然,但在转换结束时仍有一点差距。我猜这是因为过渡完成阶段相机旋转的间隙。

考虑到相机位置和旋转,是否有任何方法可以使两个不同相机控件之间的过渡平滑?

谢谢,

最佳答案

您使用 dummyCamera 的方法是正确的。您需要在初始四元数和最后一个四元数之间获取最终四元数和 slerp,而补间负责位置。

// Save the initial quaternion so that we can use it as a 
// starting point for the slerp.
var startQuaternion = camera.quaternion.clone();

// Apply the tracking controls to a cloned dummy camera so
// that we can get the final quaternion.
var dummyCamera = camera.clone();
dummyCamera.position.set(target.x, target.y, target.z);
var dummyControls = new THREE.TrackballControls(dummyCamera);
dummyControls.target.set(obj.point.x, obj.point.y, obj.point.z);
dummyControls.update();

// Disable VR controls, so that it doesn't compete with
// the tween for control of the camera.
// (Note: now you need to check if the controls are
// null in the animate function)
controls.dispose();
controls = null;

new TWEEN.Tween(camera.position)
.to(target, 1000)
.onUpdate(function (timestamp){
// Slerp the camera quaternion as well.
// timestamp is the eased time value from the tween.
THREE.Quaternion.slerp(
startQuaternion, dummyCamera.quaternion, camera.quaternion, timestamp);
})
.onComplete(function() {
controls = new THREE.TrackballControls(camera);
controls.target.set(obj.point.x, obj.point.y, obj.point.z);
}).start();

https://jsfiddle.net/4f1Lum5n/10/

附言到目前为止,您实现此方法的方式可能会让 VR 用户感到恶心。接管用户的观点通常是不好的做法。另一种解决方案可能是将用户放在宇宙飞船或平台上,然后在平台上进行补间,以便用户始终可以控制相机。

关于javascript - Three.js 上的平滑相机控制开关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34324495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com