前言
最近做的本科毕设中有一部分的工作是要对缝合线进行仿真,老师推荐用 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),其中 s s s 表示弧长且 s ∈ [ 0 , L ] s\in[0,L] s∈[0,L],那么 TNB 三个向量可以通过 r ( s ) \boldsymbol{r}(s) r(s) 计算得到:
首先单位切向量 T = d r d s / ∣ ∣ d r d s ∣ ∣ \boldsymbol{T}=\frac{d\boldsymbol{r}}{ds}/||\frac{d\boldsymbol{r}}{ds}|| T=dsdr/∣∣dsdr∣∣ ,它指向了粒子在曲线当前位置运动的前进方向,而 d T d s \frac{d\boldsymbol{T}}{ds} dsdT 则可以表示这个粒子的加速度的方向,注意我们这里的速度和加速度的定义不是严格的物理意义的定义,而是为了方便描述曲线才假设有个粒子在曲线上面运动,并给粒子赋予了速度和加速度,用同样为标量的弧长 s s s 的变化替代时间变化。曲线的曲率 κ ( s ) = ∣ ∣ d T d s ∣ ∣ \kappa(s)=||\frac{d\boldsymbol{T}}{ds}|| κ(s)=∣∣dsdT∣∣,则单位法向量 N = 1 κ d T d s \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 = d r d s / ∣ ∣ d r d s ∣ ∣ \boldsymbol{T}=\frac{d\boldsymbol{r}}{ds}/||\frac{d\boldsymbol{r}}{ds}|| T=dsdr/∣∣dsdr∣∣
- N = 1 κ d T d s \boldsymbol{N}=\frac{1}{\kappa}\frac{d\boldsymbol{T}}{ds} N=κ1dsdT,其中曲率 κ ( s ) = ∣ ∣ d T d s ∣ ∣ \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:
d
T
d
s
=
κ
N
d
N
d
s
=
−
κ
T
+
τ
B
d
B
d
s
=
−
τ
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
)
=
∣
∣
d
T
d
s
∣
∣
τ
(
s
)
=
−
N
⋅
d
B
d
s
\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
→
0
T
(
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
′
=
ω
×
T
N
′
=
ω
×
N
B
′
=
ω
×
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 > > r L>>r L>>r,在使用时直接认为是一段空间曲线。有两个坐标系,一个是全局的坐标系 { e 1 , e 2 , e 3 } \{\boldsymbol{e}_1,\boldsymbol{e}_2,\boldsymbol{e}_3\} {e1,e2,e3},另一个是与弧长 s s s 相关的局部坐标系 { d 1 ( s ) , d 2 ( s ) , d 3 ( s ) } \{\boldsymbol{d}_1(s),\boldsymbol{d}_2(s),\boldsymbol{d}_3(s)\} {d1(s),d2(s),d3(s)} ,在局部坐标系中, { d 1 ( s ) , d 2 ( s ) } \{\boldsymbol{d}_1(s),\boldsymbol{d}_2(s)\} {d1(s),d2(s)} 构成了曲线上某一个点的横截面,而 d 3 ( s ) \boldsymbol{d}_3(s) d3(s) 是这个横截面的法向量,注意这个 d 3 ( s ) \boldsymbol{d}_3(s) d3(s) 不一定要和曲线切线 d r ( s ) d s \frac{d\boldsymbol{r}(s)}{ds} dsdr(s) 同方向,当它们方向不同时说明在 s s s 处有剪切。
可以看出 Cosserat Rod 局部坐标系的定义和 TNB Frame 很相似,唯一不同的就是它不严格要求空间曲线一定连续可微。
关于全局坐标系和局部坐标系的变换,我们可以看成是一种旋转,定义表示旋转的四元数
q
(
s
)
q(s)
q(s),则有
d
k
=
q
e
k
q
∗
d_k=qe_kq^*
dk=qekq∗
Cosserat Rod 模型的好处在于,它可以度量线型模型的延展(stretch)、剪切(shear)、弯曲(bend)和扭转(twist)四种应变,因此可以更加真实地模拟线型物体的物理运动。
定义
Γ
(
s
)
=
d
r
(
s
)
d
s
−
d
3
(
s
)
\boldsymbol{\Gamma}(s)=\frac{d\boldsymbol{r}(s)}{ds}-\boldsymbol{d}_3(s)
Γ(s)=dsdr(s)−d3(s)
用于度量曲线的延展和剪切应变,
d
3
(
s
)
\boldsymbol{d}_3(s)
d3(s) 和
d
r
(
s
)
d
s
\frac{d\boldsymbol{r}(s)}{ds}
dsdr(s) 的方向关系表示了其剪切应变,
d
3
(
s
)
\boldsymbol{d}_3(s)
d3(s) 和
d
r
(
s
)
d
s
\frac{d\boldsymbol{r}(s)}{ds}
dsdr(s) 的长度关系表示了其延展应变。
定义
Δ
ω
=
ω
−
ω
0
\Delta\omega=\omega-\omega^0
Δω=ω−ω0
用于度量曲线的弯曲和扭转应变,其中
ω
\omega
ω 对应达布向量
ω
\boldsymbol{\omega}
ω 的四元数,上标
0
0
0 表示初始值。在上一个部分中我们知道了达布向量的计算方法
ω
=
1
2
∑
k
=
1
3
d
k
×
d
k
′
\boldsymbol{\omega}=\frac{1}{2}\sum_{k=1}^3{\boldsymbol{d}_k\times\boldsymbol{d}_k'}
ω=21k=1∑3dk×dk′
也知道了达布向量
ω
\boldsymbol{\omega}
ω 描述了
{
d
1
(
s
)
,
d
2
(
s
)
,
d
3
(
s
)
}
\{\boldsymbol{d}_1(s),\boldsymbol{d}_2(s),\boldsymbol{d}_3(s)\}
{d1(s),d2(s),d3(s)} 随着
s
s
s 的变化的角速度,因此可以发现达布向量的前两个元素
{
ω
1
,
ω
2
}
\{\omega_1,\omega_2\}
{ω1,ω2} 描述了曲线的弯曲应变(影响的是曲率),而最后一个元素
ω
3
\omega_3
ω3 描述了曲线的扭转应变(影响的是扭率)。
结合局部坐标系和全局坐标系的变换四元数
q
q
q ,我们可以将两个应变度量函数改写为
Γ
(
s
)
=
R
(
q
)
T
d
r
(
s
)
d
s
−
e
3
Δ
ω
=
2
(
q
∗
q
′
−
q
∗
0
q
′
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) 为四元数
q
q
q 对应的旋转矩阵(
q
v
q
∗
qvq^*
qvq∗ 与
R
(
q
)
v
\boldsymbol{R}(q)\boldsymbol{v}
R(q)v 表示同一种旋转变换,相互可以推导,过程比较复杂所以这里省略了),
q
′
q'
q′ 为四元数的导数,有
q
′
=
1
2
q
ω
q'=\frac{1}{2}q\omega
q′=21qω 。
离散形式的 Cosserat Rod
物理仿真算法中都是对离散节点的运动进行仿真,因此 Position and Orientation Based Cosserat Rods 这篇论文构建了离散形式的 Cosserat Rod,并且成功套用了 PBD 的约束作用于节点位置和节点间的四元数。

假设曲线由 n 个节点 x k \boldsymbol{x}_k xk 组成,那么相邻节点之间还添加了一个表示一段杆(rod)的节点 q k − 1 2 q_{k-\frac{1}{2}} qk−21 。
在杆节点处构建约束最小化延展和剪切应变,在位置节点处构建约束最小化弯曲和扭转,于是我们需要把原本公式 (1) 中的一些量进行离散化处理。对于 d r ( s ) d s \frac{d\boldsymbol{r}(s)}{ds} dsdr(s) 离散化为 d r ( s ) d s ≈ 1 l ( x i + 1 − x i ) \frac{d\boldsymbol{r}(s)}{ds}\approx \frac{1}{l}(\boldsymbol{x}_{i+1}-\boldsymbol{x}_i) dsdr(s)≈l1(xi+1−xi) ,其中 l l l 表示杆节点的长度;对于 ω \boldsymbol{\omega} ω 离散化为 ω ≈ 2 l ς ( q i − 1 2 ∗ q i + 1 2 ) \boldsymbol{\omega}\approx \frac{2}{l}\varsigma(q^*_{i-\frac{1}{2}}q_{i+\frac{1}{2}}) ω≈l2ς(qi−21∗qi+21) ,其中 ς \varsigma ς 表示取四元数的向量部分,这个离散化的推导我看了相关论文还不明白,之后有时间再慢慢去学习吧。
离散化之后的方程变为
Γ
i
+
1
2
≈
1
l
(
x
i
+
1
−
x
i
)
−
ς
(
q
i
+
1
2
e
3
q
i
+
1
2
∗
)
Δ
ω
≈
2
l
ς
(
q
i
−
1
2
∗
q
i
+
1
2
−
q
i
−
1
2
∗
0
q
i
+
1
2
0
)
(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 中如何构建约束,只要把位置
x
i
\boldsymbol{x}_i
xi 和表示转动的四元数
q
i
−
1
2
q_{i-\frac{1}{2}}
qi−21 当成被约束量,根据公式 (2) 令它们等于
0
0
0 即可:
C
s
(
p
1
,
p
2
,
q
)
=
1
l
(
p
2
−
p
1
)
−
R
(
q
)
e
3
=
0
C
b
(
q
,
u
)
=
ς
(
q
∗
u
−
q
∗
0
u
0
)
=
ω
−
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
=
{
+
1
if
∣
ω
−
ω
0
∣
2
<
∣
ω
+
ω
0
∣
2
−
1
if
∣
ω
−
ω
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 描述的是同一种转动,所以要加一个
s
s
s 变量来确定初始值的唯一性。
根据 PBD 算法的公式可以得到每一帧的更新方程,对于约束
C
s
\boldsymbol{C_s}
Cs,更新方程为
Δ
p
1
=
+
w
1
l
w
1
+
w
2
+
4
w
q
l
2
(
1
l
(
p
2
−
p
1
)
−
d
3
)
Δ
p
2
=
−
w
2
l
w
1
+
w
2
+
4
w
q
l
2
(
1
l
(
p
2
−
p
1
)
−
d
3
)
Δ
q
=
+
w
q
l
w
1
+
w
2
+
4
w
q
l
2
(
1
l
(
p
2
−
p
1
)
−
d
3
)
q
e
3
∗
\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∗
对于约束
C
b
\boldsymbol{C_b}
Cb ,更新方程为
Δ
q
=
+
w
q
w
q
+
w
u
u
(
ω
−
s
ω
0
)
Δ
u
=
−
w
u
w
q
+
w
u
q
(
ω
−
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)