如题,用的引擎集成的物理引擎,难道这问题还存在吗?速度快就穿透跑了。
有的时候,在一个时间步内可能会有大量的刚体同时运动。如果一个物理引擎没有处理好大幅度运动的问题,你就可能会看见一些物体错误地穿过了彼此。这种效果被称为隧道效应(tunneling)。(from 度娘)
高速物体的话 确实很容易穿透。
比如:高速的子弹射向墙壁 某一帧的时候子弹 在墙的左边。但是因为子弹的速度非常快,或者墙非常薄。导致下一帧的时候 子弹就出现在墙的右边了。而中间并没有和墙碰撞。
box2d 的话 可以通过 设置 物体的 bodyDef.isBullet = true 来防止 高速物体的穿透
chipmunk 的话 好像并不提供这个功能
cocos 默认的是 使用chipmunk的物理引擎,印象中(2.3左右的版本) cocos对chipmunk的集成 比较完善,用起来比较方便。
而并没有对 box2d进行更深入的集成。所以用起来的话。box2d需要学习更多的相关知识。
当然不知道现在的版本对box2d的集成到了什么程度。因为我们这边基本上用的是纯box2d的开发,并没有使用引擎封装的
不要自动同步,在update中手动设置同步
详细点呗,。
楼上都没说出解决方法。搂主我给你的建议就是没事看看test-cpp,里面有好多例子,其中就有解决穿透的问题。
源文件在\cocos2d-x-3.4\tests\cpp-tests\Classes\PhysicsTest里。
其中:
class PhysicsFixedUpdate : public PhysicsDemo
{
public:
CREATE_FUNC(PhysicsFixedUpdate);
void onEnter() override;
void updateStart(float delta);
void addBall();
virtual void update(float delta) override;
virtual std::string title() const override;
virtual std::string subtitle() const override;
};
再翻看到cpp里类的实现代码可以发现,修复这个穿透问题,官方使用的是禁用 自动模拟:_scene->getPhysicsWorld()->setAutoStep(false);
然后手动模拟: scheduleOnce(CC_SCHEDULE_SELECTOR(PhysicsFixedUpdate::updateStart), 2);
看示例源码吧,里面解释得很详细。
万分感谢,我就在看test,但是我在3.5的demo上怎么没找到box2d的例子?
3.x以上就已经把封装的 physics作为主体了,默认引擎是chimunk,不再理会box2d。。。坑爹。