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

最近因为项目的安排,需要了解布料解算的源码。于是搭建了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,会重新计算模型的新速度。这个的实现应该是根据碰撞算出粒子受到的反作用力,然后将反作用力累加到合力中,重新计算加速度和速度。

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

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

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值