贴花效果

前言

最近看到一个贴花效果, 感觉不错, 所以想自己来亲自实现一次.

效果

Decal

思路

贴花的实现方式有很多, 我这里用了最常见, 也是适应性最好的一种方式.
基于点击位置, 作立方体裁剪, 然后裁剪下来的mesh作平面投影, 最后就得到了在二维平面的UV值.
最后用裁剪后的 mesh 生成新一个 meshrenderer , 再加上得到的 UV 值, 就可以把贴花贴到对应的模型上了.

关键实现步骤

找到模型上的触摸的位置

找模型的上触摸点, 最主要以下这两步, 找到从屏幕发射出去的射线, 取射线与模型的交点.

this.mainCamera?.screenPointToRay(point.x, point.y, this._ray);
const intersectCount = geometry.intersect.rayModel(this._ray, mo, this.modOpt);

以触摸点为中心裁剪mesh

以触摸点为中心立方体的六个面来裁剪当前的 mesh

// 其中一个面
this.decalVertexes = this.clipGeometrylByPlane(this.decalVertexes, new Vec3( 1, 0, 0 ), this.scale.x/2);

将mesh投影到平面上得到uv

然后以裁剪后的 mesh , 我们投影到面上, 再归一化, 就可以它投影后的值当 UV 用

decalVertex.uv = new Vec2(
        0.5 + ( decalVertex.viewPos.x / this.scale.x ),
        0.5 + ( decalVertex.viewPos.y / this.scale.y )
    );

用裁剪后的mesh和uv生成新的mesh

最后我们用了新的 mesh, 同时也有了对应的 UV , 那么再加上我们要贴花的纹理, 就齐活了.

WX: hugohuang1111

仓库

https://github.com/hugohuang1111/fxcase/tree/master/assets/caseDecals/method2

35赞

mark!!!牛蛙牛蛙

666,这也实现了

厉害了,必须收藏

:ox::frog::ox::frog::ox::frog:

:cow::beer::cow::beer::cow::beer:

厉害,厉害:+1:t2:~一直想做这个效果,真是可以实现各种可能~

大佬:ox::beer:,mark下

mark xd

针不戳针不戳~

简单升级到 3.5.1

https://gitee.com/yeshao2069/CocosCreatorDemos/tree/v3.5.x/demo/3d/Creator3.5.1_3D_Graffiti

1赞

牛蛙~666666

mark :smiley:

贴花效果 :grinning: :grinning: :grinning: :grinning: :grinning: :grinning: :grinning: :grinning:

:ox: :frog: :ox: :frog: :ox: :frog:

牛啊, 最近一直在找这个效果

收藏,这是2.X ?

官方升级到 3.5.1 了
3d 的

牛啊, 是不是 楼主也没办法找到 正确的 uv点, 所以是用了这样的一个处理
image

这个点击点识别精度太低了。 哪里不会点哪里还是哪里都不会

有2个BUG
1.第二次点击时候获得位置不正确
2.封闭模型会在正面和背面各贴一张
各位有办法解决,有偿。