2014-01-20 5 views
-1

나는 자바 스크립트에 새로운 오전 및 아래에 나열된 함수를 호출하고 개체 [개체 개체] 자바 스크립트에서 함수를 않습니다 동일한 가져 오는 계속하려고합니다. 누구든지 도와주세요.개체 [개체 개체] 자바 스크립트에서 기능이 없습니다

// This is just a sample script. Paste your real code (javascript or HTML) here. 
function init() { 

    //Marker 
    canvasMarker = document.createElement('canvas'); 
    context = canvasMarker.getContext('2d'); 

    container = document.createElement('div'); 
    document.body.appendChild(container); 
    document.body.appendChild(canvasMarker); 

    /* This is where ths problem is encountered. */ 
    detector = create(canvasMarker); 

    camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 1, 1000); 
    camera.position.set(80, 20, 10); 

    //Creates scene 
    scene = new THREE.Scene(); 

    var ambient = new THREE.AmbientLight(0x101030); 
    //scene.add(ambient); 

    var directionalLight = new THREE.DirectionalLight(0xffeedd); 
    directionalLight.position.set(0, 0, 1); 
    scene.add(directionalLight); 

    // loads texture 

    var manager = new THREE.LoadingManager(); 
    manager.onProgress = function (item, loaded, total) { 
     console.log(item, loaded, total); 
    }; 

    var texture = new THREE.Texture(); 
    var loader = new THREE.ImageLoader(manager); 
    loader.load(texturePath, function (image) { 
     texture.image = image; 
     texture.needsUpdate = true; 
     texture.transparent = true; 
    }); 

    // loads model 
    var loader = new THREE.OBJLoader(manager); 
    loader.load(objectPath, function (object) { 

     object.traverse(function (child) { 

      if (child instanceof THREE.Mesh) { 

       child.material.map = texture; 
       child.material.transparent = true; 

      } 

     }); 

     object.position.y = -100; 
     scene.add(object); 

    }); 

    //setup three.js renderer 
    renderer = new THREE.WebGLRenderer({ 
     alpha: true 
    }); 

    //canvas   
    var mycanvas = renderer.domElement; 
    mycanvas.setAttribute('id', 'Canvas3d'); 
    renderer.setSize(window.innerWidth, window.innerHeight); 
    container.appendChild(mycanvas); 
    document.addEventListener('mousemove', onDocumentMouseMove, false); 

    //window listener for resize 
    window.addEventListener('resize', onWindowResize, false); 
    video = document.getElementById('myvideo'); 

} 

function onWindowResize() { 

    windowHalfX = window.innerWidth/2; 
    windowHalfY = window.innerHeight/2; 

    camera.aspect = window.innerWidth/window.innerHeight; 
    camera.updateProjectionMatrix(); 
    renderer.setSize(window.innerWidth, window.innerHeight); 

} 

function onDocumentMouseMove(event) { 
    mouseX = (event.clientX - windowHalfX)/2; 
    mouseY = (event.clientY - windowHalfY)/2; 
} 

//Animate the model 
function animate() { 
    // The ardetector requires that we set a flag when the canvas has changed. 
    canvasMarker.changed = true; 

    // Ask the detector to make a detection pass. 
    detector.detect(onMarkerCreated, onMarkerUpdated, onMarkerDestroyed); 

    requestAnimationFrame(animate); 
    render(); 

} 

//Render the Model 
function render() { 
    camera.position.x += (mouseX - camera.position.x) * .05; 
    camera.position.y += (-mouseY - camera.position.y) * .05; 
    camera.lookAt(scene.position); 
    renderer.render(scene, camera); 
} 

* 
var create = function (sourceCanvas) { * 
    var JSARRaster = new NyARRgbRaster_Canvas2D(sourceCanvas); 
    var JSARParameters = new FLARParam(sourceCanvas.width, sourceCanvas.height); 
    var JSARDetector = new FLARMultiIdMarkerDetector(JSARParameters, 120); 
    JSARDetector.setContinueMode(true); 

    var getMarkerNumber = function (idx) { 
     var data = JSARDetector.getIdMarkerData(idx); 
     if (data.packetLength > 4) { 
      return -1; 
     } 

     var result = 0; 
     for (var i = 0; i < data.packetLength; i++) { 
      result = (result << 8) | data.getPacketData(i); 
     } 

     return result; 
    } 

    var getTransformMatrix = function (idx) { 
     var mat = new NyARTransMatResult(); 
     JSARDetector.getTransformMatrix(idx, mat); 

     var cm = new Float32Array(16); 
     cm[0] = mat.m00; 
     cm[1] = -mat.m10; 
     cm[2] = mat.m20; 
     cm[3] = 0; 
     cm[4] = mat.m01; 
     cm[5] = -mat.m11; 
     cm[6] = mat.m21; 
     cm[7] = 0; 
     cm[8] = -mat.m02; 
     cm[9] = mat.m12; 
     cm[10] = -mat.m22; 
     cm[11] = 0; 
     cm[12] = mat.m03; 
     cm[13] = -mat.m13; 
     cm[14] = mat.m23; 
     cm[15] = 1; 

     return cm; 
    } 

    var getCameraMatrix = function (zNear, zFar) { 
     var result = new Float32Array(16); 
     JSARParameters.copyCameraMatrix(result, zNear, zFar); 
     return result; 
    } 

    var persistTime = 1; 
    var newMarker = function (id, matrix) { 
     return { 
      id: id, 
      matrix: matrix, 
      age: persistTime, 
     } 
    } 

    var markers = {}; 
    var detect = function (onCreate, onUpdate, onDestroy) { 
     var markerCount = JSARDetector.detectMarkerLite(JSARRaster, 70); 
     for (var index = 0; index < markerCount; index++) { 
      var id = getMarkerNumber(index); 
      var marker = markers[id]; 
      if (marker === undefined) { 
       marker = newMarker(id, getTransformMatrix(index)); 
       markers[id] = marker; 
       onCreate(marker); 
      } else { 
       marker.matrix = getTransformMatrix(index); 
       marker.age = persistTime; 
       onUpdate(marker); 
      } 
     } 

     for (var id in markers) { 
      var marker = markers[id]; 
      if (marker) { 
       if (marker.age-- == 0) { 
        onDestroy(marker); 
        delete markers[id]; 
       } 
      } 
     } 
    } 

    return { 
     detect: detect, 
     getCameraMatrix: getCameraMatrix, 
    } 
} 

return { 
    create: create, 
} 

이것은 내 코드입니다. 도와주세요.

+0

"create()"함수를 Render()에서 변수로 만듭니다. init()과 같은 외부 함수에는 액세스 할 수 없습니다. init()이 그것을 볼 수있는 Render() 외부로 create 함수를 이동하십시오. – MikeHelland

+0

확실히 범위 지정 문제로 보입니다. 향후 질문을 위해 관련성이 낮은 코드를 잘라내십시오. 나는 자바 스크립트에서 스코핑이 어떻게 작동하는지에 대해 논하는 블로그 포스트를 잠깐 썼다. - http://jordanforeman.com/understanding-javascript/ –

+1

@MazeHatter는 reder에 생성되지 않는다. – user2970434

답변

0

어디에서 init()을 호출합니까?

이 프로그램 외부에 있어야합니까?

그러면 var create가 범위를 벗어났습니다.

변경 var create = function() {create create() {변경하려면 행운을 빕니다.

편집 :

만약이 귀하 (사이비)이 -js 경우 파일 :

init(); 
function init() { } 
function create() { } 

return {create: create}; 

그런 다음 오류 불법 return 문을 얻을 것이다하는 JS 파일은 "반환"을하지 않기 때문에 어디서나 값.

맨 아래의 return 문은 아무 것도하지 않습니다 (오류를 제외하고).

+0

그런 경우에는 var create = function()이 아직 실행되지 않았으므로 정의되지 않았습니다. init() 위로 이동하거나 스크립트가 실행되기 전에 create() 함수를 사용하여 스크립트가 실행되기 전에 존재하는지 확인 – MikeHelland

+0

함수 init 전에 function이 변경 될 때 exeactly가 호출됩니다. create() 오류가 발생하면 오류가 발생합니다. statment. 반환 방법을 알려주십시오. – user2970434

+0

함수에없는 최종 반환 문이 유용하지 않고 오류가 발생하는 이유를 설명하기 위해 제 대답을 편집했습니다. – MikeHelland

관련 문제