p2 关节
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 关节的更多相关文章
- Egret中使用P2物理引擎
游戏中的对象按照物理规律移动,体现重力.引力.反作用力.加速度等物体特性,实现自由落体.摇摆运动.抛物线运动,以及物理碰撞现象的模拟.用于模拟物理碰撞.物理运动的引擎称为物理引擎. 来自瑞典斯德哥尔摩 ...
- p2 弹簧
P2中用来约束刚体运动的还有弹簧Spring. 弹簧除约束两个刚体之间的运动轨迹外,通过damping阻尼和stiffness刚度系数等属性,使得刚体在向目标移动时, 出现类似弹簧的简谐运动.Spri ...
- Nexus Repository Manager OSS 代理 p2 源
用maven管理构建Eclipse RCP项目时,可能会用到p2源: http://download.eclipse.org/releases/mars/ 内网用户肯定希望能通过nexus服务器代理, ...
- Equinox P2的学习
product.configuration 点击“Add按钮”并添加以下插件: org.eclipse.equinox.p2.ui org.eclipse.equinox.p2.ui.sdk org. ...
- Box2D淌坑日记: 关节(Joint)和旋转关节(b2RevoluteJoint)
关节在Box2D的对象组织结构中,与b2Body(刚体)并列.因此两种对象都是由b2World创建并直接管理. 然而Joint有依赖于b2Body的地方,就是它的销毁:当关节所涉及到的刚体被销毁,关节 ...
- RCP: P2 Update两个烦人bug和解决办法
问题 Eclipse新的P2 Update机制,使用起来很方便,如果使用P2 plugin自带的UI,开发者完全不用写任何代码 即可实现application的在线更新. 但是P2 Update至少有 ...
- Unity 物理引擎动力学关节
Unity物理引擎中的各个动力学关节 Hinge Joint (铰链关节) Fixed Joint (固定关节) Spring Joint (弹簧关节) Character Joint(角色关节) C ...
- box2dweb之关节joint(连接器)
1 概述 前篇基础文章看完后基本上就应该对box2dweb能上手了,下面来介绍一下box2dweb非常重要的一个概念,关节(joint)也有叫连接器的,总之是一个意思.下面是关节详细的类库说明: BO ...
- 实例介绍Cocos2d-x中Box2D物理引擎:使用关节
下面我们将使用Box2D物理引擎技术进行重构.使得关节能够掌握如何在Box2D使用关节约束.HelloWorldScene.cpp中与使用关节的相关代码如下: void HelloWorld::add ...
随机推荐
- 总结安装matlab踩到的坑
个人安装matlab3次,每次都遇到不同的安装问题,现在将遇到的问题总结下来,以供参考. 本次安装MATLAB的步骤参考的博文 https://blog.csdn.net/u012313335/art ...
- Matlab调用C语言函数
Matlab调用C语言函数 如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:double add(double x, double y) { return x + y ;}现在我想要在 ...
- 安装虚拟机与初触linux心得
安装虚拟机与初触linux心得 安装虚拟机 不知道是电脑问题还是软件问题,我安装虚拟机的过程异常坎坷,首先我在官网,360,太平洋等地方下载的virtualbox5.0以后的软件普遍有问题,问题是打不 ...
- 20155320 实验四 Android程序设计
20155320 实验四 Android程序设计 实验内容 (一)Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for ...
- 20155321 2016-2017-2 《Java程序设计》第九周学习总结
20155321 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC简介 厂商在实现JDBC驱动程序时,依方式可将驱动程序分为四种类型: JDBC-OD ...
- JS中的eval函数
最近开始慢慢学习前端的脚本了,上次碰到了一个问题,需要通过一个对象的属性名称来获得这个对象这个属性的值.如果在C#中,那么直接通过反射就可以了.而在js中,也有类似的函数,那就是eval ...
- C#--Switch Case语句的返回
C#中switch case语句的返回不只是用break关键字,break语句是用来阻止贯穿的最常见的方式.也可以用其他语句来替代它.如下面代码所示 static int Main(string[] ...
- zigbee路由(报文实例)
4855 广播 routeRequestId = 6, pathCost = 0 radius=1E 62BB 继续广播 routeRequestId = 6, pathCost = 1 radiu ...
- python爬取斗图网中的 “最新套图”和“最新表情”
1.分析斗图网 斗图网地址:http://www.doutula.com 网站的顶部有这两个部分: 先分析“最新套图” 发现地址栏变成了这个链接,我们在点击第二页 可见,每一页的地址栏只有后面的pag ...
- 自己做的一个固定大小对象内存池,效率大概为原始的new/delete的2倍
提升不高,不过好处是可以多次申请小对象,一次释放.(只适应于无动态申请资源的class) vs2012测试情况如下: // CHchFixLenMemPool.h #pragma once #ifnd ...