算法流程
- 任意选择一个参考点
- 对于在mesh上的每个三角形:
- 形成由参考点与该三角形所围成的四面体
- 计算四面体的协方差(通过仿射变换映射到一个已知的正则四面体
- 将这个协方差加到累加器中
- 将累加器从协方差矩阵转换为惯性张量
固定的惯性张量可以表示为:
I=13 tr C −C
其中13是3×3的单位矩阵,以及C是物体的质量权重的协方差矩阵。
C=∑nmnXnXTn
C是一个封闭、简单的几何体。
正则四面体的协方差
正则四面体有四个顶点v0=(0,0,0),v1=(1,0,0),v2=(0,1,0),v3=(0,0,1),我们首先得到协方差矩阵的连续形式:
C=∫VρxxTdV=ρ∫VxxTdV
其中ρ是物体的密度(常量).其中C是一个3×3的对称矩阵,只包含两个分量。
因此我们只需要求解两个分量Cxx,Cxy即可,考虑正则四面体的密度为1,我们有:
Cxx=∫10∫z0∫y0x2dxdydz=160Cxy=∫10∫z−y0∫z−y0xydxdydz=1120
因此,
Ccanonical =⎡⎢
⎢
⎢⎣160112011201120160112011201120160⎤⎥
⎥
⎥⎦
变换协方差矩阵
为了映射Ccanonical 到四面体,我们需要用两个方式操作协方差矩阵。
-
我们通过对每个输入点应该线性变换A,从而得到变换后的矩阵:
C′=ρ∫V(Ax)(Ax)TdV(A)=ρ∫VAxxTATdVdetA=(detA)ACAT
detA因子描述:变换A扭曲了积分的体积元(dV(A)=dV detA)
-
我们通过对每个输入点应用偏移Δx,从而得到偏移后的矩阵:
C′=Translate(C,Δx)=ρ∫V(x+Δx)(x+Δx)TdV=ρ∫V(xxT+ΔxxT+xΔxT+ΔxΔxT)dV=ρ∫VxxTdV+ρΔx∫VxTdV+ρ∫VxdVΔxT+ρΔxΔxT∫VdV=C+m(Δ¯¯¯xT+¯¯¯xΔxT+ΔxΔΔxT)
其中¯¯¯x是输入点的质心用于构造C,以及m=ρV是这些点的总质量。
正则四面体映射到目标四面体
我们首先开始于一个正则四面体,通过线性变换使其与目标形状相同,然后平移它使其在相同的位置。
正则四面体的顶点表示为:{v0,v1,v2,v3},目标四面体的顶点表示为{w0,w1,w2,w3}
为了使四面体的形状相同,我们定义以下线性变换:
A[v1−v0|v2−v0|v3−v0]=[w1−w0|w2−w0|w3−w0]
因为我们使用了正四面体有:
A[v1−v0|v2−v0|v3−v0]=⎡⎢⎣100010001⎤⎥⎦
因此我们可以得到:
A=[w1−w0|w2−w0|w3−w0]
因此有C′=(detA)ACcanonicalAT,现在我们发现C′′=Translate(C′,w0−v0),又因为v0=0,因此我们可以得到C′′=Translate(C′,wo),wo是我们选择的参考点。
其他质量属性(四面体)
质量:m=ρV
体积:V=16detA,因为V=|c⋅(a×b)|6
质心:四个顶点的平均值
累加结果
我们定义如下一组质量属性:Bn={Cn,xn,mn}
我们想要找到B3=B1+B2:
- 协方差:设想C1,C2在同一原点上计算,有C3=C1+C2
- 质心:¯¯¯x3=(¯¯¯x1m1+¯¯¯x2m2)/(m1+m2)
- 总质量:m3=m1+m2
因为Ctotal是围绕我们的选择的参考点计算的,我们希望将它移动到质心上(物理模拟器最希望它移动的地方):
C′total=Translate(Ctotal,w0−xtotal)
最后我们便可以根据一开始的公式从C′total计算出I′total。
参考资料
[BB04] BLOW J., BINSTOCK A.: How to find the inertia tensor (or othermass properties) of a 3d solid body represented by a triangle mesh
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下