29#include "3d/CCTerrain.h"
30#include "3d/CCBundle3D.h"
31#include "physics3d/CCPhysics3D.h"
32#include "extensions/Particle3D/PU/CCPUParticleSystem3D.h"
43#define START_POS_X -0.5
44#define START_POS_Y -2.5
45#define START_POS_Z -0.5
53Physics3DTests::Physics3DTests()
55#if CC_USE_3D_PHYSICS == 0
67#if CC_USE_3D_PHYSICS == 0
70 TTFConfig ttfConfig(
"fonts/arial.ttf", 16);
71 auto label = Label::createWithTTF(ttfConfig,
"Should define CC_USE_3D_PHYSICS\n to run this test case");
73 auto size = Director::getInstance()->getWinSize();
74 label->setPosition(Vec2(size.width / 2, size.height / 2));
81std::string Physics3DTestDemo::title()
const
83 return "Physics3D Test";
86std::string Physics3DTestDemo::subtitle()
const
91bool Physics3DTestDemo::init()
93 if (!TestCase::init())
return false;
95 if (initWithPhysics())
97 getPhysics3DWorld()->setDebugDrawEnable(
false);
100 Size size = Director::getInstance()->getWinSize();
101 _camera = Camera::createPerspective(30.0f, size.width / size.height, 1.0f, 1000.0f);
102 _camera->setPosition3D(Vec3(0.0f, 50.0f, 100.0f));
103 _camera->lookAt(Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 1.0f, 0.0f));
104 _camera->setCameraFlag(CameraFlag::USER1);
105 this->addChild(_camera);
107 auto listener = EventListenerTouchAllAtOnce::create();
108 listener->onTouchesBegan = CC_CALLBACK_2(Physics3DTestDemo::onTouchesBegan,
this);
109 listener->onTouchesMoved = CC_CALLBACK_2(Physics3DTestDemo::onTouchesMoved,
this);
110 listener->onTouchesEnded = CC_CALLBACK_2(Physics3DTestDemo::onTouchesEnded,
this);
111 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,
this);
113 TTFConfig ttfConfig(
"fonts/arial.ttf", 10);
114 auto label = Label::createWithTTF(ttfConfig,
"DebugDraw OFF");
115 auto menuItem = MenuItemLabel::create(label, [=](Ref* ){
116 if (getPhysics3DWorld()->isDebugDrawEnabled()){
117 getPhysics3DWorld()->setDebugDrawEnable(
false);
118 label->setString(
"DebugDraw OFF");
120 getPhysics3DWorld()->setDebugDrawEnable(
true);
121 label->setString(
"DebugDraw ON");
125 auto menu = Menu::create(menuItem,
nullptr);
126 menu->setPosition(Vec2::ZERO);
127 menuItem->setAnchorPoint(Vec2::ANCHOR_TOP_LEFT);
129 this->addChild(menu);
138void Physics3DTestDemo::onTouchesBegan(
const std::vector<Touch*>& touches, cocos2d::Event *event)
140 _needShootBox =
true;
141 event->stopPropagation();
144void Physics3DTestDemo::onTouchesMoved(
const std::vector<Touch*>& touches, cocos2d::Event *event)
146 if (touches.size() && _camera)
148 auto touch = touches[0];
149 auto delta = touch->getDelta();
151 _angle -= CC_DEGREES_TO_RADIANS(delta.x);
152 _camera->setPosition3D(Vec3(100.0f * sinf(_angle), 50.0f, 100.0f * cosf(_angle)));
153 _camera->lookAt(Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 1.0f, 0.0f));
155 if (delta.lengthSquared() > 16)
157 _needShootBox =
false;
159 event->stopPropagation();
163void Physics3DTestDemo::onTouchesEnded(
const std::vector<Touch*>& touches, cocos2d::Event *event)
165 if (!_needShootBox)
return;
166 if (!touches.empty())
168 auto location = touches[0]->getLocationInView();
170 Vec3 nearP(location.x, location.y, -1.0f), farP(location.x, location.y, 1.0f);
171 nearP = _camera->unproject(nearP);
172 farP = _camera->unproject(farP);
173 Vec3 dir(farP - nearP);
174 shootBox(_camera->getPosition3D() + dir * 10.0f);
175 event->stopPropagation();
179Physics3DTestDemo::Physics3DTestDemo()
184void Physics3DTestDemo::update(
float )
189Physics3DTestDemo::~Physics3DTestDemo()
194void Physics3DTestDemo::shootBox(
const cocos2d::Vec3 &des )
196 Physics3DRigidBodyDes rbDes;
197 Vec3 linearVel = des - _camera->getPosition3D();
198 linearVel.normalize();
200 rbDes.originalTransform.translate(_camera->getPosition3D());
202 rbDes.shape = Physics3DShape::createBox(Vec3(0.5f, 0.5f, 0.5f));
203 auto sprite = PhysicsSprite3D::create(
"Sprite3DTest/box.c3t", &rbDes);
204 sprite->setTexture(
"Images/Icon.png");
206 auto rigidBody =
static_cast<Physics3DRigidBody*
>(sprite->getPhysicsObj());
207 rigidBody->setLinearFactor(Vec3::ONE);
208 rigidBody->setLinearVelocity(linearVel);
209 rigidBody->setAngularVelocity(Vec3::ZERO);
210 rigidBody->setCcdMotionThreshold(0.5f);
211 rigidBody->setCcdSweptSphereRadius(0.4f);
213 this->addChild(sprite);
214 sprite->setPosition3D(_camera->getPosition3D());
215 sprite->setScale(0.5f);
216 sprite->syncNodeToPhysics();
219 sprite->setSyncFlag(Physics3DComponent::PhysicsSyncFlag::PHYSICS_TO_NODE);
221 sprite->setCameraMask((
unsigned short)CameraFlag::USER1);
224std::string BasicPhysics3DDemo::subtitle()
const
226 return "Basic Physics3D";
229bool BasicPhysics3DDemo::init()
231 if (!Physics3DTestDemo::init())
235 Physics3DRigidBodyDes rbDes;
237 rbDes.shape = Physics3DShape::createBox(Vec3(60.0f, 1.0f, 60.0f));
239 auto floor = PhysicsSprite3D::create(
"Sprite3DTest/box.c3t", &rbDes);
240 floor->setTexture(
"Sprite3DTest/plane.png");
241 floor->setScaleX(60);
242 floor->setScaleZ(60);
243 this->addChild(floor);
244 floor->setCameraMask((
unsigned short)CameraFlag::USER1);
245 floor->syncNodeToPhysics();
247 floor->setSyncFlag(Physics3DComponent::PhysicsSyncFlag::NONE);
251 rbDes.shape = Physics3DShape::createBox(Vec3(0.8f, 0.8f, 0.8f));
262 float x = 1.0*i + start_x;
263 float y = 5.0+1.0*k + start_y;
264 float z = 1.0*j + start_z;
266 auto sprite = PhysicsSprite3D::create(
"Sprite3DTest/box.c3t", &rbDes);
267 sprite->setTexture(
"Images/CyanSquare.png");
268 sprite->setPosition3D(Vec3(x, y, z));
269 sprite->syncNodeToPhysics();
270 sprite->setSyncFlag(Physics3DComponent::PhysicsSyncFlag::PHYSICS_TO_NODE);
271 sprite->setCameraMask((
unsigned short)CameraFlag::USER1);
272 sprite->setScale(0.8f);
273 this->addChild(sprite);
283std::string Physics3DConstraintDemo::subtitle()
const
285 return "Physics3D Constraint";
288std::string Physics3DKinematicDemo::subtitle()
const
290 return "Physics3D Kinematic";
293bool Physics3DKinematicDemo::init()
295 if (!Physics3DTestDemo::init())
299 Physics3DRigidBodyDes rbDes;
301 rbDes.shape = Physics3DShape::createBox(Vec3(60.0f, 1.0f, 60.0f));
302 auto floor = PhysicsSprite3D::create(
"Sprite3DTest/box.c3t", &rbDes);
303 floor->setTexture(
"Sprite3DTest/plane.png");
304 floor->setScaleX(60);
305 floor->setScaleZ(60);
306 floor->setPosition3D(Vec3(0.f, -1.f, 0.f));
307 this->addChild(floor);
308 floor->setCameraMask((
unsigned short)CameraFlag::USER1);
309 floor->syncNodeToPhysics();
311 floor->setSyncFlag(Physics3DComponent::PhysicsSyncFlag::NONE);
314 for (
unsigned int i = 0; i < 3; ++i)
317 rbDes.shape = Physics3DShape::createBox(Vec3(2.0f, 2.0f, 2.0f));
319 auto sprite = PhysicsSprite3D::create(
"Sprite3DTest/box.c3t", &rbDes);
320 sprite->setTexture(
"Images/CyanSquare.png");
321 sprite->setCameraMask((
unsigned short)CameraFlag::USER1);
322 auto rigidBody =
static_cast<Physics3DRigidBody*
>(sprite->getPhysicsObj());
323 rigidBody->setKinematic(
true);
325 this->addChild(sprite);
327 sprite->setScale(2.0f);
328 sprite->setPosition3D(Vec3(-15.0f, 0.0f, 15.0f - 15.0f * i));
329 auto moveby = MoveBy::create(2.0f + i, Vec3(30.0f, 0.0f, 0.0f));
330 sprite->runAction(RepeatForever::create(Sequence::create(moveby, moveby->reverse(),
nullptr)));
337 rbDes.shape = Physics3DShape::createSphere(0.5f);
348 float x = 1.0*i + start_x;
349 float y = 5.0+1.0*k + start_y;
350 float z = 1.0*j + start_z;
351 rbDes.originalTransform.setIdentity();
352 rbDes.originalTransform.translate(x, y, z);
354 auto sprite = PhysicsSprite3D::create(
"Sprite3DTest/sphere.c3b", &rbDes);
355 sprite->setTexture(
"Sprite3DTest/plane.png");
356 sprite->setCameraMask((
unsigned short)CameraFlag::USER1);
357 sprite->setScale(1.0f / sprite->getContentSize().width);
358 this->addChild(sprite);
359 sprite->setPosition3D(Vec3(x, y, z));
360 sprite->syncNodeToPhysics();
362 sprite->setSyncFlag(Physics3DComponent::PhysicsSyncFlag::PHYSICS_TO_NODE);
374bool Physics3DConstraintDemo::init()
376 if (!Physics3DTestDemo::init())
380 Physics3DRigidBodyDes rbDes;
381 rbDes.disableSleep =
true;
383 auto sprite = Sprite3D::create(
"Sprite3DTest/orc.c3b");
385 rbDes.shape = Physics3DShape::createBox(Vec3(5.0f, 5.0f, 5.0f));
386 auto rigidBody = Physics3DRigidBody::create(&rbDes);
388 Quaternion::createFromAxisAngle(Vec3(0.f, 1.f, 0.f), CC_DEGREES_TO_RADIANS(180), &quat);
389 auto component = Physics3DComponent::create(rigidBody, Vec3(0.f, -3.f, 0.f), quat);
391 sprite->addComponent(component);
393 sprite->setCameraMask((
unsigned short)CameraFlag::USER1);
394 sprite->setScale(0.4f);
395 sprite->setPosition3D(Vec3(-20.f, 5.f, 0.f));
397 component->syncNodeToPhysics();
399 component->setSyncFlag(Physics3DComponent::PhysicsSyncFlag::PHYSICS_TO_NODE);
404 Physics3DConstraint* constraint = Physics3DPointToPointConstraint::create(rigidBody, Vec3(2.5f, 2.5f, 2.5f));
405 physicsScene->getPhysics3DWorld()->addPhysics3DConstraint(constraint);
409 rbDes.shape = Physics3DShape::createBox(Vec3(8.0f, 8.0f, 1.f));
410 rigidBody = Physics3DRigidBody::create(&rbDes);
411 component = Physics3DComponent::create(rigidBody);
412 sprite = Sprite3D::create(
"Sprite3DTest/box.c3t");
413 sprite->setTexture(
"Sprite3DTest/plane.png");
414 sprite->setScaleX(8.f);
415 sprite->setScaleY(8.f);
416 sprite->setPosition3D(Vec3(5.f, 0.f, 0.f));
417 sprite->addComponent(component);
418 sprite->setCameraMask((
unsigned short)CameraFlag::USER1);
419 this->addChild(sprite);
420 component->syncNodeToPhysics();
421 rigidBody->setAngularVelocity(Vec3(0,3,0));
422 constraint = Physics3DHingeConstraint::create(rigidBody, Vec3(4.f, 4.f, 0.5f), Vec3(0.f, 1.f, 0.f));
423 physicsScene->getPhysics3DWorld()->addPhysics3DConstraint(constraint);
428 rbDes.shape = Physics3DShape::createBox(Vec3(3.0f, 2.0f, 3.f));
429 rigidBody = Physics3DRigidBody::create(&rbDes);
430 component = Physics3DComponent::create(rigidBody);
431 sprite = Sprite3D::create(
"Sprite3DTest/box.c3t");
432 sprite->setTexture(
"Sprite3DTest/plane.png");
433 sprite->setScaleX(3.f);
434 sprite->setScaleZ(3.f);
435 sprite->setPosition3D(Vec3(30.f, 15.f, 0.f));
436 sprite->addComponent(component);
437 sprite->setCameraMask((
unsigned short)CameraFlag::USER1);
438 this->addChild(sprite);
439 component->syncNodeToPhysics();
440 rigidBody->setLinearVelocity(Vec3(0,3,0));
443 rbDes.shape = Physics3DShape::createBox(Vec3(3.0f, 3.0f, 3.f));
444 auto rigidBodyB = Physics3DRigidBody::create(&rbDes);
445 component = Physics3DComponent::create(rigidBodyB);
446 sprite = Sprite3D::create(
"Sprite3DTest/box.c3t");
447 sprite->setTexture(
"Sprite3DTest/plane.png");
448 sprite->setScale(3.f);
449 sprite->setPosition3D(Vec3(30.f, 5.f, 0.f));
450 sprite->addComponent(component);
451 sprite->setCameraMask((
unsigned short)CameraFlag::USER1);
452 this->addChild(sprite);
453 component->syncNodeToPhysics();
455 Mat4 frameInA, frameInB;
456 Mat4::createRotationZ(CC_DEGREES_TO_RADIANS(90), &frameInA);
458 frameInA.m[13] = -5.f;
459 frameInB.m[13] = 5.f;
460 constraint = Physics3DSliderConstraint::create(rigidBody, rigidBodyB, frameInA, frameInB,
false);
461 physicsScene->getPhysics3DWorld()->addPhysics3DConstraint(constraint);
462 ((Physics3DSliderConstraint*)constraint)->setLowerLinLimit(-5.f);
463 ((Physics3DSliderConstraint*)constraint)->setUpperLinLimit(5.f);
467 rbDes.shape = Physics3DShape::createBox(Vec3(3.f, 3.f, 3.f));
468 rigidBody = Physics3DRigidBody::create(&rbDes);
469 component = Physics3DComponent::create(rigidBody);
470 sprite = Sprite3D::create(
"Sprite3DTest/box.c3t");
471 sprite->setTexture(
"Sprite3DTest/plane.png");
472 sprite->setScale(3.f);
473 sprite->setPosition3D(Vec3(-10.f, 5.f, 0.f));
474 sprite->addComponent(component);
475 sprite->setCameraMask((
unsigned short)CameraFlag::USER1);
476 this->addChild(sprite);
477 component->syncNodeToPhysics();
479 Mat4::createRotationZ(CC_DEGREES_TO_RADIANS(90), &frameInA);
480 frameInA.m[12] = 0.f;
481 frameInA.m[13] = -10.f;
482 frameInA.m[14] = 0.f;
483 constraint = Physics3DConeTwistConstraint::create(rigidBody, frameInA);
484 physicsScene->getPhysics3DWorld()->addPhysics3DConstraint(constraint,
true);
485 ((Physics3DConeTwistConstraint*)constraint)->setLimit(CC_DEGREES_TO_RADIANS(10), CC_DEGREES_TO_RADIANS(10), CC_DEGREES_TO_RADIANS(40));
489 rbDes.shape = Physics3DShape::createBox(Vec3(3.0f, 3.0f, 3.f));
490 rigidBody = Physics3DRigidBody::create(&rbDes);
491 component = Physics3DComponent::create(rigidBody);
492 sprite = Sprite3D::create(
"Sprite3DTest/box.c3t");
493 sprite->setTexture(
"Sprite3DTest/plane.png");
494 sprite->setScale(3.f);
495 sprite->setPosition3D(Vec3(30.f, -5.f, 0.f));
496 sprite->addComponent(component);
497 sprite->setCameraMask((
unsigned short)CameraFlag::USER1);
498 this->addChild(sprite);
499 component->syncNodeToPhysics();
500 frameInA.setIdentity();
501 constraint = Physics3D6DofConstraint::create(rigidBody, frameInA,
false);
502 physicsScene->getPhysics3DWorld()->addPhysics3DConstraint(constraint);
503 ((Physics3D6DofConstraint*)constraint)->setAngularLowerLimit(Vec3(0,0,0));
504 ((Physics3D6DofConstraint*)constraint)->setAngularUpperLimit(Vec3(0,0,0));
505 ((Physics3D6DofConstraint*)constraint)->setLinearLowerLimit(Vec3(-10,0,0));
506 ((Physics3D6DofConstraint*)constraint)->setLinearUpperLimit(Vec3(10,0,0));
511void Physics3DConstraintDemo::onTouchesBegan(
const std::vector<cocos2d::Touch*>& touches, cocos2d::Event *event)
516 auto touch = touches[0];
517 auto location = touch->getLocationInView();
518 Vec3 nearP(location.x, location.y, 0.0f), farP(location.x, location.y, 1.0f);
520 auto size = Director::getInstance()->getWinSize();
521 _camera->unproject(size, &nearP, &nearP);
522 _camera->unproject(size, &farP, &farP);
524 Physics3DWorld::HitResult result;
525 bool ret =
physicsScene->getPhysics3DWorld()->rayCast(nearP, farP, &result);
526 if (ret && result.hitObj->getObjType() == Physics3DObject::PhysicsObjType::RIGID_BODY)
528 auto mat = result.hitObj->getWorldTransform().getInversed();
530 mat.transformPoint(result.hitPosition, &position);
532 _constraint = Physics3DPointToPointConstraint::create(
static_cast<Physics3DRigidBody*
>(result.hitObj), position);
533 physicsScene->getPhysics3DWorld()->addPhysics3DConstraint(_constraint,
true);
534 _pickingDistance = (result.hitPosition - nearP).length();
535 event->stopPropagation();
539 Physics3DTestDemo::onTouchesBegan(touches, event);
540 _needShootBox =
false;
542void Physics3DConstraintDemo::onTouchesMoved(
const std::vector<cocos2d::Touch*>& touches, cocos2d::Event *event)
546 auto p2pConstraint = ((Physics3DPointToPointConstraint*)_constraint);
548 auto touch = touches[0];
549 auto location = touch->getLocationInView();
550 Vec3 nearP(location.x, location.y, 0.0f), farP(location.x, location.y, 1.0f);
552 auto size = Director::getInstance()->getWinSize();
553 _camera->unproject(size, &nearP, &nearP);
554 _camera->unproject(size, &farP, &farP);
555 auto dir = (farP - nearP).getNormalized();
556 p2pConstraint->setPivotPointInB(nearP + dir * _pickingDistance);
557 event->stopPropagation();
560 Physics3DTestDemo::onTouchesMoved(touches, event);
562void Physics3DConstraintDemo::onTouchesEnded(
const std::vector<cocos2d::Touch*>& touches, cocos2d::Event *event)
566 physicsScene->getPhysics3DWorld()->removePhysics3DConstraint(_constraint);
567 _constraint =
nullptr;
568 event->stopPropagation();
571 Physics3DTestDemo::onTouchesEnded(touches, event);
574bool Physics3DTerrainDemo::init()
576 if (!Physics3DTestDemo::init())
579 Terrain::DetailMap r(
"TerrainTest/dirt.jpg"),g(
"TerrainTest/Grass2.jpg",10),b(
"TerrainTest/road.jpg"),a(
"TerrainTest/GreenSkin.jpg",20);
581 Terrain::TerrainData data(
"TerrainTest/heightmap129.jpg",
"TerrainTest/alphamap.png",r,g,b,a,Size(32,32), 20.0f, 1.0f);
582 auto terrain = Terrain::create(data,Terrain::CrackFixedType::SKIRT);
583 terrain->setMaxDetailMapAmount(4);
584 terrain->setCameraMask(2);
585 terrain->setDrawWire(
false);
587 terrain->setSkirtHeightRatio(3);
588 terrain->setLODDistance(64,128,192);
589 terrain->setCameraMask((
unsigned short)CameraFlag::USER1);
592 std::vector<float> heidata = terrain->getHeightData();
593 auto size = terrain->getTerrainSize();
594 Physics3DColliderDes colliderDes;
595 colliderDes.shape = Physics3DShape::createHeightfield(size.width, size.height, &heidata[0], 1.0f, terrain->getMinHeight(), terrain->getMaxHeight(),
true,
false,
true);
596 auto collider = Physics3DCollider::create(&colliderDes);
597 auto component = Physics3DComponent::create(collider);
598 terrain->addComponent(component);
599 this->addChild(terrain);
600 component->syncNodeToPhysics();
601 component->setSyncFlag(Physics3DComponent::PhysicsSyncFlag::NONE);
605 Physics3DRigidBodyDes rbDes;
607 rbDes.shape = Physics3DShape::createSphere(0.5f);
618 float x = 1.0*i + start_x;
619 float y = 5.0+1.0*k + start_y;
620 float z = 1.0*j + start_z;
622 auto sprite = PhysicsSprite3D::create(
"Sprite3DTest/sphere.c3b", &rbDes);
623 sprite->setTexture(
"Sprite3DTest/plane.png");
624 sprite->setCameraMask((
unsigned short)CameraFlag::USER1);
625 sprite->setScale(1.0f / sprite->getContentSize().width);
626 sprite->setPosition3D(Vec3(x, y, z));
627 this->addChild(sprite);
628 sprite->syncNodeToPhysics();
629 sprite->setSyncFlag(Physics3DComponent::PhysicsSyncFlag::PHYSICS_TO_NODE);
635 std::vector<Vec3> trianglesList = Bundle3D::getTrianglesList(
"Sprite3DTest/boss.c3b");
637 colliderDes.shape = Physics3DShape::createMesh(&trianglesList[0], (
int)trianglesList.size() / 3);
639 auto sprite = PhysicsSprite3D::createWithCollider(
"Sprite3DTest/boss.c3b", &colliderDes);
640 sprite->setRotation3D(Vec3(-90.0f, 0.0f, 0.0f));
641 sprite->setPosition3D(Vec3(0.0f, 15.0f, 0.0f));
642 sprite->setCameraMask(2);
643 this->addChild(sprite);
644 sprite->syncNodeToPhysics();
645 sprite->setSyncFlag(Physics3DComponent::PhysicsSyncFlag::NONE);
647 std::vector<std::pair<Physics3DShape*, Mat4> > shapeList;
650 auto bodyshape = Physics3DShape::createBox(Vec3(2.0f, 4.0f, 2.0f));
651 Mat4::createTranslation(0.0f, 2.0f, 0.0f, &localTrans);
652 shapeList.push_back(std::make_pair(bodyshape, localTrans));
653 auto headshape = Physics3DShape::createSphere(1.5f);
654 Mat4::createTranslation(0.6f, 5.0f, -1.5f, &localTrans);
655 shapeList.push_back(std::make_pair(headshape, localTrans));
656 auto lhandshape = Physics3DShape::createBox(Vec3(1.0f, 3.0f, 1.0f));
657 Mat4::createRotation(Vec3(1.0f, 0.0f, 0.0f), CC_DEGREES_TO_RADIANS(15.0f), &localTrans);
658 localTrans.m[12] = -1.5f; localTrans.m[13] = 2.5f; localTrans.m[14] = -2.5f;
659 shapeList.push_back(std::make_pair(lhandshape, localTrans));
660 auto rhandshape = Physics3DShape::createBox(Vec3(1.0f, 3.0f, 1.0f));
661 Mat4::createRotation(Vec3(1.0f, 0.0f, 0.0f), CC_DEGREES_TO_RADIANS(-15.0f), &localTrans);
662 localTrans.m[12] = 2.0f; localTrans.m[13] = 2.5f; localTrans.m[14] = 1.f;
663 shapeList.push_back(std::make_pair(rhandshape, localTrans));
666 rbDes.shape = Physics3DShape::createCompoundShape(shapeList);
667 auto rigidBody = Physics3DRigidBody::create(&rbDes);
668 component = Physics3DComponent::create(rigidBody);
669 auto sprite = Sprite3D::create(
"Sprite3DTest/orc.c3b");
670 sprite->addComponent(component);
671 sprite->setRotation3D(Vec3(0.0f, 180.0f, 0.0f));
672 sprite->setPosition3D(Vec3(-5.0f, 20.0f, 0.0f));
673 sprite->setScale(0.4f);
674 sprite->setCameraMask(2);
675 this->addChild(sprite);
683std::string Physics3DTerrainDemo::subtitle()
const
685 return "Physics3D Terrain";
688std::string Physics3DCollisionCallbackDemo::subtitle()
const
690 return "Physics3D CollisionCallback";
693bool Physics3DCollisionCallbackDemo::init()
695 if (!Physics3DTestDemo::init())
699 Physics3DRigidBodyDes rbDes;
702 std::vector<Vec3> trianglesList = Bundle3D::getTrianglesList(
"Sprite3DTest/boss.c3b");
703 for (
auto& it : trianglesList) {
708 rbDes.shape = Physics3DShape::createMesh(&trianglesList[0], (
int)trianglesList.size() / 3);
709 auto rigidBody = Physics3DRigidBody::create(&rbDes);
710 auto component = Physics3DComponent::create(rigidBody);
711 auto sprite = Sprite3D::create(
"Sprite3DTest/boss.c3b");
712 sprite->addComponent(component);
713 sprite->setRotation3D(Vec3(-90.0f, 0.0f, 0.0f));
714 sprite->setScale(scale);
715 sprite->setCameraMask((
unsigned short)CameraFlag::USER1);
716 this->addChild(sprite);
719 rigidBody->setCollisionCallback([=](
const Physics3DCollisionInfo &ci){
720 if (!ci.collisionPointList.empty()){
721 if (ci.objA->getMask() != 0){
722 auto ps = PUParticleSystem3D::create(
"Particle3D/scripts/mp_hit_04.pu");
723 ps->setPosition3D(ci.collisionPointList[0].worldPositionOnB);
725 ps->startParticleSystem();
726 ps->setCameraMask(2);
728 ps->runAction(Sequence::create(DelayTime::create(1.0f), CallFunc::create([=](){
729 ps->removeFromParent();
749std::string Physics3DColliderDemo::subtitle()
const
751 return "Physics3D Trigger";
754bool Physics3DColliderDemo::init()
756 if (!Physics3DTestDemo::init())
759 Physics3DRigidBodyDes rbDes;
761 rbDes.shape = Physics3DShape::createBox(Vec3(3.0f, 3.0f, 3.f));
762 auto playerBody = Physics3DRigidBody::create(&rbDes);
763 auto component = Physics3DComponent::create(playerBody);
764 playerBody->setKinematic(
true);
765 auto sprite = Sprite3D::create(
"Sprite3DTest/box.c3t");
766 sprite->setTexture(
"Sprite3DTest/plane.png");
767 sprite->setScale(3.f);
768 sprite->setPosition3D(Vec3(0.0f, 0.f, 30.f));
769 sprite->addComponent(component);
770 sprite->setCameraMask((
unsigned short)CameraFlag::USER1);
771 auto moveby = MoveBy::create(5.0f, Vec3(0.0f, 0.0f, -60.0f));
772 sprite->runAction(RepeatForever::create(Sequence::create(moveby, moveby->reverse(),
nullptr)));
773 this->addChild(sprite);
776 Physics3DColliderDes colliderDes;
777 colliderDes.shape = Physics3DShape::createSphere(10.0f);
778 colliderDes.isTrigger =
true;
779 auto collider = Physics3DCollider::create(&colliderDes);
780 auto component = Physics3DComponent::create(collider);
781 auto node = Node::create();
782 node->addComponent(component);
783 node->setCameraMask((
unsigned short)CameraFlag::USER1);
784 this->addChild(node);
786 Physics3DRigidBodyDes rbDes;
788 rbDes.shape = Physics3DShape::createBox(Vec3(10.0f, 10.0f, 1.f));
789 auto rigidBody = Physics3DRigidBody::create(&rbDes);
790 component = Physics3DComponent::create(rigidBody);
791 rigidBody->setKinematic(
true);
792 auto doorLeft = Sprite3D::create(
"Sprite3DTest/box.c3t");
793 doorLeft->setTexture(
"Sprite3DTest/plane.png");
794 doorLeft->setScaleX(10.0f);
795 doorLeft->setScaleY(10.0f);
796 doorLeft->setScaleZ(1.0f);
797 doorLeft->setPosition3D(Vec3(-5.0f, 0.0f, 0.0f));
798 doorLeft->addComponent(component);
799 doorLeft->setCameraMask((
unsigned short)CameraFlag::USER1);
800 node->addChild(doorLeft);
803 rbDes.shape = Physics3DShape::createBox(Vec3(10.0f, 10.0f, 1.f));
804 rigidBody = Physics3DRigidBody::create(&rbDes);
805 component = Physics3DComponent::create(rigidBody);
806 rigidBody->setKinematic(
true);
807 auto doorRight = Sprite3D::create(
"Sprite3DTest/box.c3t");
808 doorRight->setTexture(
"Sprite3DTest/plane.png");
809 doorRight->setScaleX(10.0f);
810 doorRight->setScaleY(10.0f);
811 doorRight->setScaleZ(1.0f);
812 doorRight->setPosition3D(Vec3(5.0f, 0.0f, 0.0f));
813 doorRight->addComponent(component);
814 doorRight->setCameraMask((
unsigned short)CameraFlag::USER1);
815 node->addChild(doorRight);
818 collider->onTriggerEnter = [=](Physics3DObject *otherObject){
819 if (otherObject == playerBody){
820 auto moveby = MoveBy::create(1.0f, Vec3(-5.0f, 0.0f, 0.0f));
821 doorLeft->runAction(moveby);
822 doorRight->runAction(moveby->reverse());
826 collider->onTriggerExit = [=](Physics3DObject *otherObject){
827 if (otherObject == playerBody){
828 auto moveby = MoveBy::create(1.0f, Vec3(5.0f, 0.0f, 0.0f));
829 doorLeft->runAction(moveby);
830 doorRight->runAction(moveby->reverse());
#define ADD_TEST_CASE(__className__)
static cocos2d::Scene * physicsScene
virtual void onEnter() override
virtual void onEnter() override
static cocos2d::Vec2 top()
static cocos2d::Vec2 left()