CANNON-Constraint 约束力
Lock Constraint
说实话,听完Wael Yasmina讲的之后,
我也没弄明白到底什么是Lock Constraint,
视频下方相关的一些文章都是全英文论文(捂脸),
实际操作之后,
constraint似乎像是一种锁链关系,
将两个离散的物体作为一个整体计算受力情况。
Cannon专门提供了一个类用于实现Constraint,
就是LockConstraint,
实例化时必填2个参数:
- 参数1:当前Body
- 参数2:当前Body具有锁定关系的上一个Body
将一连串物体使用LockConstrain锁在一起后,
它们将作为一个整体受力,
但同时整体的各个部分相互之间也有力的作用。
1 |
|
Distance Constraint
Constrains two bodies to be at a constant distance from each others center of mass.
DistanceConstrain的功能是将两个body保持固定距离约束在一起。
实例化CANNON.DistanceConstrain需要三个参数:
- bodyA
- bodyB
- distance
为了制作一个由15×15个小球组成的矩形网格,
首先需要创建15×15个body,
接着对这些body进行关联。
使用矩阵行列索引哈希表存储数据,在关联时会方便很多。
1 | const row = 15 |
Cloth Simulate 模拟布料
和上一部分 Distance Constraint 的原理相似,
一块方形的布料可以看做一块矩阵,
矩阵的相邻元素之间存在Distance Constrain关系。
这里组成矩阵的body使用CANNON.Particle类。
第一步,创建布料实体,按照布料矩阵的行列顶点数配置segments:
1 | const clothGeo = new THREE.PlaneGeometry(1, 1, row, col) |
第二步,创建body矩阵,
注意:n×m分段的geometry上实际上有(n+1)*(m+1)个顶点
1 | for (let i = 0; i < row + 1; i++) { |
第三步,为body矩阵的每个元素条件constraint条件:
1 | function createConstraint(i1, j1, i2, j2) { |
第四步,创建布料同步函数,在loop函数中会逐帧调用
每次刷新布料geometry中attr类型变量position的对应顶点
1 | function updatePosition() { |
第五步,创建球形
1 | const sphereGeo = new THREE.SphereGeometry(radius) |
第六步、启动动画帧
1 | const timeStep = 1 / 60 |