在用3.7的3d物理精灵时遇到点问题

我创建了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);
    }



```

:2: 帮忙顶一下 为什么感觉cocos2d 越来越少人了

因为飞机和地形都是静态物体(mass=0),当然不会发生碰撞,如果要碰撞,把飞机的mass设为大于0的数,并且Physics3DShape不能使用mesh shape,因为它只能处理静态物体(效率问题),考虑使用多个convex shape来近似。

— Begin quote from ____

引用第2楼songchengjiang于2015-07-06 10:36发表的 :
因为飞机和地形都是静态物体(mass=0),当然不会发生碰撞,如果要碰撞,把飞机的mass设为大于0的数,并且Physics3DShape不能使用mesh shape,因为它只能处理静态物体(效率问题),考虑使用多个convex shape来近似。 http://www.cocoachina.com/bbs/job.php?action=topost&tid=309640&pid=1341599

— End quote

原来如此,非常感谢。