我使用对象上的.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
是否会立即显示,现在还不清楚。
答案 0 :(得分:1)
Geometry
需要转换为BufferGeometry
。如果mesh.visible
为false
,则不会进行此转换。如果几何图形复杂,或者有很多几何要转换,转换可能需要一些时间。
解决方法是使用BufferGeometry
创建网格。
var bufferGeometry = new THREE.BufferGeometry().fromGeometry( geometry );
var mesh = new THREE.Mesh( bufferGeometry, material );
three.js r.73
答案 1 :(得分:0)
在我的代码中,当对象首次切换为可见时,我看到同样的事情,但是后面的可见真/假之间的切换似乎不会导致另一个延迟。
因此,一个workround将在每个对象上设置可见标志,并在浏览器上未显示WebGLRenderer时呈现所有内容(例如,当它位于关卡加载屏幕后),然后根据您的需要将对象设置为适当的标志在显示屏幕之前...现在应该没有延迟,因为你可以将它们切换为可见。