Cocos2d-X Physic 3D 教程-常见物理约束(2)

发表于2015-07-31
评论0 541浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏程序行业精英群

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

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

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


Physics3DRigidBodyDesrbDes;
rbDes.disableSleep= true;
//createbox
autosprite= Sprite3D::create("Sprite3DTest/orc.c3b");
rbDes.mass= 10.f;
rbDes.shape= Physics3DShape::createBox(Vec3(5.0f, 5.0f, 5.0f));
autorigidBody= Physics3DRigidBody::create(&rbDes);
Quaternionquat;
Quaternion::createFromAxisAngle(Vec3(0.f, 1.f, 0.f), CC_DEGREES_TO_RADIANS(180), &quat);
autocomponent= Physics3DComponent::create(rigidBody, Vec3(0.f, -3.f, 0.f), quat);
sprite->addComponent(component);
addChild(sprite);
sprite->setCameraMask((unsignedshort)CameraFlag::USER1);
sprite->setScale(0.4f);
sprite->setPosition3D(Vec3(-20.f, 5.f, 0.f));
//syncnode position to physics
component->syncToNode();
//physicscontrolled, we will not set position for it, so we can skip sync node positionto physics
component->setSyncFlag(Physics3DComponent::PhysicsSyncFlag::PHYSICS_TO_NODE);

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

铰链约束(hinge constraint
铰链约束可以用在情形下,对于一个刚体而言,只希望其绕着一个指定的轴进行旋转,比方说,一扇门,或者是车轮。
创建方式如下:
constraint= Physics3DHingeConstraint::create(rigidBody, Vec3(4.f, 4.f, 0.5f), Vec3(0.f,1.f, 0.f));
最后在将其加入到物理世界中:
physicsScene->getPhysics3DWorld()->addPhysics3DConstraint(constraint);

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


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

原文链接

著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

游戏学院公众号二维码
腾讯游戏学院
微信公众号

提供更专业的游戏知识学习平台