首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何告诉tween.js等待纹理在three.js中显示

如何告诉tween.js等待纹理在three.js中显示
EN

Stack Overflow用户
提问于 2015-11-17 21:01:58
回答 1查看 484关注 0票数 0

我对three.js和tween.js的组合有问题。问题是,tween.js动画的计时器在球体的纹理显示之前就开始了。

我正在用火狐的three.js构建一个全景查看器。全景图像映射到球体,摄影机位于球体的中心。可以更改显示的全景图以虚拟访问不同的房间(这是通过将具有不同纹理的不同球体变为可见来实现的)。更改房间时,会使用tween.js为灯光设置动画,以使房间变暗。然后,灯再次亮起,并显示新的全景图像。

问题是,如果是第一次访问一个房间,它需要一些时间来显示图像。这是因为图像在显示之前没有加载到内存中。

如果在全景图完全加载到内存中并准备好显示之前,房间一直是黑暗的,那也不是什么坏事。但是tween.js的动画计时器在图像显示之前启动。

结果是,灯光不会像所需的那样通过动画缓慢打开,而是需要很短的时间来显示新的全景图,然后完全打开灯光,而不需要任何动画。动画的持续时间设置为500毫秒,显示全景图像所需的时间大致相同。

我的问题是,有没有办法知道纹理是什么时候渲染的?这样我就可以在显示图像时触发动画了?

Three.js版本为r71。

代码语言:javascript
复制
//after light turns dark, the panorama is changed and light goes up again
tweenDarkenLight.onComplete( function() { 

  roomModule.setRoomVisible(); //sets new room visible

  tweenEnhanceLight.start(); //start of animation to enlighten the scene
});

当应用程序启动时,所有房间/全景图的纹理都会加载并附加到球体上。但是在用户选择它们中的一个之前,它们中的每一个都是不可改变的。

代码语言:javascript
复制
texture = new THREE.Texture();

loader = new THREE.ImageLoader( manager );

//the url for each panorama is stored in roomAssetArray
loader.load( roomAssetArray.panorama, 

  function ( image ) {

  texture.image = image;
  texture.needsUpdate = true;
});
EN

回答 1

Stack Overflow用户

发布于 2015-11-17 21:37:41

您需要将您的房间可见性代码与tween.start()代码绑定在一起。

我假设您在代码中的某个地方调用了loadTexture()。它的第三个参数是一个回调,它在纹理成功加载时被调用。所以我会做一些如下的事情:

代码语言:javascript
复制
texture = THREE.ImageUtils.loadTexture( "room.jpg", {}, function() {
    // room texture has been loaded

    // do the tween
}

更新

另一种选择是在补间之前或代码之后添加渲染调用,以更改球体的可见性。这样至少会有一次通过纹理几何体的过程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33757640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档