2013-02-14 19 views
6

Questo è il mio risultato corrente:Come analizzare correttamente i file Collada per WebGL? (Ad esempio inclusa)

incorrect collada model parsing

Come potete vedere i modelli hanno un sacco di lacune nella loro. La mia ipotesi, perché ciò accada sarebbe, che in qualche modo ho bisogno di includere i dati <vcount> nell'elemento <polylist>, che dovrebbe determinare il numero di vertici per ciascun piano (?). Dal momento che WebGL può disegnare solo poligoni a 3 lati, questo non sembra funzionare. Se la mia ipotesi fino ad ora è corretta, dovrei tagliare tutti i quadrilateri in due triangoli ciascuno.

Ho già fatto molte ricerche sull'analisi di collada con WebGL, ma quasi tutti i siti mi hanno reindirizzato a diverse librerie WebGL che hanno già implementato tale funzionalità (quindi per favore non fare lo stesso). Comincio sempre scrivendo tutte le funzionalità principali per capire meglio come funzionano le cose internamente.

Qui è la mia funzione di parsing:

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

io non sono anche abbastanza sicuro perché le normali hanno indici entrava, ma io li sto ignorando con l'aggiunta di solo ogni secondo valore dal indicesList.

La mia routine di disegno è semplicemente gl.drawElements(gl.TRIANGLE_STRIP, program.models[i].ibo.count, gl.UNSIGNED_SHORT, 0);.

Apprezzerei molto qualsiasi soluzione o consiglio su questo problema.


Aggiornamento: Dopo aver suonato in giro con questo parser di nuovo, ho notato, che la funzione di analisi di cui sopra (anche con modelli correttamente esportati) non sarà non verrà visualizzato correttamente le normali. Dovresti modificare i dati in modo che i vertici siano definiti per faccia e non per posizione unica.

+0

Anche se non si utilizza, ad esempio, Three.js, perché non basta guardare per vedere che cosa hanno fatto? Va tutto bene e ben strutturato, quindi è semplice da leggere. Vedi se si adatta alla tua comprensione dei polli COLLADA. – bjorke

+0

L'immagine * sembra * come se si disegnassero due triangoli per quad, ma per un quad con verbi ABCD, si sta disegnando ABC e DBC - non ABC e CDA – bjorke

+1

@bjorke Buona fortuna a trovare la soluzione in questo script di 4 righe: https://github.com/arcanis/issue.three.js.collada/blob/master/ColladaLoader.js Al momento non ho davvero bisogno di analizzare scene e animazioni, ma voglio solo ottenere la mesh correttamente analizzata . –

risposta

1

Trovato una soluzione potenziale. Prima di esportare il modello in Blender, è necessario aggiungere un modificatore decimate. Controllare triangulate e impostare ratio su 0.9900 (un clic sulla freccia sinistra).

Modifica: In realtà esiste un modificatore triangulate, quindi utilizzare questo invece.

Così, alla fine la tua maglia sfera per esempio sarebbe simile a questa:

enter image description here

+2

Novità in Blender 2.68a - l'esportatore Collada triangola automaticamente la mesh durante l'esportazione senza alterare la mesh stessa. Questo evita di dover fare manualmente quel passo. Più utile, mantiene i quad (ad es. 6 quad per il cubo) nella mesh. Quindi è possibile modellare come desiderato e lasciare che l'esportatore lo triangoli "invisibilmente e magicamente" durante l'operazione di esportazione. – DevByStarlight