形状是物理引擎进行碰撞模拟计算的依据,是刚体最基本的属性。

P2中使用Shape类来表示形状,通过刚体的addShape()方法,将形状添加到刚体中之后,

就可以随着刚体的移动、旋转不断更新,并进行碰撞检测了。为刚体添加形状的示例代码为:

var shape:p2.Shape=new p2.Shape(); 
var body:p2.Body=new p2.Body(); 
body.addShape(shape); 


Shape类本身并不参与刚体的创建,而是由其几个子类完成一些常见形状的模拟。

这些形状包括圆形Circle、矩形Box、胶囊Capsule、粒子Particle、线段Line、平面Plane、海拔形状HightField、多边形Convex等。

1)形状:
游戏中人物形状各种各样,但在碰撞检测时,出于效率考虑,大都被简化为简单的圆形、矩形等形状。P2预置了包括圆形、矩形在内的一些常用的、简单的形状。 
⑴圆形Circle:
圆形是P2中的基本形状,构造函数为: 
function Circle({options?:{radius:number}) 
其中,options是包含所有属性的集合对象;radius是圆形的半径,默认值为1。 
⑵矩形Box:
矩形通过width和height属性来创建,构造函数为: 
function Box(options:{width?:number, height?:number}) 
其中,width为矩形宽度,默认为1;height为矩形高度,默认值为1。 
⑶胶囊Capsule:
可以认为是一种圆角矩形,长度length,高度2*Radius,两端是半径为Radius的半圆形。 
function Capsule(options?:{length?:number, radius?:number}) 
其中,length为胶囊长度;radius为胶囊形状两端半圆的半径,同时也是胶囊的高度。 
⑷粒子Particle:
粒子就是微小的颗粒,P2物理引擎中的粒子半径和面积为0。粒子参与碰撞检测,效果与半径为1px的圆形一样。构造函数简单,不需要任何参数: 
function Particle() 
⑸线段Line:
长度为length的线段,看上去与高度为1的Box形状一样,但算法上省去对高度的检测。 
function Line(options?:{length?:number}) 
⑹平面Plane:
平面沿y轴负方向无限扩展,同时在x轴方向的宽度无限,像地平面。构造函数为: 
function Plane() 
创建时没有任何参数,初始情况下是一个倒置的穹,实际应用时一般要通过调整刚体的角度angle,使plane平面朝向不同的方向,来模拟墙体。示例代码: 
var shape:p2.Plane=new p2.Plane(); 
var body:p2.Body=new p2.Body({mass:1, position:[274/this.factor, 200/this.factor]}); 
body.addShape(shape); 
body.angle=Math.PI/4; 
this.world.addBody(body); 
代码中的平面会随着刚体的角度angle绕坐标点[274,200]顺时针旋转45°。 
⑺海拔形状Heightfield:
这是一个类似于Plane的形状,但不是平的,而是一组y坐标组成的高低不平的山形,这些山丘之间的间隔都是固定的elementWidth。HeightField形状也是朝y轴负方向无限扩展的,水平方向的宽度是elementWidth与山丘数量的乘积。构造函数为: 
function Heightfield(options?:{heights:number[], minValue?:number,maxValue?:number, elementWidth?:number}) 
其中,heights是保存每个山丘高度的数组;minValue是山丘高度的最小值,设置后heights中的小于minValue的值设置为minValue;maxValue为heights中高度的最大值,设置此值后heights中大于maxValue的值设置为maxHeight;elementWidth为每个山丘之间的间隔,默认为1。 
定义Heightfield形状就是定义heights属性中y坐标数组,同时x坐标以elementWidth为步长逐一增加。目前,Heightfield不支持旋转,始终朝y轴负方向扩展,碰撞检测也不精确,边缘位置容易出现穿透现象。 
⑻多边形Convex:
Convex是一个多边形形状,可以根据一组定义好的顶点坐标创建对应的多边形形状。 
function Convex(options?:{vertice?:number[][], axes?:number[][[]}) 
其中,vertices保存了顶点坐标的数组,这是一个二维数组,每个元素是由x和y坐标组成的一维数组,如vertics=[[-1,-1],[1,-1],[1,1],[-1,-1]];axes表示多边形各个边的对称轴,同样是一个二维数组,且长度应与vertices一致,此参数通常可以使用默认值,系统根据vertices中的顶点自动计算得出垂直于各个边的法向量。使用时首先要将多边形的顶点坐标保存到数组中,然后将其作为vertices参数传递给Convex: 
var points=[[-1,-1],[1,-1],[1,1],[-1,-1]]; 
var shape:p2.Convex=new p2.Convex({vertices:points}); 
var body:p2.Body=new p2.Body({mass:1}); 
body.addShape(shape); 
this.world.addBody(body); 
不推荐使用顶点坐标直接创建多边形,因为可能出现凹多边形,而P2中的碰撞检测是基于凸多边形的,需要将凹多边形分解成多个小的凸多边形,还需要重新计算分解后的重心、形状偏移,这些计算并不在Convex类中。建议使用Body类的fromPolygon()实现。

p2 形状的更多相关文章

  1. SKPhysicsBody类

    继承自 NSObject 符合 NSCodingNSCopyingNSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framewo ...

  2. p2.js物理引擎学习

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

  3. Egret中使用P2物理引擎

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

  4. p2 碰撞

    P2可以实现物体碰撞模拟,同时在碰撞过程中派发一些事件实现碰撞检测,将碰撞信息及时反馈,以添加相应的特效. P2中,当两个刚体的最小包围盒AABB发生重叠,碰撞就开始了:然后刚体的形状发生重叠,同时P ...

  5. p2 关节

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

  6. p2 钢体

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

  7. p2 入门

    心里一片空白,要弄个p2的demo出来... 先了解下p2的概念吧 P2只是一个算法库,以刚体为对象模型,模拟并输出物理碰撞.运动结果.这个过程通过持续调用world中的step()方法来实现 p2的 ...

  8. openCV - 5~7 图像混合、调整图像亮度与对比度、绘制形状与文字

    5. 图像混合 理论-线性混合操作.相关API(addWeighted) 理论-线性混合操作 用到的公式 (其中 α 的取值范围为0~1之间) 相关API(addWeighted) 参数1:输入图像M ...

  9. egret p2物理引擎 遇到的坑(1)

    直接将pythsic包丢到libs目录下并且修改egretPropertis.json文件 TypeError [ERR_INVALID_ARG_TYPE]: The "to" a ...

随机推荐

  1. linux——nginx的安装及配置

    目录 1. 在Linux上安装nginx 2. 配置nginx反向代理 1. 在Linux上安装ngix 1.1 在以下网页下载nginx的tar包,并将其传到linux中 http://nginx. ...

  2. 20155212 2016-2017-2 《Java程序设计》第3周学习总结

    20155212 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 Chapter 4 要产生对象必须先定义类,类是对象的设计图,对象时类的实例. 一个原始码中 ...

  3. 20155226 2016-2017-2 《Java程序设计》课程总结

    20155226 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:师生关系 预备作业2:优秀技能经验 预备作业3:虚拟机linux初接触 第一周学习总结: ...

  4. 预备作业03: 初体验---虚拟机virtual box

    学习基于VirtualBox虚拟机安装Ubuntu图文教程在自己笔记本上安装Linux操作系统 昨天从下午到晚上一直在研究怎么安装也问了很多同学,也自己查了查百度,经过一晚上终于安装成功,于是今天一早 ...

  5. 20155320《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20155320<Java程序设计>实验一(Java开发环境的熟悉)实验报告 实验内容及步骤 (一)命令行下Java程序开发 步骤一:首先在cmd中输入d:和cd ljq20155320进 ...

  6. BZOJ1010_玩具装箱toy_KEY

    题目传送门 这道题可以很快想到暴力DP的做法: f[i]=min(f[i],f[j]+(C[i]-C[j]+i-j--L)^); 但是数据范围有50000,这就需要用斜率优化了. 我们设S[i]=C[ ...

  7. 如何指定rman下的备份路径

    如果不想使用缺省路径,可以以如下方式来指定: RMAN> configure channel 1 device type disk format '/rman/bak/%F';RMAN> ...

  8. 【转载】C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理

    原文:C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理 运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换 ...

  9. 【LG3973】[TJOI2015]线性代数

    [LG3973][TJOI2015]线性代数 题面 洛谷 题解 正常解法 一大堆矩阵乘在一起很丑对吧 化一下柿子: \[ D=(A*B-C)*A^T\\ \Leftrightarrow D=\sum_ ...

  10. 探究linux设备驱动模型之——platform虚拟总线(一)

    说在前面的话 :      设备驱动模型系列的文章主要依据的内核版本是2.6.32的,因为我装的Linux系统差不多就是这个版本的(实际上我用的fedora 14的内核版本是2.6.35.13的.) ...