2015-02-04 4 views
1

자바 스크립트에서 경로 추적기를 만들고 있는데 아주 이상한 오류가 발생했습니다. 이 내 코드의 관련 섹션 (그 아래에 더 많은 코드가있다하지만 난 아무것도 일으키는 생각하지 않는다 나는 모두를 주석 경우에도 동일한 결과가 발생합니다.) :Javascript가 순서대로 실행되지 않습니다.

<html> 
<head> 
    <script src="lib/sah.js"></script> 
    <script src="lib/BIH.js"></script> 
    <script src="lib/Three.js"></script> 
    <script src="lib/three.min.js"></script> 
    <script src="lib/loaders/OBJMTLLoader.js"></script> 
    <script src="lib/loaders/MTLLoader.js"></script> 
    <script src="lib/loaders/XHRLoader.js"></script> 
    <script src="lib/loaders/Cache.js"></script> 

    <script type="text/javascript"> 
     function Vec(x, y, z) { return new V(x, y, z); } 
     function V(x, y, z) { this.x = x; this.y = y; this.z = z; } 
     V.add = function (a, b) { return Vec(a.x + b.x, a.y + b.y, a.z + b.z); } // overriding operators is not possible in JS 
     V.sub = function (a, b) { return Vec(a.x - b.x, a.y - b.y, a.z - b.z); } 
     V.mud = function (a, b) { return Vec(a.x * b, a.y * b, a.z * b); } 
     V.prototype.mult = function (b) { return Vec(this.x * b.x, this.y * b.y, this.z * b.z); } 
     V.prototype.norm = function() { var t = this; var il = 1/Math.sqrt(t.x * t.x + t.y * t.y + t.z * t.z); t.x *= il; t.y *= il; t.z *= il; return t; } 
     V.prototype.dot = function (b) { return this.x * b.x + this.y * b.y + this.z * b.z; } 
     V.crs = function (a, b) { return Vec(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x); } 


     function Element(aabb,material) { 
      this.aabb = aabb; 
      this.material = material; 
     } 
     var meshlist = []; 

     var elements = []; 
     var loader = new THREE.OBJMTLLoader(); 
     loader.load("lib/CornellBox-Sphere.obj", "lib/CornellBox-Sphere.mtl", meshlist); 
     for (k = 0; k < this.meshlist.length; k++) { 
      for (l = 0; l < this.meshlist[k].geometry.aabb.length; l++) { 
       elements.push(new Element(this.meshlist[k].geometry.aabb[l],meshlist[k].material)); 
      } 
     } 

     var bih = new BIH(); 

나는 로더를 요청하고 내 cornell 상자 데이터를로드 할 수 있지만 어떤 이유로 다른 모든 코드가 실행될 때까지로드를 완료하지 않습니다. 디버거를 사용하여 단계별로 수행하면 로더가 파일 위치를 구문 분석하지만 데이터를 실제로 "meshlist"배열에로드하는 대신 my 루프로 바로 이동하여 요소 목록에 배치합니다. 아무것도 메쉬 목록에로드되지 않았으므로 분명히 많이 달성하지 못합니다. 다른 모든 코드가 실행 된 후에 만 ​​로더는 중단 된 부분을 선택하고로드를 메쉬 목록에 완료합니다. 무엇이 이것을 일으킬 수 있습니까? 나는 모른다. 귀하의 의견을 보내 주셔서 감사합니다!

+0

로드 완료시 호출 될 callback 기능 load 방법을 전달해야 로더가 비동기처럼 그래서 당신은 부하가 순서대로 완료 될 때까지 기다려야 할 것 같다 루프를 실행하십시오. 로드 API 참조에 콜백이 있는지 확인하십시오. – satchcoder

답변

2

loader.load의 비동기 특성으로 인해이 문제가 발생합니다. 그것은 http 요청을하고, 여러분의 리소스가 서버에서 클라이언트로 전송되는 동안 나머지 코드가 실행됩니다. 당신이 documentation에서 볼 수 있듯이 자원이

loader.load("lib/CornellBox-Sphere.obj", "lib/CornellBox-Sphere.mtl", function (obj) { 
    // do your resources dependant stuff here 
}); 
관련 문제