美文网首页Box学习
Box2D源码分析(刚体属性)

Box2D源码分析(刚体属性)

作者: 大旺旺的弟弟小旺旺 | 来源:发表于2021-10-02 14:45 被阅读0次

    上一讲看到了刚体属性,以及刚体的形状和创建过程,可以做自由下落,最后知道怎样显示出视图。这一节完成一些特殊的效果。
    属性的两个属性类:bodyDef和fixtureDef,包含了所有的属性,对刚体的操作也是在这些属性上完成的。本章主要介绍属性的使用。

    BodyDef

    它包含了位置,类型,线速度。角速度等,属性分类:

    • 状态
      • active:是否可用 如果可用就会进行碰撞模拟,反之
      • alowSleep:是否允许睡眠 在停止下来的时候就会进入睡眠,当运动的时候就会唤醒。
      • awake:活动与否
      • bullet是否模拟高速子弹 防止穿堂而过。
    • 角度 角速度
      • angle:刚体角度
      • angularDamping:刚体旋转的角速度阻尼
      • angularVelocity:旋转角速度
      • fixedRotation:是否禁用刚体旋转
      • inertiaScale:刚体角速度惯性系数 质量只会影响,线性的惯性,而角速度的惯性需要通过这个参数来控制 如果这个参数为0的时候,那么角度将不会变
    • 坐标 速度
      • linearDamping:阻尼
      • linearVelocity:刚体线性速度
      • position:位置
    • 其他属性
      • type:
        静态:不可以运动的
        动态: 可以运动的
        可动刚体
      • userData:自定义属性

    状态类属性

    active
    刚体是不是处于激活状态,如果是false,那么在模拟的过程中就会被忽略掉,一般的如果超出渲染范围的可以设置为false .
    举例子:如果某个刚体被设置为false,上面下落一个物体就直接穿堂而过,不进行任何的模拟操作;
    awake
    当前是不是处于唤醒状态,物体在运行的过程中,精致 的时候会标记为睡眠,发生碰撞的时候就会唤醒。一般的时候是不需要进行设置的,他一般的会进行自己操作的。
    allowSleep
    是否可以睡眠,默认为true,allowSleep和world中的一样,只不过作用的范围不同。
    Bullet
    是否模拟高速的子弹,开启CCD碰撞,默认是false,这个是为了防止高速运动的物体发生碰撞,容易穿透而设定的,需要比较大的运算开支,所以开启的不易太多。

    角度、角速度类属性

    angle:刚体的角度,是一个弧度值,转换关系:1弧度 = 180 / Math.PI。
    angularVelocity:刚体的角速度 单位为弧度/秒,所以使用的时候需要进行转换,比较熟悉的单位通常是度/帧。假如渲染帧fps,那么弧度/秒和度/帧的关系如下:
    弧度:1rad
    秒:1s
    弧度/秒:1rad/s
    度:180/Math.PI
    帧:fps
    度/帧 :180/Math.PI / fps

    image.png
    旋转点:围绕中心,旋转中心,一般的就是刚体重心的坐标点,也可以进行修改,比如不倒翁。
    angularDamping角速度阻尼,旋转摩擦力。他的范围是0~1之间,取值越大角速度降低的越快。
    比如旋转加上阻尼就会很快的慢下来。
    inertiaScale:角速度惯性系数,它可以为非负数,质量越大,惯性越大,移动的速度和角度也很难改变。质量只会影响惯性系数,旋转的惯性剋通过设置,角速度惯性系数越大,角速度变化的就越慢,如果角速度的惯性系数为0,那么角度就会一直保持不变。
    fixedRotation:是否禁止旋转,刚体发生碰撞后不发生改变

    坐标 速度类属性

    • positiin:刚体坐标,同时 也是刚体本地系统的坐标原点
      一般的直接修改刚体的坐标,实现刚体瞬间移动的效果。位置的读写方法getPosition和setPosition,使用setPostion进行更新需要谨慎。
    • linearVelocity:刚体的线性速度 ,m/s,转换关系,30帧的时候 1m/s = 1px/f
    • linearDamping:线性阻尼,取值范围0~1,线性阻尼越大,刚体运动速度变化越慢。
      使用场景,如果在太空中翱翔,不受到 摩檫力,可以通过这个参数让它们停下来。它的读写方法getLinearDamping()和setLinearDamping.
      初始的时候属性都为0,在设置了线性速度之后,它保持相同的运动轨迹,然后设置了阻尼就会慢慢的停下来。

    其他属性

    type:静态 动态 可动

    • staticBoduy:静态刚体 碰撞后不进行反弹,不受到外力的影响。一般在游戏中台子等使用静态。
    • kinermaticBody:可动刚体,和静态的类似,碰撞之后不反弹,但是可以运动。看可以 设置setLineatVelocity和setAnfularVelocity可以添加速度,可以作位电梯效果。
    • dynamicBody:动态刚体,可以运动,碰撞后会进行反弹、变向等响应刚体。

    bullet只会针对动态刚体有效果,静态的刚体和可动的刚体默认都是按照true设置的会进行连续检测。这也就是可以穿过障碍物,但是不会穿过墙

    如果在运行的过程中突然改变刚体的类型,那么就会立即停止,就像冻住了一样。

    FixtureDef

    主要 保存了刚体特性方面的属性,比如密度、表面摩檫力、弹性系数等
    分类可以分为:

    • 特质特性
      (1)density:密度 : 密度如果设置为0,则会强制设置为1 ,体积越大,惯性越大,维持当前状态的力就越大。
      (2)friction:摩擦系数 摩檫力和阻尼不是一回事,虽然都会降低速度,但是摩檫力可以模拟出冰面等。
      (3)restitution:弹性系数 可以模拟出撞击到地面,水泥面等上面的特性。
    • 碰撞 特性
      (1)filter:碰撞过滤:就是对刚体分类别,那些可以撞击,那些不可以撞击
      (2)是否为传感器 : 值进行碰撞,但是不进行碰撞模拟
    • 形状
      (1)Shape:形状
    • 自定义
      (1)userdata

    相关文章

      网友评论

        本文标题:Box2D源码分析(刚体属性)

        本文链接:https://www.haomeiwen.com/subject/qqjxnltx.html