相机管理器 CameraManager
相机管理器是用于控制云渲染相机的工具,通过获取该管理器,用户可以方便地进行相机控制和管理。 该工具的主要功能包括:
- 获取相机视角
- 获取节点的最佳观测位置
- 设置视角
- 飞向观察点+目标点
- 飞向某个点以欧拉角方向的方式
- 飞向某个点以向量方向的方式
- 设置是否允许键盘控制相机
- 获取是否允许键盘对相机进行控制
- 设置键盘控制相机时的移动速度
我们将提供详细的使用指南和功能说明,帮助用户更好地使用该工具。
cameraManager
用户可以调用云渲染实例 cloud
上的 getCameraManager()
方法来获取 CameraManager
相机管理器。
const cameraManager = await cloud.getCameraManager()
const cameraManager = await cloud.getCameraManager()
用户调用 cloud.getCameraManager()
后,cameraManager
属性会被自动挂载到当前 cloud
实例上。
await cloud.getCameraManager()
const cameraManager = cloud.cameraManager
await cloud.getCameraManager()
const cameraManager = cloud.cameraManager
获取相机视角 | getView
- 说明:获取当前相机视角信息,以便用户设置自定义的视角效果
我们可以调用 CameraManager
上面的 getView
方法来获取当前云渲染的笛卡尔坐标系下的视角CartesianView
。
以笛卡尔坐标为基础的视角(CartesianView)
CartesianView
指的是笛卡尔坐标系下的视角或视图,也可以理解为在三维坐标系中以笛卡尔坐标为基础的视图。 使用getView
方法获取的笛卡儿视角主要包括:
- 相机位置
location
- 相机欧拉角
eularAngle
- 相机注视目标点坐标
focus
调用示例:
const cameraManager = await cloud.getCameraManager()
const cameraView = await cameraManager.getView()
const cameraManager = await cloud.getCameraManager()
const cameraView = await cameraManager.getView()
获取节点的最佳观测位置 | getNodeObservationView
- 说明:获取节点的最佳观测位置,用于设置节点的相机飞行定位
我们可以调用 CameraManager
上面的 getNodeObservationView
方法来获取传入节点的笛卡尔坐标系下的视角CartesianView
。
- 参数说明
Name | Type | Description |
---|---|---|
node | Node | 节点对象 |
调用示例:
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
获得,也可以自己设定一个自定义视角。
- 参数说明
Name | Type | Description |
---|---|---|
cameraView | CartesianView | 当前相机视角信息,CartesianView |
调用示例:
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
来让相机在设定的时间内去飞行到观察点去观察这个目标点。
- 参数说明
Name | Type | Description |
---|---|---|
cameraPos | Vector3 | 观察点, 参数类型为 Vector3 |
target | Vector3 | 目标点, 参数类型为Vector3 |
time | number | 飞行所经历的时间(毫秒) |
Callback? | any | - |
调用示例:
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(泰特-布莱恩角)。 这种表示方式将旋转分解为绕三个轴的旋转,分别是:
- 航向(heading)或者偏航(yaw):绕z轴旋转,通常用于描述物体在水平面上的方向,比如指南针的指向。
- 俯仰(pitch):绕y轴旋转,通常用于描述物体在垂直于水平面的方向上的姿态,比如飞机的爬升和俯冲。
- 翻滚(roll):绕x轴旋转,通常用于描述物体绕前后轴的旋转,比如飞机绕纵轴的滚转。
- 参数说明
Name | Type | Description |
---|---|---|
cameraPos | Vector3 | 观察点, 参数类型为 Vector3 |
direction | Vector3 | 方向, 参数类型为 Vector3 |
focus | Vector3 | 目标点, 参数类型为 Vector3 |
time | number | 飞行所经历的时间(毫秒) |
Callback? | any | - |
调用示例:
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 度,说明它们相反。
- 参数说明
Name | Type | Description |
---|---|---|
cameraPos | Vector3 | 观察点, 参数类型为 Vector3 |
direction | Vector3 | 方向, 参数类型为 Vector3 |
focus | Vector3 | 目标点, 参数类型为 Vector3 |
time | number | 飞行所经历的时间(毫秒) |
Callback? | any | - |
调用示例:
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
方法来设置是否允许键盘控制相机。
- 参数说明
Name | Type | Description |
---|---|---|
iskeyBoardCtrl | boolean | true允许 |
调用示例:
let cameraManager = await cloud.getCameraManager();
await cameraManager.setKeyboardControlForCamera(true);
let cameraManager = await cloud.getCameraManager();
await cameraManager.setKeyboardControlForCamera(true);
获取是否允许键盘对相机进行控制 | isKeyboardControlForCamera
- 说明:获取是否允许键盘对相机进行控制
我们可以调用 CameraManager
上面的 isKeyboardControlForCamera
方法来获取是否允许键盘对相机进行控制。
调用示例:
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
方法来设置键盘控制相机时的移动速度。
- 参数说明
Name | Type | Description |
---|---|---|
iskeyBoardCtrl | boolean | true允许 |
调用示例:
let cameraManager = await cloud.getCameraManager();
await cameraManager.setCameraSpeed(5);
let cameraManager = await cloud.getCameraManager();
await cameraManager.setCameraSpeed(5);