正在 Three.Dart 中加载一个对象

Loading an object in Three.Dart

我正在尝试为 DART (Three.dart) 使用移植的 Three.JS 并加载位于我的项目根目录中的目标文件,在根目录中我也有 index.html 和 main.dart 个文件。

基本上我一直在关注 https://github.com/threeDart/three.dart/tree/master/example/web_gl_loader_stl 上的一个演示,那里没有用于 OBJLoader class 的演示,但是自从编写了这些示例后,它就已经实现了。

我用来尝试加载对象的代码如下:

loader = new OBJLoader();

loader.load('zergling.obj').then((object) {

  var geometry = object.geometry;
  var mesh = new Mesh(geometry, material);
  mesh.position.setValues(0.0, -0.37, -0.6);
  mesh.rotation.setValues(-Math.PI / 2, 0.0, 0.0);
  mesh.scale.setValues(2.0, 2.0, 2.0);

  mesh.castShadow = true;
  mesh.receiveShadow = true;
  scene.add(mesh);
});

对象是一只简单的小狗。我稍后在代码中渲染场景,但它似乎不起作用。

我也看过这个帖子 How to load obj model via three.dart?。但是之后就没有运气了。

关于我如何进行的任何评论?你在加载代码中看到任何问题吗?如果没有,我可以提供整个代码库的要点。

我不使用 Three.dart,我只是简单地查看了您的代码,但我认为您的代码未将后续代码与调用异步代码时需要的 .then((..) ...) 链接起来

loader.load('zergling.obj').then((object) {
  ...
}).then((x) {
  // here the result is available
  renderer = new WebGLRenderer(antialias: true, alpha: false);
  renderer.setSize(window.innerWidth, window.innerHeight);
  ...
});
// here no result has yet been loaded

当你使用像 load 这样的异步方法(returns 未来)时,只注册一个回调并执行以下代码(在你的情况下 }); 之后。当这个同步线程结束后,注册回调队列一个接一个注册。

新的 async/await 功能可以更轻松地使用此类代码

Future someFunc() async {
  // here the result is available
  var object = await loader.load('zergling.obj');
  var geometry = object.geometry;
  var mesh = new Mesh(geometry, material);
  mesh.position.setValues(0.0, -0.37, -0.6);
  mesh.rotation.setValues(-Math.PI / 2, 0.0, 0.0);
  mesh.scale.setValues(2.0, 2.0, 2.0);

  mesh.castShadow = true;
  mesh.receiveShadow = true;
  scene.add(mesh);
}

您需要开发通道 Dart 版本 (1.9.0-dev...) 才能使用此新功能。 使用 async/await 不会改变执行,它只会改变代码的外观。

loader = new OBJLoader();

loader.load('zergling.obj').then((object) {

  var mesh = object;
  mesh.position.setValues(0.0, -0.37, -0.6);
  mesh.rotation.setValues(-Math.PI / 2, 0.0, 0.0);
  mesh.scale.setValues(2.0, 2.0, 2.0);

  mesh.castShadow = true;
  mesh.receiveShadow = true;
  scene.add(mesh);
});

这对我有用。 object 是 Object3D。