我只是无法访问巴比伦网格。 每次我尝试运行代码时,我都会得到这个 错误。
我尝试了两种不同的方法:
示例 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 建议。