이 내 현재의 결과 (예 포함) :WebGL에서 collada 파일을 올바르게 구문 분석하는 방법은 무엇입니까?
당신이 모델은 그 격차의 무리를 볼 수 있듯이. 내 추측으로, 왜 이런 일이 일어날까요? <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);
입니다.
이 문제에 대한 해결책이나 조언을 크게 부탁드립니다.
업데이트 : 다시 파서 주위를 연주 후, 나는 (심지어 제대로 수출 모델) 위의 구문 분석 기능이 제대로 법선을 표시하지 않습니다되지 않습니다,났습니다. 고유 한 위치가 아닌 면당 정점이 정의되도록 데이터를 변경해야합니다.
은, 말하자면, three.js를, 왜 그냥 그들이 무슨 짓을했는지 볼 수 있습니까? 모든 것이 바로 멋지게 구조화되었으므로 읽을 수 있습니다. COLLADA polys에 대한 이해와 맞는지 확인하십시오. – bjorke
당신은 쿼드 당 두 개의 삼각형을 그리는 것처럼 보이지만 ABC와 CDA가 아닌 ABC와 DBC를 그려야합니다. – bjorke
@bjorke이 4k 라인 스크립트에서 솔루션을 찾는 것이 좋습니다. https://github.com/arcanis/issue.three.js.collada/blob/master/ColladaLoader.js 지금 당장은 장면과 애니메이션을 구문 분석 할 필요가 없습니다. 메시를 정확하게 파싱하고 싶습니다. . –