p2 碰撞
P2可以实现物体碰撞模拟,同时在碰撞过程中派发一些事件实现碰撞检测,将碰撞信息及时反馈,以添加相应的特效。
P2中,当两个刚体的最小包围盒AABB发生重叠,碰撞就开始了;然后刚体的形状发生重叠,同时P2会对重叠进行修复,使刚体朝对方的反方向移动,来消除形状重叠;当形状不再有重叠时,整个碰撞过程结束。可以把碰撞过程分为4个阶段:
·postBroadphase:AABB开始发生重叠,但形状并没有发生接触
·beginContact:刚体形状开始发生重叠,刚体继续保持原有速度移动
·preSolve:刚体形状发生了重叠,但P2还未进行碰撞处理
·endContact:P2已经完成了碰撞处理,并为碰撞刚体重新分配了速度,同时刚体形状分离,不再有重叠
1)碰撞事件:
碰撞过程会产生4个事件,postBroadphase、preSolve、beginContact、endContact。在碰撞事件派发后,可以通过world类的on方法来监听事件,并在监听处理函数中进行对应的处理。on方法的结构为:
function on(type:String, listener:functtion)
其中,type为监听事件名,为一个字符串,取值为对应的事件名称;listener为事件监听函数,当监听到碰撞事件后,会自动调用监听函数,并将碰撞事件对象作为参数传递给监听处理函数。碰撞监听函数的参数event是一个Object对象,对应碰撞事件对象,其中保存碰撞信息。
在on事件处理函数中,this指的是派发事件的对象context,也就是world对象,而不再是主类中的this。因此,需要在on函数之前,将this指针保存到一个局部变量中,然后才能在事件处理函数中通过这个局部变量访问主类中的变量和方法。
on()方法监听碰撞事件时,会将对应的碰撞事件对象作为参数传递给监听处理函数,这些碰撞事件对象为:postBroadphaseEvent、preSolveEvent、beginContactEvent、endContactEvent。
①postBroadphaseEvent:
当两个刚体的AABB发生重叠时,不断派发postBroadphase事件,并将碰撞信息保存到对应的postBroadphaseEvent对象中,该对象包含属性pairs,即保存碰撞刚体对的数组。因为尚未进行刚体形状的碰撞检测,所以此时对pairs数组中的碰撞进行删减可以取消对应碰撞刚体之间的碰撞模拟。但删除pairs后,将不再进行beginContact和endContact事件派发。
②preSolveEvent:
在刚体形状发生重叠时,P2会根据动量守恒定律,对碰撞对象的速度和角度重新计算,实现碰撞模拟,这个过程称为solve。preSolve事件在碰撞模拟过程前派发,在preSolve事件处理函数中进行一些处理可以取消或干预碰撞的模拟。
preSolveEvent对象的属性有:
·contactEquations:保存当前碰撞产生的所有contactEquation对象的数组
·frictionEquations:保存当前碰撞产生的所有frictionEquation对象的数组
preSolve事件会随step()方法不断派发,在刚体形状之间没有重叠前,contactEquations属性中并不包括contactEquation对象,所以代码中要先进行判断:contactEquations.length>0。
③beginContactEvent:
当刚体形状发生重叠时会派发beginContact事件,并将碰撞信息保存在对应的beginContact Event对象中,其中属性有:
·shapeA:发生碰撞的形状A
·shapeB:发生碰撞的形状B
·bodyA:形状shapeA对应的刚体
·bodyB:形状shapeB对应的刚体
·contactEquations:保存当前碰撞产生的所有contactEquation对象的数组
④endContactEvent:
当前两个碰撞刚体的形状分离而不再重叠时会派发endContact事件,并将碰撞信息保存在对应的endContactEvent对象中,包含的属性有:
·shapeA:发生碰撞的形状A
·shapeB:发生碰撞的形状B
·bodyA:形状shapeA对应的刚体
·bodyB:形状shapeB对应的刚体
2)碰撞信息Equation:
在P2引擎中,Equation类用来保存碰撞发生时的碰撞点、碰撞向量等信息。一般用其两个子类ContactEquation和FrictionEquation来保存不同类型的信息。
①ContactEquation:
碰撞过程中,因接触而产生的碰撞信息,如碰撞点、碰撞向量、碰撞刚体等,都保存在ContactEquation对象中。在preSolve和beginContact阶段,会产生多个ContactEquation对象,并分别保存在preSolveEvent和beginContactEvent事件对象的ContactEquation属性中。
·shapeA:发生碰撞的形状A
·shapeB:发生碰撞的形状B
·bodyA:形状shapeA对应的刚体
·bodyB:形状shapeB对应的刚体
·contactPointA:自bodyA的坐标起,到碰撞点的全局向量
·contactPointB:自bodyBA的坐标起,到碰撞点的全局向量
·enabled:是否对当前的ContactEquation对象进行碰撞模拟,默认true,如果在preSolve阶段将其设为false可以取消碰撞模拟
·firstImpact:是否为第1次碰撞,当第1次碰撞step()完成后,firstImpact立即设为false
·normalA:垂直于刚体碰撞边的法向量,这是一个全局的单位向量
·restitution:碰撞刚体之间的碰撞弹性系数,取值0~1。该系数只影响当前碰撞的模拟,如果对shapeA和shapeB设置contactMaterial,其restitution属性不受影响。
②FrictionEquation:
碰撞过程中,因刚体相对运动而产生的摩擦等碰撞信息,保存在FrictionEquation对象中。在碰撞的preSolve阶段会产生FrictionEquation对象,并保存在preSolveEvent事件对象的FrictionEquation属性中。FrictionEquation对象包含的属性有:
·shapeA:发生碰撞的形状A
·shapeB:发生碰撞的形状B
·bodyA:形状shapeA对应的刚体
·bodyB:形状shapeB对应的刚体
·frictionCoefficient:碰撞时刚体之间的碰撞系数,取值越大速度衰减越快,只影响当前碰撞模拟。如果有对shapeA和shapeB设置contactMaterial,其friction属性不受影响。
·t:碰撞边的切线方向向量
需要注意,frictionCoefficient属性需要在world.solver.frictionIterations>0情况下才起作用,frictionIterations默认是0,需要在创建world时设置其值。
p2 碰撞的更多相关文章
- 【h5游戏开发】egret引擎p2物理引擎 - 小球碰撞地面搞笑的物理现象
重力的方向和地面的问题 p2中默认的方向是从上到下,如果重力默认是正数的话,物体放到世界中是会从上面往下面飘的 p2中plane地面默认的方向是y轴的方向,而在p2中y轴的方向默认是从上往下 首先来看 ...
- 多边形碰撞 -- SAT方法
检测凸多边形碰撞的一种简单的方法是SAT(Separating Axis Theorem),即分离轴定理. 原理:将多边形投影到一条向量上,看这两个多边形的投影是否重叠.如果不重叠,则认为这两个多边形 ...
- 常见行为:仿真&重力&碰撞&捕捉
一.UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架.可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象,重力.弹性碰撞等,游戏开发中很常见,例如愤怒的小鸟. 二.UI ...
- p2.js物理引擎学习
P2简介 P2是一款基于Javascript编写的HTML5 2D物理引擎,和Box2D.Nape等2D物理引擎一样,P2集成了各种复杂的物理公式和算法,可以帮助我们轻松的实现碰撞.反弹等物理现象的模 ...
- Egret中使用P2物理引擎
游戏中的对象按照物理规律移动,体现重力.引力.反作用力.加速度等物体特性,实现自由落体.摇摆运动.抛物线运动,以及物理碰撞现象的模拟.用于模拟物理碰撞.物理运动的引擎称为物理引擎. 来自瑞典斯德哥尔摩 ...
- Egret P2 ( 一) 掉落的小球
实际效果(蛋疼这个gif制作软件,帧率太低....): 一 Egret和P2的坐标系 首先了解下P2和Egret的坐标系. 某人链接:http://blog.csdn.net/qilei2010/ar ...
- p2 关节
P2中使用Constraint及其子类表示关节,也就是将两个刚体按照指定的规则约束在一起,形成有规律的.相互限制的运动模拟.P2关节模拟中,两个刚体没有通过任何刚体连接,只是通过算法模拟出关节运动轨迹 ...
- p2 形状
形状是物理引擎进行碰撞模拟计算的依据,是刚体最基本的属性. P2中使用Shape类来表示形状,通过刚体的addShape()方法,将形状添加到刚体中之后, 就可以随着刚体的移动.旋转不断更新,并进行碰 ...
- p2 钢体
钢体可以控制沿x方向移动,沿y方向移动, 不旋转等. fixedX, fixedY, fixedRotaion 1)addBody和removeBody:World类中的addBody()和remov ...
随机推荐
- Kubernetes学习之路(十四)之服务发现Service
一.Service的概念 运行在Pod中的应用是向客户端提供服务的守护进程,比如,nginx.tomcat.etcd等等,它们都是受控于控制器的资源对象,存在生命周期,我们知道Pod资源对象在自愿或非 ...
- [JLOI2013]地形生成[组合计数]
题意 \(n\) 元素各有一个高度 \(h\) 和关键数字 \(b\) .求有多少个下标序列和高度序列,满足对任意 \(i\),\(j< i\) 且 \(h_j < h_i\)的 \(j\ ...
- check the manual that corresponds to your MySQL server version for the right syntax to use near
一.问题 mysql插入数据时报错 sql如下 insert into t_sysconfig (servercode,key,value,remark,updatetime) values (&qu ...
- RESTful简介
一.RESTful是什么? RESTful架构,就是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以正得到越来越多网站的采用.Fielding将他对互联网软件的架构原则, ...
- 【轮子狂魔】手把手教你自造Redis Client
为什么做Redis Client? Redis Client顾名思义,redis的客户端,主要是封装了一些对于Redis的操作. 而目前用的比较广泛的 ServiceStack.Redis 不学好,居 ...
- python易错盲点排查之+=与+的区别分析以及一些赋值运算踩过的坑
问题1. int和list是不一样的 >>> a=1 >>> b=a >>> a+=1 >>> a,b (2, 1) >& ...
- Linux学习之常用命令(二)
1.上次介绍了一些常用的系统命令,这次又总结了一些小命令,故分享一下: 网卡地址查询的命令: ifconfig #不同于Windows系统,它的是ifconfig而不是ipconfig ip -a # ...
- myBatis逆向工程的使用
使用myBatis Generator可以快速生成实体类.dao类和mapper文件.有两种方式,现在说的是比较灵活的方式.本文栗子使用的是IDEA,目录结构为maven项目的结构. 1.在pom.x ...
- 关于java学习中的一些易错点(基础篇)
由JVM来负责Java程序在该系统中的运行,不同的操作系统需要安装不同的JVM,这样Java程序只需要跟JVM打交道,底层的操作由JVM去执行. JRE(Java Runtime Environmen ...
- ADO.net中DataTable的应用
一.思维导图 二.知识点描述 (1)构造函数 DataTable() 不带参数初始化DataTable类的新实例 DataTable(string tableName) 用指定的表名初始化DataT ...