Blender源码探究之布料解算(一)——源码定位

最近因为项目的安排,需要了解布料解算的源码。于是搭建了Blender的编译环境,查看里面的源码。

对源码探索了一段时间后,找到了cloth.c文件中的clothModifier_do方法。这个就是关于布料结算的方法了。

Blender源码探究之布料解算(一)——源码定位_第1张图片

 方法内调用do_step_cloth(),

Blender源码探究之布料解算(一)——源码定位_第2张图片

 跳去实现看看,似乎是处理和计算cloth和mesh的顶点位置

Blender源码探究之布料解算(一)——源码定位_第3张图片

 调用布料解算器

Blender源码探究之布料解算(一)——源码定位_第4张图片

Blender源码探究之布料解算(一)——源码定位_第5张图片

 While循环每一个时间步长step,直到计算完成为止。

可以看出,while循环内的注释表明,这是经典的质点弹簧模型算法。

先是用cloth_setup_constraints设置顶点的约束位置。

接着调用cloth_calc_force计算受力,包括重力、弹簧拉力、压力等等。

Blender源码探究之布料解算(一)——源码定位_第6张图片

往cloth_calc_force函数里面深挖,可以找到将重力累加到合力的函数。

根据牛顿第二定律 F = ma;

这里g是重力加速度, f = mg;

然后data是冲量数据(冲量I=F*Δt),冲量需要把所有力统计起来,

所以add_v3_v3就是累加合力F

Blender源码探究之布料解算(一)——源码定位_第7张图片

 回到while循环体内,刚才算完力之后,就要算加速度和速度了。

已知布料粒子的质量和所受合力,也同样根据牛二算出加速度a。

那么新的速度:

                                 v = v0 + aΔt

那么在Δt内粒子的移动距离:

                                 s = (v+v0)*Δt/2

因此更新粒子的位置:

                                 p = p0 + s

好了,推算出布料粒子下一Δt的位置p后,还要经过一个碰撞检测来判断是否能到达位置p。

往下走,有一个判断,cloth_bvh_collision,(尚未具体理解这是什么含义,但可以确定是计算碰撞检测)

Blender源码探究之布料解算(一)——源码定位_第8张图片

如果返回true,会重新计算模型的新速度。这个的实现应该是根据碰撞算出粒子受到的反作用力,然后将反作用力累加到合力中,重新计算加速度和速度。

关于碰撞检测的具体实现,找到了应用分离轴定理的检测方法。也就是判断投影是否重叠。

这是最终判断重叠的最大最小值方法。

Blender源码探究之布料解算(一)——源码定位_第9张图片

你可能感兴趣的:(blender,物理引擎,源码)