挖下的坑,刨出来的是金砖 !物理刚体挖洞新方案

专业挖坑,从未停止。与群内小伙伴讨论后,发现一些坑和可优化的点。。。文末附送项目工程!

回顾

前一篇物理刚体挖洞!另一种实现!的整体思路是,先用 Clipper 去计算多边形,接着用 poly2tri 将多边形分割成多个三角形,最后用多边形刚体填充。

这一篇准备介绍这个实现方式遇到的新坑,以及一些优化。

填充纹理

之前是使用 cc.graphic 作图的,可能有小伙伴需要填充更好看的纹理图片。

这时,可以巧用 cc.mask 中的 _graphic

可以清楚的看到, mask 的裁剪实质上是由一个 graphic 作图实现的。

所以我们上面的 graphic 组件可以替换成 mask 中的 _graphic。在该节点添加一个 cc.mask 组件即可。

在代码中获取一下这个 graphic,原来的逻辑不变。

this.graphics = this.node_dirty.getComponent(cc.Mask)['_graphics'];

准备一张 256x256 的图片(一定要是2的n次幂),设置为 repeat 模式。并将这个张图片放在 mask 节点下,铺满界面。

看看效果怎么样。

奇怪的 bug

有群友(感谢@两年)反馈,滑动时有概率出现刚体消失。

仔细琢磨后,发现是 poly2tri 这个库有些限制。用 clipper 计算的结果还要加一层处理。

先看第一个报错。

大概是说有自交的多边形。

我也没办法呀,这结果是 clipper 算出来的。

还好,在clipper 官方文档翻了一阵。找到一个可以用的。

https://sourceforge.net/p/jsclipper/wiki/documentation/

加一个参数,可以实现严格简单的多边形(但是效率更低)。

const cpr = new ClipperLib.Clipper(ClipperLib.Clipper.ioStrictlySimple);

再看另一种情况下的报错。

这个大概是说,出现了共线不支持。

经过我细心分析(日志大法),发现是 clipper 计算的结果中的 holesouter 之间有重复点的时候,就会产生错误。

可惜这次没在文档中找到相应的方法处理。

只好自己写一个方法,计算后再过滤一下这些重复的节点。

private _convertClipperPathToPoly2triPoint(poly: { X: number, Y: number }[], exclude: poly2tri.Point[] = []): poly2tri.Point[] {
    const newPos: poly2tri.Point[] = [];
    poly.forEach((p, i) => {
        const p_now = new poly2tri.Point(p.X, p.Y)
        const isIn = exclude.some((e_p) => {
            if (e_p.equals(p_now)) {
                return true;
            }
        })
        if (!isIn) {
            newPos.push(p_now);
            exclude.push(p_now);
        }
    })
    if (newPos.length > 2)
        return newPos;
    else
        return [];
}

最后,发给交流群(859642112)的小伙伴,测试后,暂时没出现这个问题了。

其他

加了这些优化,是否会增加了计算量?是否会产生新的卡顿?

每次绘制一个三角形,效率会不会更低?能否直接绘制多边形?减少绘制次数?

如果初始多边形比较大,是否可以分割成几个多边形,分区域划分计算?减少大量多边形计算。

是否可以把库拆解?只选取自己需要的部分?根据算法重新设计?这样就不需要转格式了。

....

这些问题,就交给大家去思考了吧!挖洞挖坑,填坑,就像不停歇的球一样,永不停歇。

物理挖洞系列

图文讲解

物理挖洞之多边形!
物理挖洞之链条!优化篇!
物理挖洞之链条!实现篇!

视频教学

物理挖洞!优化篇!
物理挖洞!实现篇!

讲一讲这个公众号吧!附原创精选整理!

shader 动画之 loading 特效!

物理流体的一种实现!

shader入门实战 +资料整理 !

JavaScript 中的三位一体

转载请保留文末二维码和完整代码获取方式!

完整项目(详细见 readme): 

https://github.com/baiyuwubing/cocos-creator-examples

点击“阅读原文”查看更多精选

“在看”是最大的鼓励▼

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity物理挖洞是指在Unity游戏引擎中,通过使用物理引擎来实现角色或物体在地面上挖洞的效果。 在Unity物理挖洞中,通常使用的是物理引擎组件,如Mesh Collider和Rigidbody。首先,我们需要给需要挖洞的地面添加Mesh Collider组件,这样地面就具备了物理碰撞功能。然后,给挖洞的工具(例如玩家手中的镐子)添加Rigidbody组件,以便让挖洞工具受到物理引擎的影响。 接下来,我们可以使用Raycast或者Collider.Raycast来检测挖洞的位置。当挖洞工具与地面发生碰撞时,我们可以通过修改地面的网格顶点来模拟挖洞的效果。具体地,我们可以根据挖洞工具的位置和半径,找到所有在工具半径内的顶点,并将它们的高度调整为地面下沉的深度值。 为了实现连续挖洞的效果,我们可以在每次挖洞前将的地面拷贝一份,并在的地面上进行挖洞操作。这样,我们就可以实现实时更地面和连续挖洞的效果。 需要注意的是,Unity物理挖洞需要合理设置物理材质、碰撞体积和刚体参数,以达到符合游戏设计的物理表现效果。此外,挖洞操作也可能会对游戏性能造成一定影响,因此在实现挖洞功能时需要进行适当的优化。 总的来说,Unity物理挖洞是利用物理引擎和碰撞检测技术实现的一种在游戏中让角色或物体能够实时挖掘地面的效果,通过调整地面网格顶点的位置来模拟挖洞的视觉效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值