2013-02-14 2 views
6

이 내 현재의 결과 (예 포함) :WebGL에서 collada 파일을 올바르게 구문 분석하는 방법은 무엇입니까?

incorrect collada model parsing

당신이 모델은 그 격차의 무리를 볼 수 있듯이. 내 추측으로, 왜 이런 일이 일어날까요? <polylist> 요소에 <vcount> 데이터를 포함시켜야합니다.이 요소는 각 평면 (?)의 꼭지점 수를 결정하기로되어 있습니다. WebGL은 3면 다각형 만 그리기 때문에 작동하지 않습니다. 지금까지의 가정이 맞다면 모든 사변형을 각각 두 개의 삼각형으로 분할해야합니다.

나는 이미 Collagen과 WebGL 구문 분석에 대한 많은 연구를 해왔지만, 거의 모든 사이트가 이미 이러한 기능을 구현 한 여러 WebGL 라이브러리로 리디렉션되었습니다. 따라서 동일한 기능을 수행하지 마십시오. 나는 항상 모든 핵심 기능을 직접 작성하여 내부적으로 어떻게 작동하는지 더 잘 이해할 수 있습니다.

여기 내 구문 분석 함수입니다 : 법선이 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에서 각 두 번째 값을 추가하여이를 무시하고있다.

내 루틴 루틴은 간단히 gl.drawElements(gl.TRIANGLE_STRIP, program.models[i].ibo.count, gl.UNSIGNED_SHORT, 0);입니다.

이 문제에 대한 해결책이나 조언을 크게 부탁드립니다.


업데이트 : 다시 파서 주위를 연주 후, 나는 (심지어 제대로 수출 모델) 위의 구문 분석 기능이 제대로 법선을 표시하지 않습니다되지 않습니다,났습니다. 고유 한 위치가 아닌 면당 정점이 정의되도록 데이터를 변경해야합니다.

+0

은, 말하자면, three.js를, 왜 그냥 그들이 무슨 짓을했는지 볼 수 있습니까? 모든 것이 바로 멋지게 구조화되었으므로 읽을 수 있습니다. COLLADA polys에 대한 이해와 맞는지 확인하십시오. – bjorke

+0

당신은 쿼드 당 두 개의 삼각형을 그리는 것처럼 보이지만 ABC와 CDA가 아닌 ABC와 DBC를 그려야합니다. – bjorke

+1

@bjorke이 4k 라인 스크립트에서 솔루션을 찾는 것이 좋습니다. https://github.com/arcanis/issue.three.js.collada/blob/master/ColladaLoader.js 지금 당장은 장면과 애니메이션을 구문 분석 할 필요가 없습니다. 메시를 정확하게 파싱하고 싶습니다. . –

답변

1

잠재적 인 해결책을 찾았습니다. 블렌더에서 모델을 내보내기 전에 decimate 수정자를 추가해야합니다. triangulate을 확인하고 ratio0.9900 (왼쪽 화살표를 한 번 클릭)으로 설정하십시오.

편집 : 실제로는 triangulate 수정자가 있으므로이 대신 사용하십시오.

그래서 결국 예를 들어, 귀하의 구 메쉬는 다음과 같이 보일 것이다 : 당신이 사용하지 않는 경우에도

enter image description here

+2

블렌더 2.68a의 새로운 기능 - Collada 내보내기 기능은 메시 자체를 변경하지 않고 내보내는 동안 자동으로 메쉬를 삼각형 화합니다. 이렇게하면 수동으로 해당 단계를 수행 할 필요가 없습니다. 보다 유용하게는 메쉬에 쿼드 (예 : 큐브의 경우 6 개)를 유지합니다. 따라서 원하는대로 모델링하고 수출 작업 중에 수출업자가 "보이지도 않고 마술처럼"삼각화할 수있게 할 수 있습니다. – DevByStarlight