【问题标题】:How to store loaded mesh?如何存储加载的网格?
【发布时间】:2015-05-09 03:44:20
【问题描述】:

您好,我一直在尝试存储从 obj 文件加载的对象。基本上我正在尝试创建新的网格并将其存储在网格变量中,以便稍后在 Javascript 中我可以引用该对象并更改其属性。但是,当我声明这个网格变量并分配作为网格的子项时,加载结束后,该子项消失了,我的网格中没有任何内容。有没有办法从加载的网格创建新的网格并存储它们?谢谢!

var mesh = new THREE.Mesh();
//loading the model
var loader = new THREE.OBJLoader(manager);

loader.load('models/stuff2.obj', function(object){
    //adding object into the scene
    object.name = "trying";
    object.traverse(function(child){
        if(child instanceof THREE.Mesh){
        child.material.map = texture;

    }
    });
    object.position.set(0,0,0);
    scene.add(mesh);
});

console.log(mesh);

【问题讨论】:

  • 如果你能接受,不知道下面的答案是否对你有用。

标签: javascript three.js


【解决方案1】:

在函数内部...

var myMeshes = [];
var myMeshHash = {};
function loadMyModel(path, func){
  var loader = new THREE.OBJLoader(path);
  loader.load(path, function(object){
      object.name = "path";
      object.traverse(function(child){
          if(child instanceof THREE.Mesh){
          child.material.map = texture;

      }
      });
      object.position.set(0,0,0);
      scene.add(object);
      myMeshes.push(object);
      myMeshHash[path] = object;
      if(func != undefined){
        func(object);
      }
  });
}


//use:
loadMyModel("models/stuff2.obj", function(mesh){
  console.log(mesh);
});

【讨论】:

    【解决方案2】:

    您正在加载网格,因此您无需将网格声明为网格。您只需将其用作您加载的对象的容器。

    var mesh;
    //loading the model
    var loader = new THREE.OBJLoader(manager);
    
    loader.load('models/stuff2.obj', function(object){
        //adding object into the scene
        object.name = "trying";
        object.traverse(function(child){
            if(child instanceof THREE.Mesh){
              child.material.map = texture;
            }
        });
        object.position.set(0,0,0);
        scene.add(object);
        mesh = object;
    });
    // then use it later
    $("#my3dworldcontrol").click(function(){
        console.log(mesh);
    });
    

    【讨论】:

    • 你试过了吗?我试过了,但网格再次不包含与对象相同的信息
    • 这很奇怪,除非所有这些都在 for 循环或其他迭代器中运行,然后您就会遇到关闭问题。在那种情况下,无论如何都没有足够的代码来尝试它。如果您希望将答案作为单元测试解决方案,那么您应该发布一个小提琴。
    • 也有人过来并从我的回答中删除了重要信息。从字面上看,代码注释“// 然后稍后使用”意味着您不能在那里使用该控制台日志,因为 obj 加载是异步的。在这种情况下,它将返回 undefined。
    • 哎呀,对不起。尽管修订页面上说我删除了这些 cmets,但这些 cmets 实际上并没有出现在我正在编辑的那个中。我只是添加了缩进和分号,没有删除任何内容。
    • @radio 好的,谢谢!有没有办法在加载事物后设置命令运行?
    猜你喜欢
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 2012-01-06
    • 1970-01-01
    • 2015-11-18
    • 2014-01-04
    相关资源
    最近更新 更多