角度约束#
在物理引擎中,我们经常需要控制两个物体之间的相对角度,比如机械臂的关节角度或者两个刚体之间的旋转约束。这种约束在现实中就类似用铰链连接两个物体,使它们在某个期望夹角下旋转。
通过之前《基于冲量的约束求解》这篇文章我们知道,实现约束的关键是写出约束方程,然后求出Jacobian矩阵,最后用公式求解冲量。下面我们将详细介绍角度约束的约束方程和Jacobian矩阵的推导。
角度约束的约束方程#
假设存在两个物体:物体A和物体B,我们希望它们的旋转轴之间保持一个期望夹角 θd。
设物体A的参考方向为单位向量 uA,物体B的参考方向为单位向量 uB。我们希望这两个向量之间的夹角等于 θd,约束方程可以写为:
三维情况下
C=uA⋅uB−cosθd=0这里 uA⋅uB=cosθ 表示当前夹角,C=0 表示夹角正好为期望值。
以下写法也正确,但通常不推荐
C=arccos(uA⋅uB)−θd=0二维情况下
C=θA−θB−θd=0θA,θB 分别表示物体的角度
Jacobian矩阵#
三维推导#
为了得到速度约束方程,我们对位置约束方程对时间求导:
C˙=∇C⋅q˙=[∂uA∂C∂uB∂C][u˙Au˙B]C˙=[uBuA][u˙Au˙B]旋转向量的变化可以用角速度表示:
u˙A=ωA×uA,u˙B=ωB×uB代入速度约束:
C˙=(ωA×uA)⋅uB+uA⋅(ωB×uB)利用向量恒等式 (a×b)⋅c=a⋅(b×c),可以得到:
C˙=ωA⋅(uA×uB)+ωB⋅(uB×uA)注意 uB×uA=−(uA×uB),于是速度约束可以写成矩阵形式:
C˙=[uA×uB−(uA×uB)][ωAωB]=J⋅Ω其中
J=[uA×uB−(uA×uB)],Ω=[ωAωB]为了保证程序通用性一般写作
J=[0uA×uB0−(uA×uB)],V=vAωAvBωB二维推导#
为了得到速度约束方程,我们对位置约束方程对时间求导:
C˙=∇C⋅q˙=[∂θA∂C∂θB∂C][dtdθAdtdθB]T=[1−1][ωAωB]T为了保证程序通用性一般写作
C˙=[010−1]vAωAvBωB其中
J=[010−1],V=vAωAvBωB