P4

Physics-based Simulation

本章定位:理解物理仿真器如何将力/力矩转换为关节旋转


一、物理仿真概述

1.1 本章要解决的问题

输入

  • 当前状态:位置 \(x\)、旋转 \(R\)、速度 \(v\)、角速度 \(\omega\)
  • 外力/力矩:重力、风力、关节力矩(由控制器生成)
  • 约束条件:关节约束、接触约束

输出

  • 下一帧状态:新位置 \(x'\)、新旋转 \(R'\)、新速度 \(v'\)、新角速度 \(\omega'\)

核心问题

给定关节力矩,角色为什么会这样动?


1.2 仿真器与控制器的关系

flowchart LR
    subgraph "控制器"
        C[输入:目标状态/轨迹<br/>输出:关节力矩 τ]
    end

    subgraph "仿真器"
        S[输入:关节力矩 τ<br/>输出:新状态 x', R', v', ω']
    end

    控制器 -- 关节力矩 τ --> 仿真器
    仿真器 -- 新状态<br/>x, R, v, ω --> 控制器
模块输入输出核心问题
控制器目标状态/轨迹关节力矩 τ如何生成力矩让角色达到目标?
仿真器关节力矩 τ新状态给定力矩,角色会如何运动?

分工说明

  • 控制器是「逆向问题」:从目标反推力矩
  • 仿真器是「前向问题」:从力矩推算运动

1.3 仿真 Pipeline

根据考虑的约束复杂度,仿真 Pipeline 分为三种:

flowchart TD
    A[当前状态<br/>x, R, v, ω]
    B[计算外力<br/>重力、风力、关节力矩τ]
    C{约束类型?}

    subgraph "Pipeline 1:无约束"
        D1[求解约束力<br/>无约束力]
    end

    subgraph "Pipeline 2:关节约束"
        D2[求解约束力 Jᵀλ<br/>关节约束方程]
    end

    subgraph "Pipeline 3:关节 + 接触"
        D3[接触检测]
        E3[求解约束力<br/>Jᵀλ + 接触力 + 摩擦力]
        D3 --> E3
    end

    A --> B
    B --> C

    C -->|无关节约束 | D1
    C -->|有关节约束 | D2
    C -->|有关节约束 + 接触 | D3

    D1 --> E[积分更新状态<br/>x' = x + v·dt<br/>R', v', ω']
    D2 --> E
    E3 --> E

Pipeline 1:不考虑关节约束

  • 每个刚体独立运动
  • 适用于自由物体(如抛射物)
  • 不适用于角色(角色有关节连接)

Pipeline 2:考虑关节约束

  • 关节约束防止刚体分离
  • 需求解约束力 \(J^T\lambda\)
  • 适用于 Ragdoll、无主动控制的角色

Pipeline 3:考虑关节约束 + 接触摩擦

  • 接触约束防止穿透地面
  • 摩擦力防止滑动
  • 适用于站立、行走的角色

📚 深入学习