在物理引擎中,所谓的约束(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)