巴比伦.js如何在功能之外访问网格体



我只是无法访问巴比伦网格。 每次我尝试运行代码时,我都会得到这个 错误。

我尝试了两种不同的方法:

示例 1:

var carTest;
BABYLON.SceneLoader.ImportMesh("", "assets/", "car.obj", scene, function(object) {
carTest = object[0];
});
carTest.position.x = 10;

示例 2:

var carTest = BABYLON.SceneLoader.ImportMesh("", "assets/", "car.obj", scene);
carTest.position.x = 10;

如果您知道异步/等待的概念,您可以使用异步函数,而不是使用带有回调函数的同步方法。

例:

const data = await SceneLoader.ImportMeshAsync("", "assets/", "car.obj", scene);
const carMeshes = data.meshes;

如果您知道只有一个有子网格,则可以访问 [0],否则您可能需要合并网格。取决于你想做什么。

在示例 2 中, 巴比伦。SceneLoader.ImportMesh 返回Nullable<ISceneLoaderPlugin | ISceneLoaderPluginAsync>,并且它们都没有属性名称作为位置。
因此,carTest.position将是未定义的。

carTest.position.x = 10 => undefined.x = 10; 

将抛出错误。

在您的第一个示例中, 巴比伦。SceneLoader.ImportMesh 是一个同步函数,尽管在 BABYLON 中还有另一个函数名称 ImportMeshAsync。场景加载器...

我以前没有使用过巴比伦。
但基本上,根据BABYLON API,ImportMesh和ImportMeshAsync之间的区别在于返回的类型。

所以

[改进]

在成功回调中移动carTest.position.x = 10;

BABYLON
.SceneLoader
.ImportMesh("", "assets/", "car.obj", scene, function(object) {
carTest = object[0];
carTest.position.x = 10;
});

当调用 SceneLoader 时,仅在返回 onlyne (函数( 时设置 carTest 对象,则对象在下一行中没有准备就绪(carTest 此时不存在(。

您需要等待在场景加载器完成后使用 carTest 对象。

简短的回答是; 您需要等到网格加载完毕后才能开始使用它。一个简单的方法是等待几秒钟:

var carTest;
BABYLON
.SceneLoader
.ImportMesh("", "assets/", "car.obj", scene, function(object) {
carTest = object[0];
});
function moveCar(){
carTest.position.x = 10;
}
setTimeout(moveCar,2000);

更长的答案是Javascript是异步的,这意味着它不会等待一条指令完成,然后再进入下一条指令。在您的示例中,它开始加载 car.obj,但在完成之前,它会移动到下一条指令并开始尝试设置位置 - 它无法做到这一点,因为它尚未完成加载,因此出现错误。

我的"setTimeout"解决方案很容易理解,但不是很优雅。更好的解决方案是使用提供的回调函数来触发处理网格的代码,因为这只会在加载模型后运行。

var carTest;
BABYLON
.SceneLoader
.ImportMesh("", "assets/", "car.obj", scene, function(object) {
carTest = object[0];
startCar();
});
function startCar(){
carTest.position.x = 10;
}

最好的解决方案是正确掌握异步编程范式,了解"Javascript Promises"并使用BABYLON。SceneLoader.ImportMeshAsync 由 Thomas Wenger 建议。

最新更新