zoukankan      html  css  js  c++  java
  • p2 形状

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

    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()实现。

  • 相关阅读:
    redhat 新装后不能联网
    [Linux 命令]df -h
    redhat安装VMware tools的方法
    linux 进入包含空格文件名的文件夹
    Redhat 使用中文安装后更换为英文的设定
    HibernateDaoSupport类的使用
    java中重载与重写的区别
    Servlet中Service方法
    持久化框架Hibernate 开发实例(二)
    持久化框架Hibernate 开发实例(一)
  • 原文地址:https://www.cnblogs.com/honghong87/p/9893046.html
Copyright © 2011-2022 走看看