Bu benim şimdiki sonucudur (örnek dahil):WebGL için nasıl colda dosyaları ayrıştırılır?
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.
, 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
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
@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 . –