mirror of
https://github.com/galacean/engine.git
synced 2026-06-03 09:14:01 +08:00
73 lines
2.9 KiB
Plaintext
73 lines
2.9 KiB
Plaintext
---
|
||
order: 2
|
||
title: 物理场景
|
||
type: 物理
|
||
label: Physics
|
||
---
|
||
|
||
物理场景([PhysicsScene](/apis/core/#PhysicsScene))用于管理场景中所有的物理组件,并且负责与物理后端通信,实现有关物理场景的全局操作,例如更新和射线检测等等。在多场景项目中,每个[Scene](/apis/core/Scene)都有自己的物理场景,Scene之间的物理系统是相互隔离互不影响的。
|
||
|
||
## 物理更新
|
||
|
||
物理场景和渲染场景相互独立,但在程序运行过程中不断同步各自的数据。因此,和[脚本](/docs/script/script)一样,同步的时序也非常重要。物理场景的更新频率和渲染场景不同,通过以下参数进行控制:
|
||
```typescript
|
||
/** 物理场景的固定更新时间步长(秒) */
|
||
fixedTimeStep: number = 1 / 60;
|
||
```
|
||
|
||
### 更新机制
|
||
|
||
- 每个渲染帧中,物理引擎会按照固定时间步长 [fixedTimeStep](/apis/core/#PhysicsScene-fixedTimeStep) 进行更新
|
||
- 如果实际帧间隔大于 `fixedTimeStep`:
|
||
- 会执行多次物理更新直到追赶上实际时间
|
||
- 单帧最大更新时间由 `engine.time.maximumDeltaTime` 限制
|
||
- 如果实际帧间隔小于 `fixedTimeStep`,则累积到下一帧处理
|
||
|
||
### 物理更新回调
|
||
|
||
针对物理组件的更新,需要使用[脚本](/docs/script/script)中专门的回调函数:
|
||
```typescript
|
||
export class Script extends Component {
|
||
/**
|
||
* 在物理计算前调用,调用次数取决于物理更新频率
|
||
*/
|
||
onPhysicsUpdate(): void {}
|
||
}
|
||
```
|
||
|
||
物理更新在整个更新流程中的位置可以参考下图
|
||
<Image src="https://gw.alipayobjects.com/mdn/rms_7c464e/afts/img/A*_8C-TJP2UIgAAAAAAAAAAAAAARQnAQ" />
|
||
|
||
### 物理系统内部更新流程
|
||
|
||
物理场景在更新时的执行顺序:
|
||
|
||
1. 执行 `onPhysicsUpdate` 中的用户逻辑
|
||
2. `callColliderOnUpdate` 将被修改的 [实体](/apis/core/#Entity) `Transform` 数据同步给物理碰撞器
|
||
3. 更新物理场景
|
||
4. `callColliderOnLateUpdate` 将所有 [碰撞器](/docs/physics/collider/overview) 更新后的位置同步给对应的 `实体`
|
||
|
||
## 设置场景重力
|
||
|
||
物理场景允许自定义重力方向和大小。重力会影响场景中所有启用重力的[动态碰撞器](/docs/physics/collider/dynamicCollider)。
|
||
|
||
```typescript
|
||
// 获取物理场景的重力值
|
||
const gravity = scene.physics.gravity;
|
||
|
||
// 修改重力 - 将重力改为 0
|
||
scene.physics.gravity.set(0, 0, 0);
|
||
|
||
// 修改重力 - 设置为地球重力加速度 (默认值)
|
||
scene.physics.gravity.set(0, -9.81, 0);
|
||
```
|
||
|
||
## 空间查询功能
|
||
|
||
物理场景提供了多种空间查询功能,用于检测和分析场景中物体的空间关系:
|
||
|
||
- **[射线检测](/docs/physics/query/raycast)** - 精确的点对点检测,适用于拾取、瞄准等场景
|
||
- **[形状投射](/docs/physics/query/sweep)** - 沿方向投射几何体,适用于移动预测、路径规划
|
||
- **[重叠检测](/docs/physics/query/overlap)** - 检测区域内的重叠物体,适用于触发器、范围攻击
|
||
|