THREE.js lookAt - 如何在新旧目标位置之间平滑平移?
THREE.js lookAt - How to pan smoothly between old and new target positions?
我可以使用 THREE.js "lookAt" 函数让我的锥体依次指向每个目标球体(红色、绿色、黄色、蓝色)。
// Initialisation
c_geometry = new THREE.CylinderGeometry(3, 40, 120, 40, 10, false);
c_geometry.applyMatrix( new THREE.Matrix4().makeRotationX( Math.PI / 2 ) );
c_material = new THREE.MeshNormalMaterial()
myCone = new THREE.Mesh(c_geometry, c_material);
scene.add(myCone);
// Application (within the Animation loop)
myCone.lookAt(target.position);
但现在我希望圆锥体从旧目标平滑缓慢地平移到新目标。我想我可以通过计算以圆锥中心 Cxyz 为中心并从先前的目标位置 Pxyz 到新的目标位置 Nxyz 的圆弧上的中间点来实现。
请有人指点我合适的:(a) 实用程序或 (b) 三角算法或 (c) 用于计算此类弧上中间点的 xyz 坐标的代码示例? (我将根据所需的扫描速率和帧之间的时间间隔提供点之间的 angular 增量)。
如果你想从一个方向平滑过渡到另一个方向,你可以使用THREE.Quaternion.slerp()
。
在你的情况下,你会预先计算目标四元数:
myCone.lookAt( s1.position );
q1 = new THREE.Quaternion().copy( myCone.quaternion );
myCone.lookAt( s2.position );
q2 = new THREE.Quaternion().copy( myCone.quaternion );
然后,在渲染循环中使用 slerp()
:
THREE.Quaternion.slerp( q1, q2, myCone.quaternion, time ); // 0 < time < 1
修改 fiddle 以演示概念:http://jsfiddle.net/1dtx78bj/22/。
three.js r.71
对于那些想要 lerp 位置 和 lookAt 的人,您可以从当前观察方向创建一个初始 lookAt 目标并将其 lerp 到最终目标:
function MoveWhileLookingAt(object: Object3D, destination: Vector3, lookAt: Vector3){
const fromPosition = object.position.clone();
const fromLookAt = new Vector3(
0,
.1, // To avoid initial camera flip on certain starting points (like top down view)
-object.position.distanceTo(lookAt) // THREE.Camera looks down negative Z. Remove the minus if working with a regular object.
);
object.localToWorld(fromLookAt);
const tempTarget = fromLookAt.clone();
function LookAtLerp(alpha: number){
// This goes in your render loop
object.position.lerpVectors(fromPosition, destination, alpha);
tempTarget.lerpVectors(fromLookAt, lookAt, alpha);
object.lookAt(tempTarget);
}
}
我可以使用 THREE.js "lookAt" 函数让我的锥体依次指向每个目标球体(红色、绿色、黄色、蓝色)。
// Initialisation
c_geometry = new THREE.CylinderGeometry(3, 40, 120, 40, 10, false);
c_geometry.applyMatrix( new THREE.Matrix4().makeRotationX( Math.PI / 2 ) );
c_material = new THREE.MeshNormalMaterial()
myCone = new THREE.Mesh(c_geometry, c_material);
scene.add(myCone);
// Application (within the Animation loop)
myCone.lookAt(target.position);
但现在我希望圆锥体从旧目标平滑缓慢地平移到新目标。我想我可以通过计算以圆锥中心 Cxyz 为中心并从先前的目标位置 Pxyz 到新的目标位置 Nxyz 的圆弧上的中间点来实现。
请有人指点我合适的:(a) 实用程序或 (b) 三角算法或 (c) 用于计算此类弧上中间点的 xyz 坐标的代码示例? (我将根据所需的扫描速率和帧之间的时间间隔提供点之间的 angular 增量)。
如果你想从一个方向平滑过渡到另一个方向,你可以使用THREE.Quaternion.slerp()
。
在你的情况下,你会预先计算目标四元数:
myCone.lookAt( s1.position );
q1 = new THREE.Quaternion().copy( myCone.quaternion );
myCone.lookAt( s2.position );
q2 = new THREE.Quaternion().copy( myCone.quaternion );
然后,在渲染循环中使用 slerp()
:
THREE.Quaternion.slerp( q1, q2, myCone.quaternion, time ); // 0 < time < 1
修改 fiddle 以演示概念:http://jsfiddle.net/1dtx78bj/22/。
three.js r.71
对于那些想要 lerp 位置 和 lookAt 的人,您可以从当前观察方向创建一个初始 lookAt 目标并将其 lerp 到最终目标:
function MoveWhileLookingAt(object: Object3D, destination: Vector3, lookAt: Vector3){
const fromPosition = object.position.clone();
const fromLookAt = new Vector3(
0,
.1, // To avoid initial camera flip on certain starting points (like top down view)
-object.position.distanceTo(lookAt) // THREE.Camera looks down negative Z. Remove the minus if working with a regular object.
);
object.localToWorld(fromLookAt);
const tempTarget = fromLookAt.clone();
function LookAtLerp(alpha: number){
// This goes in your render loop
object.position.lerpVectors(fromPosition, destination, alpha);
tempTarget.lerpVectors(fromLookAt, lookAt, alpha);
object.lookAt(tempTarget);
}
}