これは私の現在の結果である(例が含まれています):WebGLのためのcolladaファイルを正しく解析するには?
あなたはモデルがそれらのギャップの束を持って見ることができるように。私の推測では、どうしてこのようなことが起きるのでしょうか?<polylist>
要素に<vcount>
のデータを含める必要があります。これは各平面(?)の頂点数を決定することになっています。 WebGLは3面のポリゴンしか描画できないので、これはうまくいかないようです。これまでの私の仮定が正しいならば、私はすべての四辺形をそれぞれ2つの三角形にスライスする必要があります。
私はすでにCollDAでWebGLを解析することについて多くの研究を行っていますが、ほとんどすべてのサイトが、このような機能が既に実装されているいくつかのWebGLライブラリにリダイレクトされています。私はいつも、内部的な仕組みをよりよく理解するために、すべてのコア機能を自分で作成することから始めます。
は、ここに私のparse関数である:法線がaswellインデックスを持っている理由私もかなりよく分からない
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
からのみ、各第2の値を追加することによって、それらを無視しています。
私の描画ルーチンは単純にgl.drawElements(gl.TRIANGLE_STRIP, program.models[i].ibo.count, gl.UNSIGNED_SHORT, 0);
です。
私はこの問題の解決方法やアドバイスを大いに喜んでいます。
更新:再びこのパーサで遊んでた後、私は(さえ正しくエクスポートモデルと)上記の解析機能が正しく法線を表示しませんではないだろうということ、気づきました。一意の位置ではなく、面ごとに頂点が定義されるようにデータを変更する必要があります。
でもあなたが使用していない場合は、たとえば、three.js、なぜちょうど彼らが何をしたか確認するために見ていませんか?それはすぐそこにあり、きちんと構造化されているので、読むのは簡単です。 COLLADA polysの理解に合っているかどうか確認してください。 – bjorke
あなたはイメージを*四角形ごとに2つの三角形を描いているように見えますが、ABCDを使って四角形を描画すると、ABCとCDCは描画されません。 – bjorke
@bjorkeこの4k行のスクリプトでは、 https://github.com/arcanis/issue.three.js.collada/blob/master/ColladaLoader.js 私は実際にはシーンやアニメーションを解析する必要はありませんが、メッシュを正しく解析する必要があります。 –