LayaAirIDE的可视化2D物理使用文档

引言

今天,又摘了一篇官网的文档,献给对2D物理还未入门或刚刚上手的开发者,已经熟悉的朋友们欢迎转发到微信朋友圈,让有需要的开发者看到。

很多开发者都知道LayaAir引擎的3D功能成熟与强大,但对于LayaAir的2D与IDE,有些开发者的认识并不够,或者说是停留在LayaAir 1.0的时代里,其实LayaAir 2.x的2D与IDE也是比较成熟与易用的。本篇文档,旨在让开发者进一步了解LayaAir 2.x IDE 的重要功能之一,物理组件的可视化编辑使用。快速上手物理组件的使用,快捷的开发物理小游戏。

一、基础知识

1.1 学习本文需要的前置知识

LayaAir引擎相关

要顺畅完整的学习本篇文档,必须要了解LayaAirIDE的使用基础,比如UI组件的熟练使用。如果在阅读本篇的时候遇到障碍,请先去官网查看IDE的基础文档或者教学视频。

物理学基础概念相关

本篇不可避免的会涉及一些物理学相关的基础概念,文中会尽可能简要说明,让大家理解作用与效果。但如果涉及到某块基础概念不理解,或者想进一步深入理解,需根据关键字自行搜索补习相关的基础知识。本篇重点在于介绍引擎中相关属性的作用与如何使用,为了文档的连贯性,对于过于基础的概念,可能不会太详细的进行描述。

1.2 LayaAir内置的物理引擎

LayaAir引擎在1.x的时候内置的是Matter.js物理引擎,核心原因是小巧轻便。但随着微信小游戏产业的兴起,以及物理小游戏的火爆,带动一阵物理小游戏的热潮,因此,对于物理游戏的需求也越来越多。从精度、圆形支持、防穿透等方面,Matter.js已经不能满足。于是在LayaAir 2.0引擎开始,选择了更加成熟和应用最广泛的Box2D作为LayaAir引擎内置的2D物理引擎,并且整合到LayaAirIDE中,可以通过LayaAirIDE可视化编辑物理游戏。让物理游戏开发起来更加轻松。

如果对于物理引擎功能需求较为简单,并且希望能减小引擎体积的情况下,LayaAir引擎仍然可以结合使用Matter物理引擎。但不在本篇范围内,本篇全面介绍LayaAirIDE中的2D物理引擎组件。

二、2D物理引擎基础

要了解2D物理引擎的基础,我们先从IDE里的刚体、碰撞体、关节这些物理组件开始。

2.1 刚体 RigidBody

Box2D可以说是一个用于游戏的2D刚体仿真库。所以,刚体是我们需要首先理解的概念。

2.1.1 什么是刚体

大家都知道,自然界一切有形体的物质,都可以叫物体。刚体是力学中为了体现物体特性的一种科学抽象概念,也是一种理想状态的力学表达模型,是指在运动中和受到力的作用后,形状和大小不变,而且内部各点的相对位置不变的物体。

然而,现实中不可能存在这种理想模型,物体在受力之后,会根据力、材料、弹性、 塑性等综合因素,决定是否改变或改变多少。如果物体本身的变化不影响整个运动过程,为使被研究的问题简化,仍将该物体当作刚体来处理而忽略物体的体积和形状,这样所得结果仍与实际情况相当符合。

2.1.2 刚体组件属性说明

LayaAir引擎中的2D刚体组件类是 Laya.RigidBody ,继承自创建组件的基类 Component。在LayaAirIDE中,我们可以直接为UI组件添加刚体组件。如下图1所示。

(图1)

刚体类型  type

基于理论力学的理论基础,box2D物理引擎的刚体类型(type)分为:静力学类型static、动力学类型dynamic、运动学类型kinematic,IDE里默认为dynamic。如图2-1所示。

(图2-1)

静力学类型:static

静力学,它主要研究力系的平衡条件,力系的简化,物体受力分析的基本方法。

静力学static类型的刚体就是始终静止不动,无论施加怎样的力都不会移动, 不受重力影响速度为零且不可设置 

在LayaAirIDE中创建的2D示例项目中,永远不会移动的地板,就是使用的static类型刚体。

动力学类型:dynamic

动力学,它主要研究作用于物体的力与物体运动的关系。

动力学dynamic类型的刚体会根据受到的力进行移动, 会受到重力的影响,可设置速度。

在LayaAirIDE中创建的2D示例项目中,受重力影响而不断掉落的方块盒子,使用的就是dynamic类型刚体。

运动学类型:kinematic

运动学,它是运用几何学的方法来研究物体的运动,不考虑力和质量等因素的影响。重点研究物体的轨迹、位移、速度、加速度等运动特性。至于物体的运动和力的关系,则是动力学的研究课题。

运动学kinematic类型的刚体不会根据受到的力进行移动不受重力影响,可设置速度。与静力学类型的刚体主要区别就是,通常会通过设置速度(线速度和角速度)使其移动。

在LayaAirIDE中创建的2D示例项目中,向上撞击或击碎方块盒子的圆形子弹,使用的就是kinematic类型刚体。

重力缩放系数 gravityScale

(图2-2)

自然界中物体受地心吸引的作用而受到的力叫重力,物理引擎中也同样模拟了重力,并可以设置参数对其改变。

刚体的gravityScale属性是重力缩放系数,通过调整数值可以改变重力大小,数值可以为正数或负数,也包括了正负小数。默认值为1,即正常重力,IDE中如上图2-2所示。如果数值为0则表示没有重力。大于1的数值表示正常重力的倍数,数值越大则重力越大。gravityScale属性数值为负数,则表示反方向重力,数值越小则反方向的重力越大。

角速度 angularVelocity

(图2-3)

刚体的angularVelocity属性是角速度, 角速度简单理解就是单位时间的角位移,以弧度每秒进行旋转 。当我们设置angularVelocity属性为正值的时候,则按顺时针旋转位移。angularVelocity属性为负值的时候,则按逆时针旋转位移。属性值的绝对值越大,旋转位移速度越快。angulaVelocity属性的默认值为0,如图2-3所示,此时不会产生旋转位移。

角阻尼 angularDampin

(图2-4)

阻尼是外界作用或自身原因引起逐渐下降的衰减特性,刚体的角阻尼则是相对于角速度的旋转阻尼系数,使得旋转速度衰减。默认值为0,表示没有阻尼,如图2-4。通常阻尼的值在0到0.1之间。

线性速度 linearVelocity

(图2-5)

刚体的linearVelocity属性称为线速度或者线性速度,是指物体的直线运动速度,如果物体呈曲线运动,就是沿着曲线路径切线方向的单位时间即时速度。

线速度是一个矢量值,它是描述作曲线运动的质点运动快慢和方向的物理量,既有大小也有方向。

在LayaAirIDE里,linearVelocity属性值,为x,y坐标方向的速度值,例如图2-5中示例的10,10,表示x坐标(向右)速度为10,y坐标(向下)速度为10。坐标值可以为负值,坐标值的绝对值越大,速度越快。

线性阻尼 linearDamping

(图2-6)

刚体的linearDamping属性,是指线性速度的阻尼系数,使得线性速度衰减。范围从0到无穷大。默认值为0,表示没有阻尼,如图2-6。通常阻尼的值应该在0到0.1之间。

子弹 bullet

(图2-7)

在有些情况下,物理引擎可能会捕捉不到某些已经发生的碰撞,导致互相穿透卡在一起。

刚体的bullet属性,中文是子弹,形容射出的子弹那样高速移动的物体,bullet属性用于防止高速穿透。

bullet默认值为false,如图2-7,此时不对刚体作防穿透处理(连续碰撞检测),会节省性能。当设置为true时,会通过连续碰撞检测防止高速穿透。

允许休眠 allowSleep

(图2-8)

物理引擎进行模拟时,是存在性能消耗的。当刚体停止运动时,其实我们可以不去模拟它。刚体设置为休眠状态就会跳过该刚体的模拟,直到被其它刚体解除才会醒来(关节被破坏或者手动唤醒也可以),从而节省性能的消耗。

刚体的allowSleep属性,中文是允许休眠,默认值为ture,如图2-8所示。如果想保持一直醒着的状态,设置为false可以关闭允许休眠。

允许旋转 allowRotation

(图2-9)

刚体的allowRotation属性,中文是允许旋转,实际理解还是与字面意思有些差异。这里是可以控制刚体碰撞时角度是否发生旋转改变。默认值为true,如图2-9所示。表示允许刚体发生碰撞时模拟自然撞击的角度改变,看起来更加自然。当设置为false,碰撞后不会产生角度变化。

比如,一把受重力自由下落的尖刀,是希望碰到地板后,最终平躺在地板上。还是始终保持尖刀竖立的状态,可以通过allowRotation属性来控制。

碰撞组 group

  

(图2-10)

group属性可以设置当前刚体所属的碰撞组。默认值为0,如图2-10。

碰撞组规则如下:

1、如果两个对象的刚体group相等且group值大于零,它们将始终会发生碰撞。

2、如果两个对象的刚体group相等且group值小于零,它们将永远不会发生碰撞。

3、如果两个对象的刚体group值等于0或者group值不相等,则使用刚体的碰撞类别category和碰撞掩码mask来判断是否碰撞。

碰撞类别 category

(图2-11)

category属性表示碰撞类别,与碰撞组group关联使用,默认值为1(2的0次方),如图2-11所示。

当两个对象的碰撞组(group)值等于0或者值不相等时,使用2的N次幂值来指定碰撞类别。此属性接收位字段,范围为[1,2^31]内2的幂,共有32种不同的碰撞类别可用。

按2的幂设置值不是强制规定,不按这个规则取值,不会引发报错,但是需要提前用mask值与category以按位与进行检查,否则简单的按category求和法来设置

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值