一篇上手LayaAir的3D物理引擎

昨天,我们分享了一篇2D物理文档《LayaAirIDE的可视化2D物理使用文档》。

今天,我们针对LayaAir引擎的初学者,以及对物理引擎使用不熟悉的开发者,再来分享一篇3D物理文档,本篇文档全面介绍了3D物理引擎使用的基础能力。方便开发者快速上手。

LayaAir 3D引擎集成了世界三大物理引擎之一的Bullet引擎,当在Unity中使用了物理组件,用LayaAir的Unity插件导出后,默认就是采用的Bullet引擎。当然,LayaAir引擎也支持使用比较轻量的Cannon.js物理引擎的基础功能。

阅读本篇时,除非是Cannon物理引擎的专属章节,或者注明是cannon物理引擎,默认介绍都是基于LayaAir封装的Bullet引擎。

一、刚体

1.1 什么是刚体

无论是2D,还是3D,物理的开篇,都需要先了解刚体,这是物理引擎的基础之一。

大家都知道,自然界一切有形体的物质,都可以叫物体。

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

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

1.2 常用的刚体属性
isKinematic是否为运动刚体

3D的刚体,默认是动力学刚体。会受力的影响,可以位移。

一旦我们把刚体设置为运动刚体类型后,即将isKinematic的值设置为true。

那么运动刚体可以触发第三方的物理反馈,自己却不受物理影响。例如,运动刚体与动力学刚体发生撞击,动力学刚体会受力反弹,但运动刚体却不会受力的影响,不会产生受力位移,运动刚体的位移只能通过transform改变节点坐标。

与2D的运动学类型刚体不同,LayaAir 3D的运动刚体脱离了物理引擎运动,即使设置速度也不可以使其位移。这样做的好处是减少了物理运算,节省了性能。

mass质量

质量是物质的量的量度,Bullet引擎中的质量单位为kg。

刚体的质量越大,运动状态改变越难,比如,不同质量的两个物体相撞,质量大的一方改变更小一些,如动图1的右侧所示:

(动图1)

静态刚体和运动刚体就相当于无限大质量,所以不受力的影响。

gravity 重力

自然界中物体受地心吸引的作用而受到的力叫重力,物理引擎中也同样模拟了重力,

动力学刚体在同等的质量下,重力越大,下落的加速度越大。对比效果如动图1-1。

(动图1-1)

linearVelocity 线性速度

刚体的linearVelocity属性称为线速度或者线性速度,是指物体的直线运动速度。

动力学刚体的线速度是3维向量Vector3类型值,向量的方向即速度的方向,向量的长度即速度的大小。

动图1-2,是动力学刚体在同样重力值为0的情况下,没有设置线速度和y轴设置了线速度值的对比效果。

(动图1-2)

linearDamping 线性阻尼

刚体的linearDamping属性,是指线性速度的阻尼系数,使得线性速度衰减。

动图1-3,是动力学刚体在重力为0并且y轴设置了同样为-1的线速度值情况下,左侧为0.9线性阻尼值和右侧为1线性阻尼值的对比效果。

(动图1-3)

angularVelocity 角速度

刚体的angularVelocity属性是角速度, 角速度简单理解就是单位时间的角位移,以弧度每秒进行旋转 。当我们设置动力学刚体angularVelocity属性为正值的时候,则按顺时针旋转位移。angularVelocity属性为负值的时候,则按逆时针旋转位移。属性值的绝对值越大,旋转位移速度越快。

(动图1-4)

angulaVelocity属性的值是3维向量Vector3类型值,Bullet使用欧拉角来描述物体的旋转,3D向量的每个分量代表绕x、y、z轴旋转的速度,单位是弧度/秒。动图1-4,就是在x轴分别设置了3.14与31.4的对比效果。

angularDamping 角阻尼

刚体的角阻尼相当于是为角速度旋转方向施加了相反的力,使得旋转速度衰减。动图1-5,是在同样的31.4角速度下,左侧为1的的角阻尼值,右侧为0.9的角阻尼值,对比效果。

(动图1-5)


二、物理碰撞

碰撞是物理引擎中最基础、最常用的功能。在这个小节里,我们对3D物理碰撞进行全面的认知。

2.1 碰撞器与触发器

对于检测3D物理碰撞的方式,有碰撞器与触发器两种。我们先从概念认知开始。

2.1.1 碰撞器

在LayaAir引擎2D物理的时候,通过封装的不同形状的碰撞体,就可以直接实现带范围的物理碰撞。

而LayaAir引擎的3D物理,形状不再是最主要的特征,只是碰撞器用于检测碰撞范围的三维形状区域。

完整的3D碰撞器,由碰撞器和碰撞器形状两部分组成。

3D碰撞器根据特点的不同,分为静态碰撞器、刚体碰撞器、角色碰撞器。

这些碰撞器必须要添加三维碰撞器形状(例如:盒形、球形、圆锥形、圆柱形、胶囊形、平面、混合、模型网格),才可以实现有范围的物理碰撞。

    

(图2)

图2是胶囊形状角色碰撞器的编辑预览效果。

2.1.2 触发器

LayaAir 3D物理的触发器相当于2D物理里的传感器。

触发器是碰撞器的一个属性,任何碰撞器的触发器属性设置生效后,当前的碰撞器即转变为触发器(比如,刚体碰撞器设置触发器后可称为刚体触发器)。即使发生物体接触,也不会产生碰撞的物理反馈。例如,动图3-1右侧所示。下落的盒子无视物理引擎,直接穿透而过。

(动图3-1)

设置触发器后,虽然失去了物理引擎反馈,但是可以激活触发器的事件生命周期方法,用于检测物体间碰撞接触的发生。

激活触发器生命周期也有特定的情况除外,具体规则会在下面的物理生命周期章节介绍

当触发器isTrigger设置为true时,或者在Unity的碰撞体组件那里勾选Is Trigger并导出使用时,如图3-2所示。触发器即可设置生效。

(图3-2)

通过LayaAir引擎代码设置触发器的方式:

/*
……省略若干代码
*/
//创建盒型MeshSprite3D
let box = scene.addChild(newLaya.MeshSprite3D(Laya.PrimitiveMesh.createBox(sX, sY, sZ)))asLaya.MeshSprite3D;
//创建静态碰撞器
let staticCollider:Laya.PhysicsCollider= box.addComponent(Laya.PhysicsCollider);
//设置为触发器,取消物理反馈
staticCollider.isTrigger =true;
/*
……省略若干代码
*/
2.2 理解各种碰撞器
2.2.1 静态碰撞器 PhysicsCollider

LayaAir的3D物理碰撞器类是PhysicsCollider,为了便于记忆和理解,我们叫他静态碰撞器类。因为它的特性是不受力,不会产生物理移动。

当其与动力学刚体碰撞器或角色碰撞器发生物理碰撞后,可以触发物理碰撞生命周期方法,但不会产生物理的受力位移。

这种碰撞器可以用于不需要物理受力位移的物体,只需要触发碰撞逻辑的应用场景。例如墙体,撞墙后判定游戏结束。

在Unity中,如果我们添加了某种Collider组件,但并没有添加Rigidbody组件,那导出后就是PhysicsCollider

2.2.2 刚体碰撞器 Rigidbody3D

LayaAir的2D物理刚体与碰撞体是分开的,而3D物理的刚体与碰撞器是整合的,Rigidbody3D类即是刚体也是碰撞器,我们可称为刚体碰撞器。

默认情况下,Rigidbody3D动力学类型的刚体碰撞器,这是可以受力影响的刚体类型碰撞器,所以我们通常用动力学刚体碰撞器进行受力的交互反馈。例如,撞击后的反弹、飞出或者倒下,放在空中会受重力影响而掉落,等等。

当我们将刚体Rigidbody3DisKinematic设置为true后,那么默认的动力学刚体碰撞器就转变为运动刚体碰撞器。

运动刚体碰撞器从表象上看,与静态碰撞器基本上没有什么区别。都是不受重力、不受速度、不受其它力的影响,在物理世界中永远处于静止,只能通过transform去改变节点坐标来移动。

但实质上,运动刚体有物理特性,它可以是施力物体,可以对非运动刚体产生力,例如通过控制节点去移动运动刚体,会推着挡在前面的动力学刚体移动。而静态碰撞器的应用场景则是要永远不动,也无法施加力。并且,通过节点去移动静态碰撞器,也比较消耗性能。如果有移动的碰撞器需求,例如来回移动的跳板或障碍,使用运动刚体碰撞器就可以了。

通过代码设置运动刚体的方式:

/*
……省略若干代码
*/
//创建刚体碰撞器
let _rigidBody = sphere.addComponent(Laya.Rigidbody3D)asLaya.Rigidbody3D;
//开启运动类型刚体
_rigidBody.isKinematic =true;
/*
……省略若干代码
*/

在Unity中设置运动类型刚体的方式,如图4所示:

(图4)

由于LayaAir的3D物理中有了静态碰撞器PhysicsCollider,所以并没有在Rigidbody3D中去实现静力学类型的刚体碰撞器。有静止的碰撞反馈需求,直接使用静态碰撞器即可。

2.2.3 角色碰撞器 CharacterController

角色控制器类CharacterController常用于对第一人称和第三人称游戏角色的控制,可以方便的控制角色的跳跃、跳跃速度、降落速度、行走、等。

由于角色控制器继承于PhysicsComponent,也具有碰撞器的特性,可以添加三维碰撞形状,产生碰撞的反馈,因此也称为角色碰撞器,属于碰撞器之一。

与静态碰撞器和刚体碰撞器都继承自物理触发器组件PhysicsTriggerComponent不同,角色控制器直接继承于物理组件的父类PhysicsComponent。所以,角色控制器是无法设置为触发器的。但是,角色碰撞器与触发器进行接触,仍然可以激活触发器事件的生命周期方法。

2.3 碰撞形状

碰撞形状是用于检测碰撞接触的范围,只有添加了形状,碰撞器和触发器才能触发物理反馈和生命周期。

LayaAir引擎支持8种3D碰撞形状,分别为:

盒形BoxColliderShape
球形SphereColliderShape
圆柱形CylinderColliderShape
胶囊形CapsuleColliderShape
圆锥形ConeColliderShape
平面形状StaticPlaneColliderShape
复合形状CompoundColliderShape
网格形状MeshColliderShape

2.3.1 Unity中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值