前言
最近做的本科毕设中有一部分的工作是要对缝合线进行仿真,老师推荐用 Cosserat Rod 模型对缝合线建模,于是我就查阅了很多关于 Cosserat Rod 的资料,并以本文作为学习笔记。
本文首先介绍了描述空间曲线的 TNB Frame 和 Darboux Vector,然后以此为基础介绍了 Cosserat Rod 模型的相关理论,最后根据 Position and Orientation Based Cosserat Rods 这篇论文介绍了 Cosserat Rod 的离散形式以及如何用 PBD 算法进行仿真。
TNB Frame
大多数的对缝合线、毛发、绳子等物体仿真使用的模型都是线型模型,也就是要对空间曲线的运动进行模拟。因此首先介绍一下 TNB Frame 的相关理论。
TNB Frame(中文翻译应该是 TNB 框架或者 TNB 参考系?)也叫作 Frenet–Serret frame,是由这两个人分别独立研究提出来的理论,所以以这两个人的名字命名。TNB Frame 理论描述了一个粒子沿着三维空间中连续可微曲线的运动。所谓的 “TNB”,指的是三维空间中的一组正交基,即三个相互垂直的单位向量:
- T:Tangent,曲线的单位切向量;
- N:Normal,曲线的单位法向量;
- B:Binormal,曲线的单位副法向量;
假设空间曲线的方程定义为 r(s)\boldsymbol{r}(s)r(s),其中 sss 表示弧长且 s∈[0,L]s\in[0,L]s∈[0,L],那么 TNB 三个向量可以通过 r(s)\boldsymbol{r}(s)r(s) 计算得到:
首先单位切向量 T=drds/∣∣drds∣∣\boldsymbol{T}=\frac{d\boldsymbol{r}}{ds}/||\frac{d\boldsymbol{r}}{ds}||T=dsdr/∣∣dsdr∣∣ ,它指向了粒子在曲线当前位置运动的前进方向,而 dTds\frac{d\boldsymbol{T}}{ds}dsdT 则可以表示这个粒子的加速度的方向,注意我们这里的速度和加速度的定义不是严格的物理意义的定义,而是为了方便描述曲线才假设有个粒子在曲线上面运动,并给粒子赋予了速度和加速度,用同样为标量的弧长 sss 的变化替代时间变化。曲线的曲率 κ(s)=∣∣dTds∣∣\kappa(s)=||\frac{d\boldsymbol{T}}{ds}||κ(s)=∣∣dsdT∣∣,则单位法向量 N=1κdTds\boldsymbol{N}=\frac{1}{\kappa}\frac{d\boldsymbol{T}}{ds}N=κ1dsdT 。TNB 三个向量组成了正交基,因此单位副法向量 B=T×N\boldsymbol{B}=\boldsymbol{T}\times\boldsymbol{N}B=T×N 。总体来说,假设有一个粒子沿着曲线匀速运动,那么 T\boldsymbol{T}T 就是这个粒子的速度方向,N\boldsymbol{N}N 是这个粒子的加速度方向,B\boldsymbol{B}B 则垂直于上面两个方向。总结一下:
- T=drds/∣∣drds∣∣\boldsymbol{T}=\frac{d\boldsymbol{r}}{ds}/||\frac{d\boldsymbol{r}}{ds}||T=dsdr/∣∣dsdr∣∣
- N=1κdTds\boldsymbol{N}=\frac{1}{\kappa}\frac{d\boldsymbol{T}}{ds}N=κ1dsdT,其中曲率 κ(s)=∣∣dTds∣∣\kappa(s)=||\frac{d\boldsymbol{T}}{ds}||κ(s)=∣∣dsdT∣∣
- B=T×N\boldsymbol{B}=\boldsymbol{T}\times\boldsymbol{N}B=T×N
TNB Frame 的相关理论中有一套公式 Frenet–Serret formulas:
dTds=κNdNds=−κT+τBdBds=−τN
\begin{aligned}
\frac{d\boldsymbol{T}}{ds}&=\kappa\boldsymbol{N} \\
\frac{d\boldsymbol{N}}{ds}&=-\kappa\boldsymbol{T}+\tau\boldsymbol{B}\\
\frac{d\boldsymbol{B}}{ds}&=-\tau\boldsymbol{N}
\end{aligned}
dsdTdsdNdsdB=κN=−κT+τB=−τN
其中 κ\kappaκ 在前面说过了表示的是曲率(curvature),τ\tauτ 表示的是曲线的扭率(torsion),两者都可以反推回来计算出来:
κ(s)=∣∣dTds∣∣τ(s)=−N⋅dBds
\begin{aligned}
\kappa(s)&=||\frac{d\boldsymbol{T}}{ds}||\\
\tau(s)&=-\boldsymbol{N}\cdot\frac{d\boldsymbol{B}}{ds}
\end{aligned}
κ(s)τ(s)=∣∣dsdT∣∣=−N⋅dsdB
其中 τ\tauτ 的计算公式成立是因为 N\boldsymbol{N}N 为单位向量。从直观上来说,曲率 κ\kappaκ 刻画了曲线的弯曲程度(刻画了 B\boldsymbol{B}B 的转动),扭率 τ\tauτ 刻画了曲线的扭曲程度(刻画了 T\boldsymbol{T}T 的转动)。
上面的叙述可能有点乱,但是从实际运用的角度来说,一般情况下空间曲线 r(s)\boldsymbol{r}(s)r(s) 是已知的,其他的相关量 {T,N,B,κ,τ}\{\boldsymbol{T},\boldsymbol{N},\boldsymbol{B},\kappa,\tau\}{T,N,B,κ,τ} 都可以计算出来。
Darboux Vector
达布向量 ω\boldsymbol{\omega}ω 描述的是 TNB Frame 中三个单位向量基的转动,定义为 ω=ωT+ωN+ωB\boldsymbol{\omega}=\boldsymbol{\omega_{T}}+\boldsymbol{\omega_{N}}+\boldsymbol{\omega_{B}}ω=ωT+ωN+ωB ,其中后面三个 ωx\boldsymbol{\omega_{x}}ωx 分别描述 TNB 三个单位向量的略面速度,例如
ωT=limΔt→0T(t)×T(t+Δt)2Δt=T×T′2
\boldsymbol{\omega_{T}}=\lim_{\Delta t\rightarrow 0}{\frac{\boldsymbol{T}(t)\times\boldsymbol{T}(t+\Delta t)}{2\Delta t}} =\frac{\boldsymbol{T}\times\boldsymbol{T'}}{2}
ωT=Δt→0lim2ΔtT(t)×T(t+Δt)=2T×T′
根据定义可以将 ω\boldsymbol{\omega}ω 的计算公式简化得到
ω=τT+κB
\boldsymbol{\omega}=\tau\boldsymbol{T}+\kappa\boldsymbol{B}
ω=τT+κB
达布向量具有如下性质:
T′=ω×TN′=ω×NB′=ω×B
\begin{aligned}
\boldsymbol{T}'&=\boldsymbol{\omega}\times\boldsymbol{T}\\
\boldsymbol{N}'&=\boldsymbol{\omega}\times\boldsymbol{N}\\
\boldsymbol{B}'&=\boldsymbol{\omega}\times\boldsymbol{B}\\
\end{aligned}
T′N′B′=ω×T=ω×N=ω×B
结合我们熟知的公式 v=ω×r\boldsymbol{v}=\boldsymbol{\omega}\times\boldsymbol{r}v=ω×r 来看达布向量可以发现,达布向量类似于 TNB Frame 里面的角速度。
Cosserat Rod

在 Cosserat Rod 理论中认为线型模型的长度远远大于横截面半径,即 L>>rL>>rL>>r,在使用时直接认为是一段空间曲线。有两个坐标系,一个是全局的坐标系 {e1,e2,e3}\{\boldsymbol{e}_1,\boldsymbol{e}_2,\boldsymbol{e}_3\}{e1,e2,e3},另一个是与弧长 sss 相关的局部坐标系 {d1(s),d2(s),d3(s)}\{\boldsymbol{d}_1(s),\boldsymbol{d}_2(s),\boldsymbol{d}_3(s)\}{d1(s),d2(s),d3(s)} ,在局部坐标系中,{d1(s),d2(s)}\{\boldsymbol{d}_1(s),\boldsymbol{d}_2(s)\}{d1(s),d2(s)} 构成了曲线上某一个点的横截面,而 d3(s)\boldsymbol{d}_3(s)d3(s) 是这个横截面的法向量,注意这个 d3(s)\boldsymbol{d}_3(s)d3(s) 不一定要和曲线切线 dr(s)ds\frac{d\boldsymbol{r}(s)}{ds}dsdr(s) 同方向,当它们方向不同时说明在 sss 处有剪切。
可以看出 Cosserat Rod 局部坐标系的定义和 TNB Frame 很相似,唯一不同的就是它不严格要求空间曲线一定连续可微。
关于全局坐标系和局部坐标系的变换,我们可以看成是一种旋转,定义表示旋转的四元数 q(s)q(s)q(s),则有
dk=qekq∗
d_k=qe_kq^*
dk=qekq∗
Cosserat Rod 模型的好处在于,它可以度量线型模型的延展(stretch)、剪切(shear)、弯曲(bend)和扭转(twist)四种应变,因此可以更加真实地模拟线型物体的物理运动。
定义
Γ(s)=dr(s)ds−d3(s)
\boldsymbol{\Gamma}(s)=\frac{d\boldsymbol{r}(s)}{ds}-\boldsymbol{d}_3(s)
Γ(s)=dsdr(s)−d3(s)
用于度量曲线的延展和剪切应变,d3(s)\boldsymbol{d}_3(s)d3(s) 和 dr(s)ds\frac{d\boldsymbol{r}(s)}{ds}dsdr(s) 的方向关系表示了其剪切应变,d3(s)\boldsymbol{d}_3(s)d3(s) 和 dr(s)ds\frac{d\boldsymbol{r}(s)}{ds}dsdr(s) 的长度关系表示了其延展应变。
定义
Δω=ω−ω0
\Delta\omega=\omega-\omega^0
Δω=ω−ω0
用于度量曲线的弯曲和扭转应变,其中 ω\omegaω 对应达布向量 ω\boldsymbol{\omega}ω 的四元数,上标 000 表示初始值。在上一个部分中我们知道了达布向量的计算方法
ω=12∑k=13dk×dk′
\boldsymbol{\omega}=\frac{1}{2}\sum_{k=1}^3{\boldsymbol{d}_k\times\boldsymbol{d}_k'}
ω=21k=1∑3dk×dk′
也知道了达布向量 ω\boldsymbol{\omega}ω 描述了{d1(s),d2(s),d3(s)}\{\boldsymbol{d}_1(s),\boldsymbol{d}_2(s),\boldsymbol{d}_3(s)\}{d1(s),d2(s),d3(s)} 随着 sss 的变化的角速度,因此可以发现达布向量的前两个元素 {ω1,ω2}\{\omega_1,\omega_2\}{ω1,ω2} 描述了曲线的弯曲应变(影响的是曲率),而最后一个元素 ω3\omega_3ω3 描述了曲线的扭转应变(影响的是扭率)。
结合局部坐标系和全局坐标系的变换四元数 qqq ,我们可以将两个应变度量函数改写为
Γ(s)=R(q)Tdr(s)ds−e3Δω=2(q∗q′−q∗0q′0)(1)
\begin{aligned}
\boldsymbol{\Gamma}(s)&=\boldsymbol{R}(q)^T\frac{d\boldsymbol{r}(s)}{ds}-\boldsymbol{e}_3 \\
\Delta\omega&=2(q^*q'-q^{*0}q'^0)
\end{aligned}
\tag{1}
Γ(s)Δω=R(q)Tdsdr(s)−e3=2(q∗q′−q∗0q′0)(1)
其中 R(q)\boldsymbol{R}(q)R(q) 为四元数 qqq 对应的旋转矩阵(qvq∗qvq^*qvq∗ 与 R(q)v\boldsymbol{R}(q)\boldsymbol{v}R(q)v 表示同一种旋转变换,相互可以推导,过程比较复杂所以这里省略了),q′q'q′ 为四元数的导数,有 q′=12qωq'=\frac{1}{2}q\omegaq′=21qω 。
离散形式的 Cosserat Rod
物理仿真算法中都是对离散节点的运动进行仿真,因此 Position and Orientation Based Cosserat Rods 这篇论文构建了离散形式的 Cosserat Rod,并且成功套用了 PBD 的约束作用于节点位置和节点间的四元数。

假设曲线由 n 个节点 xk\boldsymbol{x}_kxk 组成,那么相邻节点之间还添加了一个表示一段杆(rod)的节点 qk−12q_{k-\frac{1}{2}}qk−21 。
在杆节点处构建约束最小化延展和剪切应变,在位置节点处构建约束最小化弯曲和扭转,于是我们需要把原本公式 (1) 中的一些量进行离散化处理。对于 dr(s)ds\frac{d\boldsymbol{r}(s)}{ds}dsdr(s) 离散化为 dr(s)ds≈1l(xi+1−xi)\frac{d\boldsymbol{r}(s)}{ds}\approx \frac{1}{l}(\boldsymbol{x}_{i+1}-\boldsymbol{x}_i)dsdr(s)≈l1(xi+1−xi) ,其中 lll 表示杆节点的长度;对于 ω\boldsymbol{\omega}ω 离散化为 ω≈2lς(qi−12∗qi+12)\boldsymbol{\omega}\approx \frac{2}{l}\varsigma(q^*_{i-\frac{1}{2}}q_{i+\frac{1}{2}})ω≈l2ς(qi−21∗qi+21) ,其中 ς\varsigmaς 表示取四元数的向量部分,这个离散化的推导我看了相关论文还不明白,之后有时间再慢慢去学习吧。
离散化之后的方程变为
Γi+12≈1l(xi+1−xi)−ς(qi+12e3qi+12∗)Δω≈2lς(qi−12∗qi+12−qi−12∗0qi+120)(2)
\begin{aligned}
\boldsymbol{\Gamma}_{i+\frac{1}{2}}&\approx \frac{1}{l}(\boldsymbol{x}_{i+1}-\boldsymbol{x}_i)-\varsigma(q_{i+\frac{1}{2}}e_3q^*_{i+\frac{1}{2}}) \\
\Delta\boldsymbol{\omega}&\approx \frac{2}{l}\varsigma(q^*_{i-\frac{1}{2}}q_{i+\frac{1}{2}}-q^{*0}_{i-\frac{1}{2}}q^0_{i+\frac{1}{2}})
\end{aligned}
\tag{2}
Γi+21Δω≈l1(xi+1−xi)−ς(qi+21e3qi+21∗)≈l2ς(qi−21∗qi+21−qi−21∗0qi+210)(2)
那么对于 PBD 中如何构建约束,只要把位置 xi\boldsymbol{x}_ixi 和表示转动的四元数 qi−12q_{i-\frac{1}{2}}qi−21 当成被约束量,根据公式 (2) 令它们等于 000 即可:
Cs(p1,p2,q)=1l(p2−p1)−R(q)e3=0Cb(q,u)=ς(q∗u−q∗0u0)=ω−sω0(3)
\begin{aligned}
\boldsymbol{C_s}(\boldsymbol{p}_1,\boldsymbol{p}_2,q)&=\frac{1}{l}(\boldsymbol{p}_2-\boldsymbol{p}_1)-\boldsymbol{R}(q)\boldsymbol{e}_3=\boldsymbol{0} \\
\boldsymbol{C_b}(q,u)&=\varsigma(q^*u-q^{*0}u^0)=\boldsymbol{\omega}-s\boldsymbol{\omega}^0
\end{aligned}
\tag{3}
Cs(p1,p2,q)Cb(q,u)=l1(p2−p1)−R(q)e3=0=ς(q∗u−q∗0u0)=ω−sω0(3)
其中
s={+1if ∣ω−ω0∣2<∣ω+ω0∣2−1if ∣ω−ω0∣2>∣ω+ω0∣2
s=
\left \{
\begin{array}{lr}
+1 & \text{if } |\boldsymbol{\omega}-\boldsymbol{\omega}^0|^2<|\boldsymbol{\omega}+\boldsymbol{\omega}^0|^2 \\
-1 & \text{if } |\boldsymbol{\omega}-\boldsymbol{\omega}^0|^2>|\boldsymbol{\omega}+\boldsymbol{\omega}^0|^2
\end{array}
\right.
s={+1−1if ∣ω−ω0∣2<∣ω+ω0∣2if ∣ω−ω0∣2>∣ω+ω0∣2
因为四元数 +q+q+q 和 −q-q−q 描述的是同一种转动,所以要加一个 sss 变量来确定初始值的唯一性。
根据 PBD 算法的公式可以得到每一帧的更新方程,对于约束 Cs\boldsymbol{C_s}Cs,更新方程为
Δp1=+w1lw1+w2+4wql2(1l(p2−p1)−d3)Δp2=−w2lw1+w2+4wql2(1l(p2−p1)−d3)Δq=+wqlw1+w2+4wql2(1l(p2−p1)−d3)qe3∗
\begin{aligned}
\Delta\boldsymbol{p}_1 &= +\frac{w_1l}{w_1+w_2+4w_ql^2}(\frac{1}{l}(\boldsymbol{p}_2-\boldsymbol{p}_1)-\boldsymbol{d}_3) \\
\Delta\boldsymbol{p}_2 &= -\frac{w_2l}{w_1+w_2+4w_ql^2}(\frac{1}{l}(\boldsymbol{p}_2-\boldsymbol{p}_1)-\boldsymbol{d}_3) \\
\Delta q &= +\frac{w_ql}{w_1+w_2+4w_ql^2}(\frac{1}{l}(\boldsymbol{p}_2-\boldsymbol{p}_1)-\boldsymbol{d}_3)qe^*_3
\end{aligned}
Δp1Δp2Δq=+w1+w2+4wql2w1l(l1(p2−p1)−d3)=−w1+w2+4wql2w2l(l1(p2−p1)−d3)=+w1+w2+4wql2wql(l1(p2−p1)−d3)qe3∗
对于约束 Cb\boldsymbol{C_b}Cb ,更新方程为
Δq=+wqwq+wuu(ω−sω0)Δu=−wuwq+wuq(ω−sω0)
\begin{aligned}
\Delta q &= +\frac{w_q}{w_q+w_u}u(\omega-s\omega^0) \\
\Delta u &= -\frac{w_u}{w_q+w_u}q(\omega-s\omega^0)
\end{aligned}
ΔqΔu=+wq+wuwqu(ω−sω0)=−wq+wuwuq(ω−sω0)