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

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

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

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

Physics3DRigidBodyDesrbDes;rbDes.disableSleep= true;//createboxautosprite= 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 physicscomponent->syncToNode();//physicscontrolled, we will not set position for it, so we can skip sync node positionto physicscomponent->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的移动范围限制在参考帧frameA与frameB之间,通常来讲,frameA与FrameB只相差一个位移。

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

额,牛主,我能问个2d引擎的问题么。。我有13个球在世界中。。但是碰撞的时候明显变得卡顿。。要怎么优化和解决的说!

nice man thank you very very nice

:2: :2: :14: :14: :14:

尝试下,看能不能,取消部分碰撞检测,或者降低检测频率试试

群:195391500