自己算出顶点位置,绘制一个3D的模型

项目需求,自己根据手指拖动,绘制3D的模型,请问用什么接口可以实现啊?Mesh.setVertices?请问有什么教学或者例子可以参考一下么?

1赞

mesh数据是在_vbs和_ibs,分别对应了顶点数据和顶点索引数据,都是Uint8Array类型,顶点数据是多种数据的集合,比如位置、UV、颜色等等,你可以看参考,官方没有给出获取数据接口,只有设置的接口,我写了一个你也可以参考

   /**
     * 获取网格所有顶点数据
     * @param mesh 
     */
    public static getVertexBuffers(mesh: cc.Mesh): Uint8Array {
        if ((mesh as any)._vbs[0]) {
            return (mesh as any)._vbs[0].data as Uint8Array;
        } else {
            return new Uint8Array();
        }
    }

    /**
     * 获取网格所有顶点索引数据
     * @param mesh
     */
    public static getIndexBuffers(mesh: cc.Mesh): Uint16Array {
        if ((mesh as any)._ibs[0]) {
            return (mesh as any)._ibs[0].data;
        } else {
            return new Uint16Array();
        }
    }

    /**
     * 获取当前网格顶点格式
     * @param mesh 
     */
    public static getVertexFormat(mesh: cc.Mesh): {
        [key: string]: {
            name: string
            offset: number
            stride: number
            stream: number
            type: number
            num: number
            normalize: boolean
            bytes: number
        }
    } {
        if (mesh.subMeshes.length > 0) {
            return mesh.subMeshes[0]._vertexBuffer._format._attr2el
        } else {
            return {}
        }
    }

    /**
     * 通过索引从所有顶点数据获取坐标数据
     */
    public static getVertex(name: string, mesh: cc.Mesh, index: number) {
        const vertexBuffers = MeshHelper.getVertexBuffers(mesh);
        let vertexFormat = MeshHelper.getVertexFormat(mesh)[name];
        if (vertexFormat) {
            if (MeshHelper.getVertexCount(name, mesh) >= index) {
                let start = vertexFormat.stride * index + vertexFormat.offset;
                let end = start + vertexFormat.bytes;
                // 默认float32
                let data = new Float32Array(vertexBuffers.slice(start, end).buffer)
                return data;
            } else {
                return null;
            }
        }
    }

   public static getVertexCount(name: string, mesh: cc.Mesh) {
        const vertexBuffers = MeshHelper.getVertexBuffers(mesh);
        let vertexFormat = MeshHelper.getVertexFormat(mesh)[name];
        if (vertexFormat) {
            return Math.floor(vertexBuffers.length / vertexFormat.stride);
        } else {
            return 0
        }
    }

2赞

牛逼,大神!感谢哦!

:clap: