Box2DJS教程3-4--从形状到刚体
更新日期:
本节主要介绍刚体的一些属性,以及从形状到刚体的过程。
刚体
刚体定义(b2BodyDef)
在创建刚体之前你需要创建一个刚体定义(b2BodyDef)。你可以把刚体定义创建在栈上,也可以在你的游戏数据结构中保存它们。这取决于你的选择。
Box2D会从刚体定义中拷贝出数据,这意味着你可以循环使用一个刚体定义去创建多个刚体。
- 质量性质
有多种建立刚体质量性质的方法:
- 在刚体定义中显式地设置
- 显式地在刚体上设置(在其创建之后)
- 基于刚体上形状之密度设置
在很多游戏环境中,根据形状密度计算质量是有意义的。这能帮助确保刚体有合理和一致的质量。然而,其它游戏环境可能需要指定质量值。例如,可能你有一个机械装置,需要一个精确的质量。
- 位置和角度
物体定义为你提供了一个在创建时初始化位置的机会,这要比在世界原点创建物体而后移动它到某个位置更具性能。
一个物体上主要有两个令人感兴趣的点。其中一个是物体的原点,形状和关节都相对于物体的原点而被附加。另一个点是物体的质心。质心取决于物体上形状的质量分配,或显式地由b2MassData设置。
Box2D内部的许多计算都要使用物体的质心,例如b2Body会存储质心的线速度。
1 | bodyDef.position.Set(x, y); // 设置刚体的初始位置 |
当你构造物体定义的时候,可能你并不知道质心在哪里,因此你会指定物体的原点。你可能也会以弧度指定物体的角度,角度并不受质心位置的影响。
如果随后你改变了物体的质量性质,那么质心也会随之移动,但是原点以及物体上的形状和关节都不会改变。
- 阻尼
阻尼用于减小物体在世界中的速率。阻尼与摩擦是不同的,因为摩擦仅在物体有接触的时候才会发生,而阻尼的模拟要比摩擦便宜多了。然而,阻尼并不能取代摩擦,往往这两个效果需要同时使用。
阻尼参数的范围可以在0到无穷之间,0的就是没有阻尼,无穷就是满阻尼。通常来说,阻尼的值应该在0到0.1之间,我通常不使用线性阻尼,因为它会使物体看起来发飘。
1 | bodyDef.linearDamping = 0.0; |
阻尼相似于稳定性与性能,阻尼值较小的时候阻尼效应几乎不依赖于时间步,而阻尼值较大的时候阻
尼效应将随着时间步而变化。
- 休眠参数
休眠是什么意思?好的。模拟物体的成本是高昂的,所以如果物体更少,那模拟的效果就能更好。当一个物体停止了运动时,我们喜欢停止去模拟它。
当Box2D确定一个物体(或一组物体)已经停止移动时,物体就会进入休眠状态,消耗很小的CPU开销。如果一个醒着的物体接触到了一个休眠中的物体,那么休眠中的物体就会醒来。当物体上的关节或触点被摧毁的时候,它们同样会醒来。你也可以手动地唤醒物体。
通过物体定义,你可以指定一个物体是否可以休眠,或者创建一个休眠的物体。
1 | bodyDef.allowSleep = true; |
由形状到刚体
b2BodyDef
之前虽然创建了形状,但是这些形状并不会直接在世界里面显示出来。
下面利用这些形状来组成一些刚体,然后把它们放入到世界里面去。
首先,利用b2BodyDef创建一个刚体,然后设置刚体的初始位置并加入之间已创建的形状,然后使用CreateBody将刚体放入到世界里面,这样就可以看到一些模拟刚体了。
1 | var BodyDef= new b2BodyDef(); // 利用b2BodyDef类创建一个刚体 |
返回总目录
码生艰难,写文不易,给我家猪囤点猫粮了喵~
查看Github有更多内容噢:https://github.com/godbasin
更欢迎来被删的前端游乐场边撸猫边学前端噢
如果你想要关注日常生活中的我,欢迎关注“牧羊的猪”公众号噢