如何在 3D space 中将相机直接移动到物体上方?

How do you move a camera directly above an object in 3D space?

我正在学习 ThreeJS 并试图理解一些基本概念。

假设我有一个 3D 相机 space,看着一些 target(在 camera.target 属性 中定义)。相机位于 x1, y1, z1.

我想添加一个功能,当激活时,将相机直接移动到目标上方,即它应该俯视 XY 平面,就像相机在天空中直视一样。

我的问题是,我如何在 ThreeJS 中做到这一点,以及您如何看待这个 conceptually/mathematically?

虽然您的问题看起来很简单,但这里有一个细微的问题,其中包含一些您可能会觉得有用的提示。

位置

是的,最简单的答案是指定相机的位置,其中 z 值是与目标的距离。

camera.position.set( 0, 0, distance )

但这只有在目标位于原点时才有效。如果你的目标是位置 ( 10, 20, 30 ) 怎么办?

您可以使用矢量数学来解决这个问题,three 已经为您准备好了。

  1. 创建一个 Vector3 并指定 位置,就好像 目标在原点。
let offset = new THREE.Vector3( 0, 0, distance )
  1. 将此矢量添加到目标的 position,并将其分配给相机的位置。
camera.position.addVectors( target.position, offset )
  1. 相机现在位于目标上方。

旋转

在任何一种情况下,简单地重新定位您的相机可能不足以让您的目标保持在视野范围内。移动相机后,您需要强制其注视目标。

camera.lookAt( target.position )

现在,lookAt 是一个相当简单的函数,可能不会产生您期望的相机胶卷。您需要通过调整其 upquaternion 或其他因素来确定如何最好地对此进行补偿。 (对此进行补偿不在本问题的范围内。)

全球与本地

另一个细微差别是您是希望相机在 全局 意义上还是 局部 意义上的部件“上方” .

如果您的相机和目标存在于全局 space 中(直接在您的 scene 中),那么上述说明将适合您的 use-case。

但是如果你的目标在全局 space 中旋转(即它的 +z 轴指向全局 +x 轴),但你想要相机的新方向要在目标“上方”,即它俯视目标的 -z 轴,那么您还需要补偿目标的旋转。幸运的是,three 还提供了可以完成此操作的数学函数。

camera.position.copy( offset )
camera.position.applyMatrix4( target.matrixWorld )

第一行将相机的位置设置为“目标在原点”的位置。第二行使用目标的世界变换矩阵更新该向量,有效地将其转换为目标的 space.

动画

从字里行间看出,您可能想要将此过程动画化。有多种可用的动画库,您需要找到适合您的需要和目的的一个。也就是说,在 Stack Overflow 上也有很多关于动画的问题,如果您遇到任何阻力,我相信您可以找到人来回答您关于该主题的问题。