Loading

How to find the inertia tensor (or othermass properties) of a 3d solid body represented by a triangle mesh

算法流程

  1. 任意选择一个参考点
  2. 对于在mesh上的每个三角形:
    • 形成由参考点与该三角形所围成的四面体
    • 计算四面体的协方差(通过仿射变换映射到一个已知的正则四面体
    • 将这个协方差加到累加器中
  3. 将累加器从协方差矩阵转换为惯性张量

固定的惯性张量可以表示为:

I=13 tr C C

其中133×3的单位矩阵,以及C是物体的质量权重的协方差矩阵。

C=nmnXnXnT

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=010z0yx2dxdydz=160Cxy=010zy0zyxydxdydz=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+ρΔxVxTdV+ρVxdVΔxT+ρΔxΔxTVdV=C+m(Δx¯T+x¯ΔxT+ΔxΔΔxT)

    其中x¯是输入点的质心用于构造C,以及m=ρV是这些点的总质量。

正则四面体映射到目标四面体

我们首先开始于一个正则四面体,通过线性变换使其与目标形状相同,然后平移它使其在相同的位置。

正则四面体的顶点表示为:{v0,v1,v2,v3},目标四面体的顶点表示为{w0,w1,w2,w3}

为了使四面体的形状相同,我们定义以下线性变换:

A[v1v0|v2v0|v3v0]=[w1w0|w2w0|w3w0]

因为我们使用了正四面体有:

A[v1v0|v2v0|v3v0]=[100010001]

因此我们可以得到:

A=[w1w0|w2w0|w3w0]

因此有C=detAACcanonicalAT,现在我们发现C=Translate(C,w0v0),又因为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
  • 质心:x¯3=x¯1m1+x¯2m2/(m1+m2)
  • 总质量:m3=m1+m2

因为Ctotal是围绕我们的选择的参考点计算的,我们希望将它移动到质心上(物理模拟器最希望它移动的地方):

Ctotal=Translate(Ctotal,w0xtotal)

最后我们便可以根据一开始的公式从Ctotal计算出Itotal

参考资料

[BB04] BLOW J., BINSTOCK A.: How to find the inertia tensor (or othermass properties) of a 3d solid body represented by a triangle mesh

posted @   Ligo丶  阅读(152)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示