2013-02-14 19 views
6

Bu benim şimdiki sonucudur (örnek dahil):WebGL için nasıl colda dosyaları ayrıştırılır?

incorrect collada model parsing

sen modeller onları boşluklar bir grup var görebileceğiniz gibi. Tahminimce, bu neden olur ki, <vcount> verisini <polylist> elemanına dahil etmem gerekecek, ki bu da her bir düzlem için köşe sayımını (?) Belirlemelidir. WebGL sadece 3 taraflı çokgenler çizebileceğinden, bu işe yaramaz. Şimdiye kadarki varsayımın doğru olması halinde, dörtgenlerin her birini iki üçgen şeklinde kesmem gerekiyor.

Zaten WebGL ile ayrıştırma Collada üzerinde çok araştırma yaptık ama neredeyse her site böyle işlevselliği zaten hayata sahip birkaç WebGL kütüphanelere beni yönlendirildi (böylece aynı şeyi etmeyiniz). İşlerin nasıl yürüdüğüne dair daha iyi bir kavrayış elde etmek için her zaman temel işlevselliği kendim yazarak başlarım.

İşte benim ayrıştırma fonksiyonudur: normalleri lutfen indeksleri neden ben de pek emin değilim

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; 
} 

ama indicesList sadece her ikinci değer ekleyerek onları görmezden geliyorum.

Çekiliş yordamım sadece gl.drawElements(gl.TRIANGLE_STRIP, program.models[i].ibo.count, gl.UNSIGNED_SHORT, 0);.

Bu sorunla ilgili çözümleri veya önerileri büyük bir olasılıkla incelerim.


Güncelleme: yine bu ayrıştırıcı ile uğraşırken sonra ben (hatta doğru ihraç modellerle) Yukarıdaki ayrıştırma işlevi doğru normaller göstermez olmaz, fark ettim. Verileri değiştirmek zorundasınız ki, köşeler her yüze göre tanımlanmalı ve benzersiz pozisyona göre değil.

+0

, diyelim ki, Three.js, neden sadece yaptıklarını görmek için bakmak? Her şey yolunda ve güzel yapılandırılmış, bu yüzden okunması kolay. COLLADA polisi anlayışınız ile uyup uymadığını görün. – bjorke

+0

Görüntünün görüntüsü * göründüğü gibi, dörtlü olarak iki üçgen çiziyorsunuz, ancak ABCD'li bir dörtlü için ABC ve DBC çiziyorsunuz - ABC ve CDA değil – bjorke

+1

@bjorke Bu 4k satırlık betikte çözümü bulmak için iyi şanslar: https://github.com/arcanis/issue.three.js.collada/blob/master/ColladaLoader.js Şu anda sahneleri ve animasyonları ayrıştırmam gerekmiyor, sadece ağ gözü doğru şekilde ayrıştırmak istiyorum . –

cevap

1

Olası bir çözüm bulundu. Modelinizi karıştırıcıda dışa aktarmadan önce, decimate değiştiricisini eklemeniz gerekir. triangulate'u kontrol edin ve ratio değerini 0.9900 olarak ayarlayın (soldaki tek tıklama).

Düzeltme: Aslında bir triangulate değiştiricisi var, bunun yerine bunu kullanın.

Yani sonunda örnek için küre örgü şu şekilde görünecektir: Kullanmak bile

enter image description here

+2

Blender 2.68a'da Yeni - Collada ihracatçısı, örgüyi otomatik olarak ağ gözü değiştirmeden, ihracat sırasında kafesleri üçgenler. Bu, bu adımı manuel olarak yapmaya gerek duymaz. Daha da önemlisi, kafes içinde dörtlü (örneğin, küp için 6 dörtlü) tutar. Böylece istediğiniz şekilde modelleyebilir ve ihracatçı, ihracat işlemi sırasında "görünmez ve büyülü" olarak üçgenleştirebilir. – DevByStarlight

İlgili konular