这是我目前的结果:
如您所见,模型中有很多空白。我的猜测,为什么会发生这种情况,我需要<vcount>
在元素中包含数据<polylist>
,这应该确定每个平面的顶点数(?)。由于 WebGL 只能绘制 3 边多边形,这似乎行不通。如果到目前为止我的假设是正确的,我需要将所有四边形切成两个三角形。
我已经对使用 WebGL 进行 collada 解析进行了大量研究,但是几乎每个站点都将我重定向到几个已经实现了此类功能的 WebGL 库(所以请不要这样做)。我总是从自己编写所有核心功能开始,以更好地了解内部工作的方式。
这是我的解析函数:
function load_collada(gl, program, path) {
var request = new XMLHttpRequest(),
buffers = {
vbo: gl.createBuffer(),
nbo: gl.createBuffer(),
ibo: gl.createBuffer(),
aVertex: gl.getAttribLocation(program, "aVertex"),
aNormal: gl.getAttribLocation(program, "aNormal")
},
mesh,
vertices,
indicesList,
normals = [],
indices = [];
request.open("GET", path, false);
request.overrideMimeType("text/xml");
request.send();
mesh = request.responseXML.querySelector("mesh");
vertices = mesh.querySelectorAll("float_array")[0].textContent.split(" ");
normals = mesh.querySelectorAll("float_array")[1].textContent.split(" ");
indicesList = mesh.querySelectorAll("polylist p")[0].textContent.split(" ");
for (i=0 ; i < indicesList.length; i+=2) { indices.push(indicesList[i]); }
buffers.vbo.count = parseInt(mesh.querySelectorAll("float_array")[0].getAttribute("count"), 10);
buffers.nbo.count = normals.length;
buffers.ibo.count = indices.length;
gl.bindBuffer(gl.ARRAY_BUFFER, buffers.vbo);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
gl.vertexAttribPointer(buffers.aVertex, 3, gl.FLOAT, true, 0, 0);
gl.enableVertexAttribArray(buffers.aVertex);
gl.bindBuffer(gl.ARRAY_BUFFER, buffers.nbo);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(normals), gl.STATIC_DRAW);
gl.vertexAttribPointer(buffers.aNormal, 3, gl.FLOAT, true, 0, 0);
gl.enableVertexAttribArray(buffers.aNormal);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffers.ibo);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
return buffers;
}
我也不太清楚为什么法线也有索引,但我忽略了它们,只添加indicesList
.
我的抽奖程序很简单gl.drawElements(gl.TRIANGLE_STRIP, program.models[i].ibo.count, gl.UNSIGNED_SHORT, 0);
。
我会非常感谢有关此问题的任何解决方案或建议。
更新:再次使用此解析器后,我注意到上面的解析函数(即使使用正确导出的模型)也不会正确显示法线。您必须更改数据,以便每个面而不是每个唯一位置定义顶点。