2013-02-14 2 views
6

これは私の現在の結果である(例が含まれています):WebGLのためのcolladaファイルを正しく解析するには?

incorrect collada model parsing

あなたはモデルがそれらのギャップの束を持って見ることができるように。私の推測では、どうしてこのようなことが起きるのでしょうか?<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);です。

私はこの問題の解決方法やアドバイスを大いに喜んでいます。


更新:再びこのパーサで遊んでた後、私は(さえ正しくエクスポートモデルと)上記の解析機能が正しく法線を表示しませんではないだろうということ、気づきました。一意の位置ではなく、面ごとに頂点が定義されるようにデータを変更する必要があります。

+0

でもあなたが使用していない場合は、たとえば、three.js、なぜちょうど彼らが何をしたか確認するために見ていませんか?それはすぐそこにあり、きちんと構造化されているので、読むのは簡単です。 COLLADA polysの理解に合っているかどうか確認してください。 – bjorke

+0

あなたはイメージを*四角形ごとに2つの三角形を描いているように見えますが、ABCDを使って四角形を描画すると、ABCとCDCは描画されません。 – bjorke

+1

@bjorkeこの4k行のスクリプトでは、 https://github.com/arcanis/issue.three.js.collada/blob/master/ColladaLoader.js 私は実際にはシーンやアニメーションを解析する必要はありませんが、メッシュを正しく解析する必要があります。 –

答えて

1

解決策が見つかりました。モデルをブレンダーで書き出す前に、decimate修飾子を追加する必要があります。 triangulateを確認し、ratio0.9900に設定します(左矢印を1回クリックします)。

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

だから、最終的には例えば、あなたの球メッシュは次のようになります。

enter image description here

+2

Blender 2.68aの新機能 - Colladaエクスポータは、メッシュ自体を変更せずに、エクスポート中に自動的にメッシュを三角形分割します。これにより、手動でそのステップを実行する必要はありません。より有用には、メッシュ内にクワッド(例えば、キュ​​ーブの場合は6つのクワッド)を保持する。だから、あなたは望み通りにモデル化して、エクスポート作業中に輸出者にそれを "不可視かつ魔法のように"三角測量させることができます。 – DevByStarlight

関連する問題