cocos2d-x lua 3D模块学习(4)----常见物理约束

在物理引擎中,所谓的约束(constraint)是指一个让刚体失去一定的自由度的一个物理部件,通过它可以限制刚体的移动,旋转。

点对点约束(point to point constraint):

点对点的约束即限制了一个刚体局部坐标系下指定的任意一个点(也可以称为支点),在物理引擎计算时始终在世界坐标系下固定不变。也可以限制两个刚体,它们各指定一个局部坐标系中的一个支点,这两个点的位置的在世界坐标系下固定不变。可以认为此类约束是一枚“钉子”,将刚体钉在世界坐标系下某处。

创建约束:

与上一篇教程不同,在这里,我们不直接通过PhysicsSprite3D来直接创建可以显示的3D精灵,而是分别构造出精灵,以及一个Physics3DComponent,还有一个刚体,并将其互相关联:

Physics3DRigidBodyDesrbDes
rbDes.disableSleep= true
//createbox
autosprite= cc.Sprite3D:create("Sprite3DTest/orc.c3b")
rbDes.mass= 10.0
rbDes.shape= cc.Physics3DShape:createBox(cc.vec3(5.0, 5.0, 5.0))
autorigidBody= cc.Physics3DRigidBody:create(rbDes)
Quaternion:createFromAxisAngle(cc.vec3(0.0, 1.0, 0.0), CC_DEGREES_TO_RADIANS(180), quat)
autocomponent= cc.Physics3DComponent:create(rigidBody, cc.vec3(0.0, -3.0, 0.0), quat)
sprite:addComponent(component)
self:addChild(sprite)
sprite:setCameraMask(cc.CameraFlag.USER1)
sprite:setScale(0.4)
sprite:setPosition3D(cc.vec3(-20.0, 5.0, 0.0))
//syncnode position to physics
component:syncToNode()
//physicscontrolled, we will not set position for it, so we can skip sync node positionto physics
component:setSyncFlag(cc.Physics3DComponent:PhysicsSyncFlag:PHYSICS_TO_NODE)

Physics3DComponent用以将Node的数据和刚体的数据互相关联,同时可以指定其相对于其父节点的一些偏移设置,其设置的方法,在上一篇教程介绍PhysicsSprite3D也有提到过,在这里,只需要将其加入到Sprite3D下就可以了。

铰链约束(hinge constraint)

铰链约束可以用在情形下,对于一个刚体而言,只希望其绕着一个指定的轴进行旋转,比方说,一扇门,或者是车轮。
创建方式如下:
constraint= cc.Physics3DHingeConstraint:create(rigidBody, cc.vec3(4.0, 4.0, 0.5), cc.vec3(0.0,1.0, 0.0));

最后在将其加入到物理世界中:
physicsScene:getPhysics3DWorld():addPhysics3DConstraint(constraint);

滑块约束

滑块约束顾名思义,就是讲刚体的变换限制在一定的范围内,该范围通过定义两个参考帧(其实质是两个变换矩阵)来指定,创建方式如下:
constraint =Physics3DSliderConstraint::create(rigidBody, nil, frameA, frameB, false);
此种方式将刚体rigidBody的移动范围限制在参考帧frameA与frameB之间,通常来讲,frameA与FrameB只相差一个位移。

圆锥约束

圆锥约束是将刚体变换约束在一个圆锥体内,此种约束,需要确定一个参考帧,该参考帧代表的是圆锥顶点的位置以及约束圆锥张角的范围:
cc.mat4.createRotationZ(CC_DEGREES_TO_RADIANS(90),&frameInA)//张角范围
//指定位置
frameInA.m[12] = 0.0
frameInA.m[13] = -10.0
frameInA.m[14] =0.0
创建方式如下:
constraint= cc.Physics3DConeTwistConstraint:create(rigidBody, frameA)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值