2d场景中3d立体模型展开效果与更换每个面的贴图

版本:cocoscreator2.2.x

系统:windows

最近入职了一家 教育公司,改行去做课件了。。。。

经过入职前几周的煎熬,最近算是轻松了好多,有时间来写写分享

课件内容 为了能使 小朋友更好的认识立体图形,往往会在开发过程中加入3D效果,使课程内容更容易让小朋友理解​。比如一些立体图形的 展开效果,和让小朋友 用不同的刷子 在立体图形每个面上涂色 改变面的颜色的一些互动。

这次分享一下 cocoscreator2d场景中 展开立体图形的效果和​更换立体图形每个面的贴图​。

​罗嗦一下:

cocoscreator2d中的3d文档地址https://docs.cocos.com/creator/manual/zh/3d/

文档的内容不是很全面,​仔细研究还是可以的。另外 做出来效果是有锯齿的,很不美观,我用了抗锯齿,效果不错,项目里有单独的文件。

​展开效果思路如下:

在当前版本中cocoscreator好像是不支持 单独用一张纹理 渲染 立体图形mesh的某一个面,所以我才用了 "拼图"的方法来实现,即创建6个面(quad)然后根据需求 进行父子节点的拼接,设置合适的锚点,转换x,y,z角度,实现立体图形的展开效果​。

关键代码:

 /**滑动事件,改变立体图形展开形态 */
   private changeSlider(){
        //value 0代表闭合,1代表展开
        let value = this.mSlider.progress
        let angle  = 90 * ((100 - value*100) / 100);
        this.UpdateCube(angle);
    }
    private UpdateCube(angle:number){
        let faces =this.mCubeFaces;
        faces[0].eulerAngles = cc.v3(angle, 0, 0);
        faces[2].eulerAngles = cc.v3(-angle, 0, 0);
        faces[3].eulerAngles = cc.v3(0, -angle, 0);
        faces[4].eulerAngles =  cc.v3(0, -angle, 0);
        faces[5].eulerAngles =  cc.v3(0, angle, 0);
    }

效果图​:

每个面的纹理替换​思路:

在点击事件中,通过射线机制,过滤出自己想要的面的节点,然后通过获取的MeshRenderer 设置想要的贴图材质​。

关键代码如下

 private touchStart(event:cc.Event.EventTouch){
        if(this.mMaterials.length == 0 || this.mCubeFaces.length == 0) return 
        
        //获取所有射线相交的点
        let touchPos = event.getLocation();
        let ray = cc.Camera.main.getRay(touchPos)
        const resultarr = cc["geomUtils"].intersect.raycast(this.node,ray)
        /**过滤非需要的相交点 */
        for(let one of resultarr){
             if(one.node.name === "cube"){
                 let node = one.node;
                this._index ++
                if(this._index >= this.mMaterials.length){
                    this._index = 0;
                }
                this.updateFaceMaterial(node)
                break;
             }
        }
    }
    /**更新材质 */
    updateFaceMaterial(targetNode:cc.Node){
        targetNode.getComponent(cc.MeshRenderer).setMaterial(0,this.mMaterials[this._index])
    }​

效果图:

项目里的资源都是我的摄影作品

另外喜欢开快车的同学也可以咨询我 如何更安全的 开快车

关注我的公众号 亮亮同学TT 发送3d展开换图。获取完整源码及资源。

下期 写一下threejs版本的。​