Three.js - object.visible = true,不立即显示

时间:2016-01-05 16:04:44

标签: javascript three.js

我使用对象上的.visible属性隐藏和取消隐藏Three.js场景的各个部分。

默认情况下,某些对象(会议室)的.visible属性为false。当摄像机位于某个网格(房间边界框)内时,.visible属性设置为true,房间就会出现。

但是在将.visible属性设置为true并且房间实际呈现后似乎有延迟(秒或更短)。进入房间不止一次后,这种延迟会缩短。

这种延迟的原因是什么?有没有办法知道房间何时或是否准备好渲染?将.visible属性设置为true后,似乎没有触发更新事件,因此倾听那些不会有帮助。

我感谢任何帮助,

电贺!

修改

因为我无法使用ColladaLoader2.js我决定简单地遍历加载了ColladaLoader.js的模型,并使用现有{BufferGeometry副本替换所有几何属性1}}对象。之后我发现将现有Geometry对象的.dynamic属性设置为false似乎具有相同的效果。

Geometry

现在,当我将对象的dae.traverse(function (obj) { if (obj.hasOwnProperty('geometry')) { obj.dynamic = false; //obj.geometry = new THREE.BufferGeometry().fromGeometry(obj.geometry); } });属性设置为.visible时,引擎会冻结一段时间,而不是在对象变为可见之前提到的延迟。现在我必须决定我想要冻结的地方,因为我不认为出于性能原因可以同时看到所有对象。

如果对象及其几何图形已加载并准备好被查看,或者是否需要将其重新加载到内存中,那么可以获得更多控制和信息。现在,当true设置为BufferGeometry或发生短暂冻结时,.visible是否会立即显示,现在还不清楚。

2 个答案:

答案 0 :(得分:1)

在呈现之前,

Geometry需要转换为BufferGeometry。如果mesh.visiblefalse,则不会进行此转换。如果几何图形复杂,或者有很多几何要转换,转换可能需要一些时间。

解决方法是使用BufferGeometry创建网格。

var bufferGeometry = new THREE.BufferGeometry().fromGeometry( geometry );
var mesh = new THREE.Mesh( bufferGeometry, material );

three.js r.73

答案 1 :(得分:0)

在我的代码中,当对象首次切换为可见时,我看到同样的事情,但是后面的可见真/假之间的切换似乎不会导致另一个延迟。

因此,一个workround将在每个对象上设置可见标志,并在浏览器上未显示WebGLRenderer时呈现所有内容(例如,当它位于关卡加载屏幕后),然后根据您的需要将对象设置为适当的标志在显示屏幕之前...现在应该没有延迟,因为你可以将它们切换为可见。