Skip to content
导览

相机管理器 CameraManager

相机管理器是用于控制云渲染相机的工具,通过获取该管理器,用户可以方便地进行相机控制和管理。 该工具的主要功能包括:

  1. 获取相机视角
  2. 获取节点的最佳观测位置
  3. 设置视角
  4. 飞向观察点+目标点
  5. 飞向某个点以欧拉角方向的方式
  6. 飞向某个点以向量方向的方式
  7. 设置是否允许键盘控制相机
  8. 获取是否允许键盘对相机进行控制
  9. 设置键盘控制相机时的移动速度

我们将提供详细的使用指南和功能说明,帮助用户更好地使用该工具。

cameraManager

用户可以调用云渲染实例 cloud 上的 getCameraManager() 方法来获取 CameraManager 相机管理器。

ts
const cameraManager = await cloud.getCameraManager()
const cameraManager = await cloud.getCameraManager()

用户调用 cloud.getCameraManager() 后,cameraManager 属性会被自动挂载到当前 cloud 实例上。

ts
await cloud.getCameraManager()
const cameraManager = cloud.cameraManager
await cloud.getCameraManager()
const cameraManager = cloud.cameraManager

获取相机视角 | getView

  • 说明:获取当前相机视角信息,以便用户设置自定义的视角效果

我们可以调用 CameraManager 上面的 getView 方法来获取当前云渲染的笛卡尔坐标系下的视角CartesianView

以笛卡尔坐标为基础的视角(CartesianView)

CartesianView 指的是笛卡尔坐标系下的视角或视图,也可以理解为在三维坐标系中以笛卡尔坐标为基础的视图。 使用getView 方法获取的笛卡儿视角主要包括:

  1. 相机位置 location
  2. 相机欧拉角 eularAngle
  3. 相机注视目标点坐标 focus

调用示例:

ts
const cameraManager = await cloud.getCameraManager()
const cameraView = await cameraManager.getView()
const cameraManager = await cloud.getCameraManager()
const cameraView = await cameraManager.getView()

获取节点的最佳观测位置 | getNodeObservationView

  • 说明:获取节点的最佳观测位置,用于设置节点的相机飞行定位

我们可以调用 CameraManager 上面的 getNodeObservationView 方法来获取传入节点的笛卡尔坐标系下的视角CartesianView

  • 参数说明
NameTypeDescription
nodeNode节点对象

调用示例:

ts
const cameraManager = await cloud.getCameraManager()
const sceManager = await cloud.getSceneManager()
const node: Node = await sceManager.getRoot()
const log = await cameraManager.getNodeObservationView(node)
const cameraManager = await cloud.getCameraManager()
const sceManager = await cloud.getSceneManager()
const node: Node = await sceManager.getRoot()
const log = await cameraManager.getNodeObservationView(node)

设置视角 | setView

  • 说明:设置相机视角,可以自定义相机视角信息

我们也可以使用 setView 直接设定当前的相机视角,它的输入参数是一个笛卡儿视角CartesianView。一般情况下,这个视角我们可以通过获取节点的最佳观测视角getNodeObservationView 获得,也可以自己设定一个自定义视角。

  • 参数说明
NameTypeDescription
cameraViewCartesianView当前相机视角信息,CartesianView

调用示例:

ts
let cameraManager = await cloud.getCameraManager();
let setViewObj = {
  location:{x:60.113468170166016, y:99.99943542480469, z:59.71105194091797},
  eulerAngle: {heading:-135, pitch:45, roll:0},
  focus: {x:57.613433837890625, y:96.46395111083984, z:57.21101760864258},
}
let log =  await cameraManager.setView(setViewObj);
let cameraManager = await cloud.getCameraManager();
let setViewObj = {
  location:{x:60.113468170166016, y:99.99943542480469, z:59.71105194091797},
  eulerAngle: {heading:-135, pitch:45, roll:0},
  focus: {x:57.613433837890625, y:96.46395111083984, z:57.21101760864258},
}
let log =  await cameraManager.setView(setViewObj);

飞向观察点+目标点 | flyToObserverPoint

  • 说明:设置飞向观察点+目标点 、三维模式

当我们知道一个目标点target和一个相机观察点的位置cameraPos,可以通过调用 flyToObserverPoint 来让相机在设定的时间内去飞行到观察点去观察这个目标点。

  • 参数说明
NameTypeDescription
cameraPosVector3观察点, 参数类型为 Vector3
targetVector3目标点, 参数类型为Vector3
timenumber飞行所经历的时间(毫秒)
Callback?any-

调用示例:

ts
const cameraManager = await cloud.getCameraManager()
const cameraPos: Vector3 = { x: 60, y: 69, z: 60 }
const target: Vector3 = { x: 0, y: 0, z: 0 }
const view = await cloud.cameraManager.flyToObserverPoint(cameraPos, target, 2000)
const cameraManager = await cloud.getCameraManager()
const cameraPos: Vector3 = { x: 60, y: 69, z: 60 }
const target: Vector3 = { x: 0, y: 0, z: 0 }
const view = await cloud.cameraManager.flyToObserverPoint(cameraPos, target, 2000)

飞向某个点以欧拉角方向的方式 | flyToEulerAnglePoint

  • 说明:飞向某个点以欧拉角方向的方式、三维模式

当我们知道一个目标点 target 和一个方向欧拉角Euler以及一个相机观察点的位置cameraPos,可以通过调用 flyToObserverPoint 来让相机在设定的时间内以特定的欧拉角Euler去飞行到观察点去观察这个目标点。

欧拉角(Euler angles)Euler

欧拉角(Euler angles)是一种用于描述物体在三维空间中旋转的方法,它由三个角度组成。 欧拉角的常见表示方式之一是 heading-pitch-roll(航向-俯仰-翻滚),也称为 yaw-pitch-roll(偏航-俯仰-翻滚)或者 Tait–Bryan angles(泰特-布莱恩角)。 这种表示方式将旋转分解为绕三个轴的旋转,分别是:

  1. 航向(heading)或者偏航(yaw):绕z轴旋转,通常用于描述物体在水平面上的方向,比如指南针的指向。
  2. 俯仰(pitch):绕y轴旋转,通常用于描述物体在垂直于水平面的方向上的姿态,比如飞机的爬升和俯冲。
  3. 翻滚(roll):绕x轴旋转,通常用于描述物体绕前后轴的旋转,比如飞机绕纵轴的滚转。
  • 参数说明
NameTypeDescription
cameraPosVector3观察点, 参数类型为 Vector3
directionVector3方向, 参数类型为 Vector3
focusVector3目标点, 参数类型为 Vector3
timenumber飞行所经历的时间(毫秒)
Callback?any-

调用示例:

ts
const cameraManager = await cloud.getCameraManager()
const cameraPos: Vector3 = { x: 60, y: 69, z: 60 }
const euler: Euler = { heading: -135, pitch: 45, roll: 0 }
const focus: Vector3 = { x: 50, y: 100, z: 50 }
const view = await cloud.cameraManager.flyToEulerAnglePoint(cameraPos, euler, focus, 2000)
const cameraManager = await cloud.getCameraManager()
const cameraPos: Vector3 = { x: 60, y: 69, z: 60 }
const euler: Euler = { heading: -135, pitch: 45, roll: 0 }
const focus: Vector3 = { x: 50, y: 100, z: 50 }
const view = await cloud.cameraManager.flyToEulerAnglePoint(cameraPos, euler, focus, 2000)

飞向某个点以向量方向的方式 | flyToDirectionPoint

  • 说明:飞向某个点以向量方向的方式、三维模式

当我们知道一个目标点 target 和一个向量方向Vector3以及一个相机观察点的位置cameraPos,可以通过调用 flyToObserverPoint 来让相机在设定的时间内以特定的向量方向Vector3去飞行到观察点去观察这个目标点。

向量角

在三维中,向量角是指用一个三维向量来表示两个向量之间的夹角,其中这两个向量可以是任意两个非零向量,不一定要是物体的朝向。

三维中的向量角指的是两个向量之间的夹角。

在三维空间中,一个向量可以用三个分量来表示,比如 (x,y,z),其中 x、y、z 分别表示向量在 x、y、z 三个轴上的投影长度。

当我们要求两个向量之间的夹角时,可以使用向量点乘公式 cosθ = (a·b) / (|a|·|b|),

其中 a、b 分别为两个向量,|a|、|b| 分别为它们的模长,· 表示向量点乘。

用这个公式可以计算出两个向量之间的夹角 θ,这个夹角的取值范围是 0 到 180 度。

如果两个向量的夹角为 0 度,说明它们重合;

如果夹角为 90 度,说明它们垂直;如果夹角为 180 度,说明它们相反。

  • 参数说明
NameTypeDescription
cameraPosVector3观察点, 参数类型为 Vector3
directionVector3方向, 参数类型为 Vector3
focusVector3目标点, 参数类型为 Vector3
timenumber飞行所经历的时间(毫秒)
Callback?any-

调用示例:

ts
const cameraManager = await cloud.getCameraManager()
const cameraPos: Vector3 = { x: 60, y: 100, z: 60 }
const direction: Vector3 = { x: 1, y: 0, z: 0 }
const focus: Vector3 = { x: 50, y: 100, z: 50 }
const view = await cloud.cameraManager.flyToDirectionPoint(cameraPos, direction, focus, 2000)
const cameraManager = await cloud.getCameraManager()
const cameraPos: Vector3 = { x: 60, y: 100, z: 60 }
const direction: Vector3 = { x: 1, y: 0, z: 0 }
const focus: Vector3 = { x: 50, y: 100, z: 50 }
const view = await cloud.cameraManager.flyToDirectionPoint(cameraPos, direction, focus, 2000)

向量角 和 欧拉角 的区别

向量角和欧拉角都是描述物体在空间中的朝向或姿态的方法,但它们的计算方式和物理意义有所不同。

向量角是指用一个三维向量表示物体在空间中的朝向。这个向量的方向与物体的朝向相同,长度为1,可以用三个分量表示。

向量角通常用于描述两个物体之间的相对朝向,或者一个物体在空间中的方向。在飞行控制中,向量角通常用于表示导航方向或者目标方向。

欧拉角是指将物体的旋转分解为三个绕不同轴的旋转,每个旋转的角度可以表示为一个标量,分别称为俯仰角、偏航角和滚转角。

欧拉角常用于描述物体在空间中的姿态,也可以用于描述飞行器的旋转姿态。

在飞行控制中,向量角和欧拉角都可以用于描述飞行器的朝向或姿态。然而,欧拉角更适用于描述飞行器的姿态,因为它可以明确地表示绕三个轴的旋转角度,而向量角则不能。

当飞行器需要到达某个点时,通常使用欧拉角来描述飞行器的姿态,并计算飞行器需要绕三个轴的旋转角度,以便到达目标点。

而向量角通常用于描述飞行器的导航方向或目标方向,以便飞行器可以朝着正确的方向前进。

设置是否允许键盘控制相机 | setKeyboardControlForCamera

  • 说明:设置是否允许键盘控制相机

我们可以调用 CameraManager 上面的 setKeyboardControlForCamera 方法来设置是否允许键盘控制相机。

  • 参数说明
NameTypeDescription
iskeyBoardCtrlbooleantrue允许

调用示例:

ts
let cameraManager = await cloud.getCameraManager();
await cameraManager.setKeyboardControlForCamera(true);
let cameraManager = await cloud.getCameraManager();
await cameraManager.setKeyboardControlForCamera(true);

获取是否允许键盘对相机进行控制 | isKeyboardControlForCamera

  • 说明:获取是否允许键盘对相机进行控制

我们可以调用 CameraManager 上面的 isKeyboardControlForCamera 方法来获取是否允许键盘对相机进行控制。

调用示例:

ts
let cameraManager = await cloud.getCameraManager();
const state = await cameraManager.isKeyboardControlForCamera();
let cameraManager = await cloud.getCameraManager();
const state = await cameraManager.isKeyboardControlForCamera();

设置键盘控制相机时的移动速度 | setCameraSpeed

  • 说明:设置键盘控制相机时的移动速度(不影响鼠标的控制速度)(默认速度2.5m/s)

我们可以调用 CameraManager 上面的 setCameraSpeed 方法来设置键盘控制相机时的移动速度。

  • 参数说明
NameTypeDescription
iskeyBoardCtrlbooleantrue允许

调用示例:

ts
let cameraManager = await cloud.getCameraManager();
await cameraManager.setCameraSpeed(5);
let cameraManager = await cloud.getCameraManager();
await cameraManager.setCameraSpeed(5);