如何在 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
已经为您准备好了。
- 创建一个
Vector3
并指定 位置,就好像 目标在原点。
let offset = new THREE.Vector3( 0, 0, distance )
- 将此矢量添加到目标的
position
,并将其分配给相机的位置。
camera.position.addVectors( target.position, offset )
- 相机现在位于目标上方。
旋转
在任何一种情况下,简单地重新定位您的相机可能不足以让您的目标保持在视野范围内。移动相机后,您需要强制其注视目标。
camera.lookAt( target.position )
现在,lookAt
是一个相当简单的函数,可能不会产生您期望的相机胶卷。您需要通过调整其 up
、quaternion
或其他因素来确定如何最好地对此进行补偿。 (对此进行补偿不在本问题的范围内。)
全球与本地
另一个细微差别是您是希望相机在 全局 意义上还是 局部 意义上的部件“上方” .
如果您的相机和目标存在于全局 space 中(直接在您的 scene
中),那么上述说明将适合您的 use-case。
但是如果你的目标在全局 space 中旋转(即它的 +z
轴指向全局 +x
轴),但你想要相机的新方向要在目标“上方”,即它俯视目标的 -z
轴,那么您还需要补偿目标的旋转。幸运的是,three
还提供了可以完成此操作的数学函数。
camera.position.copy( offset )
camera.position.applyMatrix4( target.matrixWorld )
第一行将相机的位置设置为“目标在原点”的位置。第二行使用目标的世界变换矩阵更新该向量,有效地将其转换为目标的 space.
动画
从字里行间看出,您可能想要将此过程动画化。有多种可用的动画库,您需要找到适合您的需要和目的的一个。也就是说,在 Stack Overflow 上也有很多关于动画的问题,如果您遇到任何阻力,我相信您可以找到人来回答您关于该主题的问题。
我正在学习 ThreeJS 并试图理解一些基本概念。
假设我有一个 3D 相机 space,看着一些 target
(在 camera.target
属性 中定义)。相机位于 x1, y1, z1
.
我想添加一个功能,当激活时,将相机直接移动到目标上方,即它应该俯视 XY
平面,就像相机在天空中直视一样。
我的问题是,我如何在 ThreeJS 中做到这一点,以及您如何看待这个 conceptually/mathematically?
虽然您的问题看起来很简单,但这里有一个细微的问题,其中包含一些您可能会觉得有用的提示。
位置
是的,最简单的答案是指定相机的位置,其中 z
值是与目标的距离。
camera.position.set( 0, 0, distance )
但这只有在目标位于原点时才有效。如果你的目标是位置 ( 10, 20, 30 )
怎么办?
您可以使用矢量数学来解决这个问题,three
已经为您准备好了。
- 创建一个
Vector3
并指定 位置,就好像 目标在原点。
let offset = new THREE.Vector3( 0, 0, distance )
- 将此矢量添加到目标的
position
,并将其分配给相机的位置。
camera.position.addVectors( target.position, offset )
- 相机现在位于目标上方。
旋转
在任何一种情况下,简单地重新定位您的相机可能不足以让您的目标保持在视野范围内。移动相机后,您需要强制其注视目标。
camera.lookAt( target.position )
现在,lookAt
是一个相当简单的函数,可能不会产生您期望的相机胶卷。您需要通过调整其 up
、quaternion
或其他因素来确定如何最好地对此进行补偿。 (对此进行补偿不在本问题的范围内。)
全球与本地
另一个细微差别是您是希望相机在 全局 意义上还是 局部 意义上的部件“上方” .
如果您的相机和目标存在于全局 space 中(直接在您的 scene
中),那么上述说明将适合您的 use-case。
但是如果你的目标在全局 space 中旋转(即它的 +z
轴指向全局 +x
轴),但你想要相机的新方向要在目标“上方”,即它俯视目标的 -z
轴,那么您还需要补偿目标的旋转。幸运的是,three
还提供了可以完成此操作的数学函数。
camera.position.copy( offset )
camera.position.applyMatrix4( target.matrixWorld )
第一行将相机的位置设置为“目标在原点”的位置。第二行使用目标的世界变换矩阵更新该向量,有效地将其转换为目标的 space.
动画
从字里行间看出,您可能想要将此过程动画化。有多种可用的动画库,您需要找到适合您的需要和目的的一个。也就是说,在 Stack Overflow 上也有很多关于动画的问题,如果您遇到任何阻力,我相信您可以找到人来回答您关于该主题的问题。