我创建了3个物体,一个是地形、一个是球体、一个是飞机,用的都是官方的素材,代码也是仿照官方的写的。
弄好之后运行,发现一个奇怪的现象,球体可以与地形和飞机碰撞,飞机与地形不会发生碰撞,请问这是什么回事?飞机能与球体发生碰撞,为什么不能与地形碰撞?
我打开debugDraw,的确能看到所有物体的线段。
代码如下,可能会有点长,我做了注释,因为是今天才开始研究3D的,所以注释很多都不太清楚,或者有错。
//四种地形纹理
Terrain::DetailMap r("dirt.jpg");
Terrain::DetailMap g("Grass2.jpg");
Terrain::DetailMap b("road.jpg");
Terrain::DetailMap a("GreenSkin.jpg");
//地形数据
Terrain::TerrainData data("heightmap129.jpg", "alphamap.png",
r, g, b, a,
Size(32, 32),
20,//高低差,数值越大,地形越陡
1.0f);//地形缩放倍数
//创建地形,第二个参数如果是INCREASE_LOWER,表示地形边缘无厚度可以减少绘制的顶点数。如果是SKIRT,地形边缘会有一定厚度
auto terrain = Terrain::create(data, Terrain::CrackFixedType::SKIRT);
//设置地形的最大纹理数,即前面设置的纹理,不能比纹理数还多
terrain->setMaxDetailMapAmount(4);
//设置相机掩码
terrain->setCameraMask((unsigned short)CameraFlag::USER1);
//debug用的设置,只能看到地形的地形线,看不见渲染的纹理
terrain->setDrawWire(false);
//设置地形边缘厚度比例?改了似乎没用
terrain->setSkirtHeightRatio(3);
terrain->setLODDistance(64, 128, 192);
Physics3DRigidBodyDes rbDes;
rbDes.mass = 0.0f;
std::vector heidata = terrain->getHeightData();
auto size = terrain->getTerrainSize();
//创建高地形状
rbDes.shape = Physics3DShape::createHeightfield(
size.width, size.height, //高地的大小,这两个值随意改的话可能会导致碰撞区域不正确
&heidata, //高度数据数组的指针
1, //缩放比例?改了似乎没用
terrain->getMinHeight(), terrain->getMaxHeight(), //高地最低高度,高地最高高度。这2个值随意改的话可能会导致碰撞区域不正确
true,
false, //是否反转
true);
//创建刚体
auto rigidBody = Physics3DRigidBody::create(&rbDes);
auto component = Physics3DComponent::create(rigidBody);
terrain->addComponent(component);
this->addChild(terrain);
//创建球体
{
//设置质量
rbDes.mass = 1.0f;
//创建球形刚体
rbDes.shape = Physics3DShape::createSphere(1);
auto sprite = PhysicsSprite3D::create("sphere.c3b", &rbDes);
sprite->setTexture("plane.png");
sprite->setCameraMask((unsigned short)CameraFlag::USER1);
sprite->setPosition3D(Vec3(3, 10, 0));
sprite->setScale(0.1);
this->addChild(sprite);
//设置精灵同步到物理刚体,如果不同步,会导致精灵与刚体分离
sprite->syncNodeToPhysics();
//同步标志?
sprite->setSyncFlag(Physics3DComponent::PhysicsSyncFlag::PHYSICS_TO_NODE);
}
//创建飞机
{
//获取顶点信息
std::vector trianglesList = Bundle3D::getTrianglesList("boss.c3b");
//设置质量,此时质量一定要为0,因为createMesh时,如果质量不为0会报错
rbDes.mass = 0;
//创建形状,第一个参数是顶点数组指针,第二个参数是三角形个数?如果个数不是顶点总数/3,会使得刚体debugdraw为黄色,并且不会模拟运动,原因不明
rbDes.shape = Physics3DShape::createMesh(&trianglesList, (int)trianglesList.size()/3);
rigidBody = Physics3DRigidBody::create(&rbDes);
component = Physics3DComponent::create(rigidBody);
component->setSyncFlag(Physics3DComponent::PhysicsSyncFlag::PHYSICS_TO_NODE);
//创建完后可以设置质量和惯性?
rigidBody->setMassProps(1, Vec3(0, 0, 0));
Sprite3D* sprite3d = Sprite3D::create("boss.c3b");
sprite3d->setRotation3D(Vec3(-90.0f, 0.0f, 0.0f));
sprite3d->setPosition3D(Vec3(0.0f, 30, 0));
sprite3d->addComponent(component);
//syncNodeToPhysics一定要等Sprite3D执行addComponent后设置
component->syncNodeToPhysics();
sprite3d->setCameraMask((unsigned short)CameraFlag::USER1);
this->addChild(sprite3d);
}
```
帮忙顶一下 为什么感觉cocos2d 越来越少人了