项目需求,自己根据手指拖动,绘制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赞
牛逼,大神!感谢哦!
