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 碰撞的更多相关文章

  1. 【h5游戏开发】egret引擎p2物理引擎 - 小球碰撞地面搞笑的物理现象

    重力的方向和地面的问题 p2中默认的方向是从上到下,如果重力默认是正数的话,物体放到世界中是会从上面往下面飘的 p2中plane地面默认的方向是y轴的方向,而在p2中y轴的方向默认是从上往下 首先来看 ...

  2. 多边形碰撞 -- SAT方法

    检测凸多边形碰撞的一种简单的方法是SAT(Separating Axis Theorem),即分离轴定理. 原理:将多边形投影到一条向量上,看这两个多边形的投影是否重叠.如果不重叠,则认为这两个多边形 ...

  3. 常见行为:仿真&重力&碰撞&捕捉

    一.UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架.可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象,重力.弹性碰撞等,游戏开发中很常见,例如愤怒的小鸟. 二.UI ...

  4. p2.js物理引擎学习

    P2简介 P2是一款基于Javascript编写的HTML5 2D物理引擎,和Box2D.Nape等2D物理引擎一样,P2集成了各种复杂的物理公式和算法,可以帮助我们轻松的实现碰撞.反弹等物理现象的模 ...

  5. Egret中使用P2物理引擎

    游戏中的对象按照物理规律移动,体现重力.引力.反作用力.加速度等物体特性,实现自由落体.摇摆运动.抛物线运动,以及物理碰撞现象的模拟.用于模拟物理碰撞.物理运动的引擎称为物理引擎. 来自瑞典斯德哥尔摩 ...

  6. Egret P2 ( 一) 掉落的小球

    实际效果(蛋疼这个gif制作软件,帧率太低....): 一 Egret和P2的坐标系 首先了解下P2和Egret的坐标系. 某人链接:http://blog.csdn.net/qilei2010/ar ...

  7. p2 关节

    P2中使用Constraint及其子类表示关节,也就是将两个刚体按照指定的规则约束在一起,形成有规律的.相互限制的运动模拟.P2关节模拟中,两个刚体没有通过任何刚体连接,只是通过算法模拟出关节运动轨迹 ...

  8. p2 形状

    形状是物理引擎进行碰撞模拟计算的依据,是刚体最基本的属性. P2中使用Shape类来表示形状,通过刚体的addShape()方法,将形状添加到刚体中之后, 就可以随着刚体的移动.旋转不断更新,并进行碰 ...

  9. p2 钢体

    钢体可以控制沿x方向移动,沿y方向移动, 不旋转等. fixedX, fixedY, fixedRotaion 1)addBody和removeBody:World类中的addBody()和remov ...

随机推荐

  1. Quartz动态添加,修改,删除任务(暂停,任务状态,恢复,最近触发时间)

    首页 博客 学院 下载 图文课 论坛 APP 问答 商城 VIP会员 活动 招聘 ITeye GitChat 写博客 小程序 消息 登录注册 关闭 quartz_Cron表达式一分钟教程 09-05 ...

  2. 2_C语言中的数据类型 (五)char

    1.1       char类型 1.1.1          char常量,变量 char c:定义一个char变量 ‘a’,char的常量 Char的本质就是一个整数,一个只有1个字节大小的整数 ...

  3. 巧用 Python 找工作(资料在文末)

    前言 近年来 Python 之火大家都有感而知,那亲们知道北京的 Python 开发岗位.运维开发岗位招聘地域都是如何分布的吗?薪水如何?是否有前景等等,这些数据呢直接通过招聘信息来了解到企业用人是最 ...

  4. MySQLConnector/ODBC 安装时遇到的小问题

    今天在新做的 Win2008R2 上想使用 SqlDbx 管理 MySQL,提示需要安装 MySQLConnector/ODBC,这没什么,以前装过的,按要求下载安装一个就是了. 结果在安装 MySQ ...

  5. SpringBoot之MongoTemplate的查询可以怎么耍

    学习一个新的数据库,一般怎么下手呢?基本的CURD没跑了,当可以熟练的增.删.改.查一个数据库时,可以说对这个数据库算是入门了,如果需要更进一步的话,就需要了解下数据库的特性,比如索引.事物.锁.分布 ...

  6. spring cloud 入门系列:总结

    从我第一次接触Spring Cloud到现在已经有3个多月了,当时是在博客园里面注册了账号,并且看到很多文章都在谈论微服务,因此我就去了解了下,最终决定开始学习Spring Cloud.我在一款阅读A ...

  7. shell解析ini格式文件

    功能 本脚本实现了ini文件中的查询修改指定value 百度云连接地址 链接:https://pan.baidu.com/s/12_T5yST7Y3L1H4_MkVEcvA 密码:fo5p 解压后先看 ...

  8. python打包成exe文件

    在cmd命令提示符窗口中输入pip install pyinstaller(在python3的环境下,假如不能安装的话,用pip3 install pyinstaller指令) 使用指令pyinsta ...

  9. Flink 部署文档

    Flink 部署文档 1 先决条件 2 下载 Flink 二进制文件 3 配置 Flink 3.1 flink-conf.yaml 3.2 slaves 4 将配置好的 Flink 分发到其他节点 5 ...

  10. 为什么使用React Native

    React Native使你能够在Javascript和React的基础上获得完全一致的开发体验,构建世界一流的原生APP. React Native着力于提高多平台开发的开发效率 —— 仅需学习一次 ...