2014-01-20 213 views
-1

我是javascript新手,我试着调用下面列出的创建函数,并继续获取相同的错误,即object [object Object]不是javascript中的函数任何人都可以请帮忙。对象[对象对象]不是javascript中的函数

// 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

您正在Render()中创建“create()”函数作为变量。它不会像init()那样被外部函数访问。将create函数移到Render()之外,init()可以看到它。 – MikeHelland

+0

这绝对看起来像一个范围问题 - 考虑为未来的问题修剪一些不太相关的代码。我写了一篇博客文章,讨论了JavaScript在JavaScript中的工作原理 - http://jordanforeman.com/understanding-javascript/ –

+1

@MazeHatter创建不在reder – user2970434

回答

0

你在哪里调用init()?

它必须在这个程序之外?

然后var创建已超出范围。

更改var create = function(){到函数create(){和你可能有更好的运气。

编辑:

如果,如果你的(伪)-js文件:

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

return {create: create}; 

然后你会得到错误非法return语句,因为JS文件不会 “回归”任何地方的价值。

在最底部的返回语句不会执行任何操作(除了抛出错误);

+0

在这种情况下,var create = function()尚未运行,因此未定义。将它移到init()之上或使用函数create()确保它在脚本运行之前存在 – MikeHelland

+0

在函数init之前调用init,当我将函数更改为函数create()时会发生错误,告诉我illegla返回statment。你现在应该怎么样回复sttsament - – user2970434

+0

我编辑了我的答案,解释了为什么最终返回语句(如果不在函数中)没有用并导致错误。 – MikeHelland

相关问题