Three.js 更改加载的模型的位置 异步加载

进度一点点前进,外部模型这一方面已经是实现模型的加载,模型的动画的播放控制了,接下来的一步是通过代码去控制加载好的模型的“动画”,这个动画是指简单的移动、旋转、缩放之类,提前准备的时候是用了一个threejs创建的Cube,把它作为一个全局变量,在animate()直接进行修改position属性,是很简单就实现了,开始用同样的方法去给到加载好的模型,然后就出现了一个困扰了我一天多的问题,chrome控制台给出的错误就是,我不能去更改一个undefined的位置属性,怎么就未定义了呢?我明明获取了呀,而且,我在控制台去输入scene.getObjectByName(“train”)是找得到这个模型物体的
chrome console
通过在网上查问题,自己去问问题别人给的建议,虽然没有见到具体方案,但是异步同步这两个词,已经被我看到了很多次了,今天我才认定下来,问题的原因是,加载模型的 loader.load()是异步的,而我的animate()是同步的,异步我是这么理解的,.js代码是一行一行的,你可以随意调整相机、轨道控制、场景、模型加载这些东西初始化的代码(当然为了都添加到scene,scene应该靠前),运行时也可以看到,不同模型出现的时间不同,但是这并没有却决于它们在代码中load的顺序,如果不是异步,把一个很大的模型load的顺序放在最前面,那么后面的东西就得等这个很大的模型加载完成才能开始加载,那样用户体验很不好,所以,矛盾就在与loader.load和animate这两个方法,animate是更新场景的方法,每一帧执行一次,它是同步的,它执行时,异步的load还没有加载好模型,当然应该是undefined。
我最开始的解决办法是更换加载方式(受了哪个回答的影响,然后并没用,不过我学到了新的东西),

`	loader.load( 'models/train/train2.fbx', function ( obj ) {     //路径
		obj.traverse( function ( child ) {
			 if ( child.isMesh ) {
				child.castShadow = true;
				child.receiveShadow = true;
			}
		} );
		obj.scale.set(0.03,0.03,0.03);
		obj.position.set(-150,-2,200);
		obj.name="train";
		scene.add( obj );
	}

这是我最开始的加载模型的代码,比较简单,然后我更换了一个先把manager创建好的方式,这个方法可以实现的是,对于要加载的所有东西,你知道加载到什么程度了,通过各种参数,这个就不详细说了;
然后今天我坚定了错误的原因是异步同步,我就开始去找js的异步同步实现,总体的解决方案是,(还是上面的加载代码)先去执行这个异步的load,load执行完成之后才去获取这个加载好的模型,当然要提前var一个全局变量,在回调中把模型赋值给它,这样之后,在animate中,添加一段

if(train)
	train.position.z++;

这样一来,train这个全局变量被成功赋值之后,也就是获取到了加载的模型之后,再在每一帧去把它的z位置加1,这样在网页看到的就是它在移动。
最后再贴一下异步的代码:

var p =new Promise(function(resolve,reject){
	setTimeout(function(){
			console.log("开始loadTrain");
			loader.load( 'models/train/train2.fbx', function ( obj ) {
				obj.traverse( function ( child ) {
				if ( child.isMesh ) {
					child.castShadow = true;
					child.receiveShadow = true;
				}
			} );
			obj.scale.set(0.03,0.03,0.03);
			obj.position.set(-150,-2,200);
			obj.name="train";
			scene.add( obj );

			resolve(obj);//传递obj给then中function的参数m
		});},500);
	});

	p.then(function(m){
		console.log("在回调中获取火车");
		console.log(m);
		train=m;//获取火车给全局变量train
	});
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值