最近因为项目的安排,需要了解布料解算的源码。于是搭建了Blender的编译环境,查看里面的源码。
对源码探索了一段时间后,找到了cloth.c文件中的clothModifier_do方法。这个就是关于布料结算的方法了。
方法内调用do_step_cloth(),
跳去实现看看,似乎是处理和计算cloth和mesh的顶点位置
调用布料解算器
While循环每一个时间步长step,直到计算完成为止。
可以看出,while循环内的注释表明,这是经典的质点弹簧模型算法。
先是用cloth_setup_constraints设置顶点的约束位置。
接着调用cloth_calc_force计算受力,包括重力、弹簧拉力、压力等等。
往cloth_calc_force函数里面深挖,可以找到将重力累加到合力的函数。
根据牛顿第二定律 F = ma;
这里g是重力加速度, f = mg;
然后data是冲量数据(冲量I=F*Δt),冲量需要把所有力统计起来,
所以add_v3_v3就是累加合力F
回到while循环体内,刚才算完力之后,就要算加速度和速度了。
已知布料粒子的质量和所受合力,也同样根据牛二算出加速度a。
那么新的速度:
v = v0 + aΔt
那么在Δt内粒子的移动距离:
s = (v+v0)*Δt/2
因此更新粒子的位置:
p = p0 + s
好了,推算出布料粒子下一Δt的位置p后,还要经过一个碰撞检测来判断是否能到达位置p。
往下走,有一个判断,cloth_bvh_collision,(尚未具体理解这是什么含义,但可以确定是计算碰撞检测)
如果返回true,会重新计算模型的新速度。这个的实现应该是根据碰撞算出粒子受到的反作用力,然后将反作用力累加到合力中,重新计算加速度和速度。
关于碰撞检测的具体实现,找到了应用分离轴定理的检测方法。也就是判断投影是否重叠。
这是最终判断重叠的最大最小值方法。