【问题标题】:three.js-Uncaught ReferenceError: scene is not defined三.js-Uncaught ReferenceError: 场景未定义
【发布时间】:2017-06-05 13:56:10
【问题描述】:

我是 a-frame,three.js 的新手,我正在尝试使用 .obj 模型创建一个简单的场景,我的目标是创建一棵树然后克隆它,但它给出了一个错误,指出 Uncaught ReferenceError: scene is not定义了

 <a-scene>
 <a-assets>
   <img id="my-image" src="sky.jpg">
   <img id="grass" src="grass.jpg">
   <a-asset-item id="tree-obj" src="tree-05.obj"></a-asset-item>
   <a-asset-item id="tree-mtl" src="tree-05.mtl"></a-asset-item>
   <a-asset-item id="lion-cub-obj" src="lion-cub.obj"></a-asset-item>
   <a-asset-item id="lion-cub-mtl" src="lion-cub.mtl"></a-asset-item>
 </a-assets>
  <a-plane src="#grass" height="200" width="200" rotation="-90 0 0"></a-plane>
   <a-obj-model src="#tree-obj" mtl="#tree-mtl" scale="0.05 0.05 0.05" id="group" position=" 4 0.5 0"></a-obj-model>
   <script>
    var mtlLoader = new THREE.MTLLoader();
    mtlLoader.setPath('./');
    mtlLoader.load('tree-05.mtl', function(materials) {
    materials.preload();
    var objLoader = new THREE.OBJLoader();
    objLoader.setMaterials(materials);
    objLoader.setPath('./');
    objLoader.load('tree-05.obj', function(object) {
      object.scale.set(0.05, 0.05, 0.05);
      object.position.set( 6, 0.5, 0 );
      scene.add(object);  
      });
     });
  </script>
 <a-obj-model src="#lion-cub-obj" mtl="#lion-cub-mtl" scale="0.25 0.25 0.25" rotation="0 -180 0" position=" 0 1 0"></a-obj-model>
<a-sky src="#my-image" position="0 -200 0"></a-sky>

【问题讨论】:

    标签: javascript three.js aframe


    【解决方案1】:

    您没有在&lt;script&gt; 标签中定义场景,您需要通过以下方式进行引用:

    1. document.querySelector('a-scene').object3D; 参考或,

    2. 在任何&lt;a-entity&gt; 上引用this.el.sceneEl.object3D,因为它似乎返回了现场引用,在您的情况下:document.querySelector('a-plane').sceneEl.object3D;

    顺便说一句,当你像你一样放置&lt;script&gt; 标签时,范围是窗口,而不是&lt;a-obj-model&gt;。我的建议是创建一个组件:

    AFRAME.registerComponent('myloader', {
        init: function(){
        var self = this;
        var mtlLoader = new THREE.MTLLoader();
        mtlLoader.setPath('./');
        mtlLoader.load('tree-05.mtl', function(materials) {
        materials.preload();
        var objLoader = new THREE.OBJLoader();
        objLoader.setMaterials(materials);
        objLoader.setPath('./');
        objLoader.load('tree-05.obj', function(object) {
          object.scale.set(0.05, 0.05, 0.05);
          object.position.set( 6, 0.5, 0 );
          self.el.sceneEl.object3D.add(object);  
    }
    });
    

    然后添加如下:&lt;a-obj-model myloader (...)
    它不是最好的组件,因为您需要定义更新和删除功能,我仍然会这样做。

    【讨论】:

    • 我使用了你的建议并添加了var scene=document.querySelector('a-scene');,但现在它抛出了一个错误,指出未捕获的错误:尝试添加一个没有object3D的元素
    • 如果我使用您创建组件的方式,也会出现同样的错误。 3D 模型无处可见
    • 试试 var scene=document.querySelector('a-scene').object3D;
    • @HarshitSharma scene.object3D 参考应该可以工作,在threejs 中创建了一个简单的立方体,当我将对象添加到scene.object3D 参考时它可以工作:plnkr.co/edit/jQ2DPsjketpYQOogDyMW?p=preview
    • 因为你在场景中有一个脚本标签...在场景之后包含它。另请阅读aframe.io/docs/0.5.0/introduction/…
    猜你喜欢
    • 2022-11-21
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多