P2中使用Constraint及其子类表示关节,也就是将两个刚体按照指定的规则约束在一起,形成有规律的、相互限制的运动模拟。P2关节模拟中,两个刚体没有通过任何刚体连接,只是通过算法模拟出关节运动轨迹。为了更加直观,p2DebugDraw类中使用黑色的线段表示连接刚体的连杆,黑点圆的表示关节节点anchor。 
P2中关节有5种,每一种都有独特的约束规则,包括距离关节DistanceConstraint、齿轮关节GearConstraint、锁定关节LockConstaint、位移关节PrismaticConstraint、旋转关节Revilute Constraint。 
1)距离关节DistanceConstraint:
按照指定的距离distance将两个刚体约束在一起,其中任何一个刚体的位置发生变化,会牵着另一个刚体运动,以保证两者的间距为distance。但是两个刚体的角度不受约束,可以绕着节点旋转。DistanceConstraint构造函数为: 
function DistanceConstraint(bodyA:Body, bodyB:Body, options:object) 
其中,bodyA和bodyB为受约束的刚体,options为关节设置选项,可以缺省,P2以默认值设置,其中选项为: 
·distance:两个刚体受到约束时保持的间距,默认为添加关节时两个刚体之间的间距 
·localAnchorA:关节点相对于刚体bodyA本地坐标系统的坐标系,默认[0,0] 
·localAnchorB:关节点相对于刚体bodyB本地坐标系统的坐标系,默认[0,0] 
·maxForce:刚体运动中,如果距离不等于distance,为保持距离而对刚体施加的最大作用力,默认为Number.MAX_VALUE 
除了上面的构造函数中的参数,距离关节还包含一些属性: 
·lowerLimit:设置距离关节约束范围下限,即bodyA到bodyB的距离最小值,默认为0,该属性必须大于0。只有当lowerLimitEnabled为true时才起作用。 
·lowerLimitEnabled:是否设置距离关节约束范围下限,默认false。 
·upperLimit:设置距离关节约束范围上限,即bodyA到bodyB的距离最大值,默认为0,该属性必须大于0。只有当upperLimitEnabled为true时才起作用。 
·upperLimitEnabled:是否设置距离关节约束范围上限,默认false 
·position:bodyA和bodyB的当前间距 
可以通过joint.collideConnected属性为true,避免平台和车轮之间的碰撞。创建完成后需要使用world的addConstraint(joint)方法将关节加入世界。 
2)齿轮关节GearConstraint:
按照指定的比例ratio,将两个刚体的角度angleA和angleB约束为angle=angleB*ratio。其中任何一个刚体的角度变换,都会牵着另一个刚体的角度变化,以确保两个刚体角度的比例为ratio。刚体的坐标位置不受约束,可以自由向任意方向移动。构造函数为: 
function GearConstraint(bodyA:body, bodyB:Body, options:Object) 
其中,bodyA和bodyB为受关节约束的两个刚体,options为关节设置选项,可以缺省,P2会按默认值进行设置。选项为: 
·angle:两个刚体的相对角度差,齿轮关节会将一个刚体的角度减去该角度差后,再保证角度变化量的比例为ratio 
·ratio:两个刚体的角度变化量的比例,当ratio=2时,bodyB旋转180°,bodyA只转90° 
·maxForce:当两个刚体的角度比例不是ratio时,为将其约束为ratio而对刚体施加的最大扭力 
齿轮关节还有两种方法: 
·setMaxForce(force):当bodyB的角度偏离angle,齿轮关节对bodyB施加的最大扭力 
·getMaxForce():number:获取setMaxForce()中设置的最大作用力 
3)锁定关节LockConstraint:
将两个刚体绑定在一起,使其相对坐标位置、角度差保存不变,仿佛被钉在一起。此关节中的任何刚体坐标或角度发生变化,都会牵着另一个刚体的坐标和角度变化,以确保两个刚体相对坐标和角度分别为localOffsetB和localAngleB。构造函数: 
function LockConstraint(bodyA:Body, bodyB:body, options:Object) 
其中,bodyA和bodyB为受关节约束的两个刚体,options为关节设置选项,可以缺省,P2会按默认值进行设置。选项为: 
·localOffsetB:刚体bodyB在关节约束下,相对于bodyA本地坐标系的偏移量,默认为添加关节时两个刚体的相对位置 
·localAngleB:刚体bodyB在关节约束下,相对于bodyA本地坐标系统的角度,默认时为添加关节时两个刚体的相对角度 
·maxForce:当两个刚体未达到关节约束的localOffsetB和localAngleB,为使其达到约束指定状态,而可以施加的最大作用力,默认Number.MAX_VALUE 
LockConstraint还包含几个方法: 
·setMaxForce(force):当bodyB的位置偏离localOffsetB,或角度差不等于localAngleB时,锁定关节对bodyB施加的最大作用力。 
·getMaxForce():number:获取setMaxForce()中设置的最大作用力 
4)位移关节PrismaticConstraint:
将刚体bodyB的运动方向,限定为在刚体bodyA本地坐标系统中的一个指定向量。构造函数为: 
function PrismaticContraint(bodyA:Body, bodyB:Body, options:Object) 
其中,bodyA和bodyB为受约束的刚体,options为关节设置选项,可以缺省,P2以默认值设置,其中选项为: 
·maxForce:当bodyB相对于bodyA的位置偏离localAxisA时,为使其恢复到约束位置,可以施加的最大作用力,默认为Number.MAX_VALUE 
·localAnchorA:控制点anchorA在bodyA本地坐标系下的坐标,默认[0,0] 
·localAnchorB:控制点anchorB在bodyB本地坐标系下的坐标,默认[1,0] 
·localAxisA:刚体受到约束时只可以在该坐标轴方向上移动,这是刚体bodyA坐标系下的一个向量,默认[1,0] 
·disableRotationalLock:是否禁止bodyB绕节点旋转,默认false,即bodyB不能自由旋转,此值只有在构造函数中设置才起作用。 
·upperLimitEnabled:是否开启bodyB移动方向上限,默认false,此时可以沿localAxisA正方向无限移动 
·upperLimit:设置bodyB沿localAxisA正方向可以移动的最大距离,默认为1 
·lowerLimitEnabled:是否开启bodyB移动方向下限,默认false,此时可以沿localAxisA负方向无限移动 
·lowerLimit:设置bodyB沿localAxisA负方向可以移动的最大距离,默认为0,该属性值要小于upperLimit 
除了上述在构造函数中的参数,PrismaticConstraint还有其他一些属性: 
·motorEnabled:是否开启马达属性,与motorSpeed配合使用。开启后,关节会对bodyB施加作用力,使其线速度达到motorSpeed,并在约束范围内一直保持该速度。开启或关闭马达属性,要用enableMotor()和disableMotor()方法。 
·motorSpeed:开启马达属性后,bodyB的目标速度值 
·position:在localAxisA上,bodyB相对于bodyA的当前位置 
PrismaticConstraint还有一些方法,用于调整关节的相关属性: 
·setLimits(lower, upper):设置位移关节的上下限,其中lower一定要小于upper 
·disableMotor():关闭马达属性 
·enableMotor():开启马达属性 
可以创建一个空刚体来固定关节。所谓空刚体,就是没有包含任何形状对象的刚体,所以不会与任何刚体发生碰撞模拟。 
5)旋转关节RevoluteConstraint:
限制两个刚体只能绕指定的控制点旋转,该控制点是刚体bodyA本地坐标系下的坐标。其中一个刚体的位置或角度发生变化时,为了确保控制点和刚体的相对位置不变,另一个刚体也会被牵制发生位置和角度的变化。构造函数为: 
function RevoluteConstraint(bodyA:Body, bodyB:Body, options:Object) 
其中,bodyA和bodyB为受关节约束的两个刚体,options为关节设置选项,可以缺省,P2会按默认值进行设置。选项为: 
·worldPivot:全局坐标系下的关节节点,bodyA和bodyB均受约束,只能绕该节点旋转。设置该节点后,旋转关节会自动计算localPivotA和localPivotB本地节点。 
·localPivotA:节点worldPivot在bodyA刚体本地坐标系统下的坐标,默认[0,0] 
·localPivotB:节点worldPivot在bodyB刚体本地坐标系统下的坐标,默认[0,0] 
·maxForce:当刚体坐标偏离节点时,为使其恢复到节点位置,可以施加的最大作用力,默认为Number.MAX_VALUE 
RevoluteConstraint还包含几个方法: 
·setLimits(lower:number, upper:number):设置bodyB绕节点旋转角度的上下限,值为弧度 
·enableMotor():开启马达属性,与setMotorSpeed()配合使用,关节会对bodyB施加扭力,使其达到setMotorSpeed() 
·disableMotor():关闭马达属性 
·setMotorSpeed(speed):设置bodyB的目标角速度,只有开启马达属性后才其作用。 
·getMotorSpeed():number:读取马达的当前速度 
旋转关节常用于模拟小车运动。

p2 关节的更多相关文章

  1. Egret中使用P2物理引擎

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

  2. p2 弹簧

    P2中用来约束刚体运动的还有弹簧Spring. 弹簧除约束两个刚体之间的运动轨迹外,通过damping阻尼和stiffness刚度系数等属性,使得刚体在向目标移动时, 出现类似弹簧的简谐运动.Spri ...

  3. Nexus Repository Manager OSS 代理 p2 源

    用maven管理构建Eclipse RCP项目时,可能会用到p2源: http://download.eclipse.org/releases/mars/ 内网用户肯定希望能通过nexus服务器代理, ...

  4. Equinox P2的学习

    product.configuration 点击“Add按钮”并添加以下插件: org.eclipse.equinox.p2.ui org.eclipse.equinox.p2.ui.sdk org. ...

  5. Box2D淌坑日记: 关节(Joint)和旋转关节(b2RevoluteJoint)

    关节在Box2D的对象组织结构中,与b2Body(刚体)并列.因此两种对象都是由b2World创建并直接管理. 然而Joint有依赖于b2Body的地方,就是它的销毁:当关节所涉及到的刚体被销毁,关节 ...

  6. RCP: P2 Update两个烦人bug和解决办法

    问题 Eclipse新的P2 Update机制,使用起来很方便,如果使用P2 plugin自带的UI,开发者完全不用写任何代码 即可实现application的在线更新. 但是P2 Update至少有 ...

  7. Unity 物理引擎动力学关节

    Unity物理引擎中的各个动力学关节 Hinge Joint (铰链关节) Fixed Joint (固定关节) Spring Joint (弹簧关节) Character Joint(角色关节) C ...

  8. box2dweb之关节joint(连接器)

    1 概述 前篇基础文章看完后基本上就应该对box2dweb能上手了,下面来介绍一下box2dweb非常重要的一个概念,关节(joint)也有叫连接器的,总之是一个意思.下面是关节详细的类库说明: BO ...

  9. 实例介绍Cocos2d-x中Box2D物理引擎:使用关节

    下面我们将使用Box2D物理引擎技术进行重构.使得关节能够掌握如何在Box2D使用关节约束.HelloWorldScene.cpp中与使用关节的相关代码如下: void HelloWorld::add ...

随机推荐

  1. [Golang学习笔记] 06 程序实体3 类型断言和类型转换

    类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...

  2. (数据科学学习手札53)Python中tqdm模块的用法

    一.简介 tqdm是Python中专门用于进度条美化的模块,通过在非while的循环体内嵌入tqdm,可以得到一个能更好展现程序运行过程的提示进度条,本文就将针对tqdm的基本用法进行介绍. 二.基本 ...

  3. 20155218 《Java程序设计》实验二(Java面向对象程序设计)实验报告

    20155218 <Java程序设计>实验二(Java面向对象程序设计)实验报告 一.实验内容及步骤 (一)单元测试 主要学习安装和使用junit来测试编写的程序,并学习以TDD(Test ...

  4. 20145207李祉昂《网络对抗技术》可选实验 shellcode注入与Return-to-libc攻击实验

    1.0 实践内容 Return-to-libc攻击是一种特殊的缓冲区溢出攻击,通常用于攻击有“栈不可执行”保护措施的目标系统.本实验中我们放弃了让漏洞程序执行堆栈中的shellcode,将用syste ...

  5. adb的配置

    http://jingyan.baidu.com/article/2fb0ba405e815f00f2ec5f9e.html 1. 用快捷键Ctrl + Alt + T 打开终端命令工具,电脑不要插入 ...

  6. day 3 模块

    1.系统自带模块  xxx.py 文件 就是模块 ### 模块存放位置 In [1]: import os In [2]: os.__file__ Out[2]: '/usr/lib/python3. ...

  7. PHP5.4 连接 SQL SERVER 2008

    PHP链接sqlserver需要先安装驱动,不是先把dll放到ext下面,一重启服务器就完事了. 本地环境: XAMPP 1.8.2 PHP 5.4.31 SQL SERVER 2008 R2 使用的 ...

  8. 利用Anaconda进行python爬虫环境的配置-安装scrapy

    1.下载Anaconda,下载地址:https://www.continuum.io/downloads 2.安装anaconda. 3.安装scrapy

  9. 【mysql优化】mysql count(*)、count(1)、count(主键字段)、count(非主键字段)哪个性能最佳

    测试结果为:count(*)和count(1)基本相等,count(非主键字段)最耗性能 -- 数据量 708254select count(*) from tmp_test1;-- avg 0.22 ...

  10. python-编程从入门到实践

    python-编程从入门到实践 1.python文件后缀名: .py 是Python的源码文件,由Python.exe解释. .pyc 是Python的编译文件.pyc 文件往往代替 py 文件发布: ...