6

これは私の現在の結果です:

不適切な collada モデルの解析

ご覧のとおり、モデルにはたくさんのギャップがあります。私の推測では、これが発生する理由は、各プレーンの頂点数を決定することになっている要素に<vcount>データを含める必要があるためです(?)。<polylist>WebGL は 3 辺のポリゴンしか描画できないため、これは機能しないようです。これまでの私の仮定が正しければ、すべての四角形をそれぞれ 2 つの三角形にスライスする必要があります。

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);です。

この問題に関する解決策やアドバイスをいただければ幸いです。


更新:このパーサーをもう一度いじってみたところ、上記の解析関数 (モデルが正しくエクスポートされていても) では法線が正しく表示されないことに気付きました。頂点が一意の位置ごとではなく面ごとに定義されるように、データを変更する必要があります。

4

1 に答える 1

0

潜在的な解決策を見つけました。decimateモデルをブレンダーにエクスポートする前に、修飾子を追加する必要があります。をチェックtriangulateして設定しratioます0.9900(左矢印をワンクリック)。

編集:実際にはtriangulate修飾子があるので、代わりにこれを使用してください。

したがって、最終的に、たとえば球メッシュは次のようになります。

ここに画像の説明を入力

于 2013-02-15T08:26:19.230 に答える