2012-11-09 51 views
6

在Three.js中,网格总是呈现在场景的顶部,即使它的位置在所有对象后面吗?我正在使用网格实现套索选择,并且需要在场景的其余部分上渲染选择框。Three.js - 在另一个顶部的几何

回答

19

是的。

首先做到这一点:

renderer.autoClear = false; 

然后创建一个包含只是要在最前面的对象第二场景。然后,在你渲染循环:

renderer.clear();      // clear buffers 
renderer.render(scene, camera);  // render scene 1 
renderer.clearDepth();    // clear depth buffer 
renderer.render(scene2, camera); // render scene 2 

编辑:另一个解决方案是只有一个场景,但使用这种模式:

mesh.renderOrder = 999; 
mesh.onBeforeRender = function(renderer) { renderer.clearDepth(); }; 

如果网具有单一材料,它会呈现“顶部”。

three.js所r.85

+1

这是唯一的方法吗?我试图通过mesh.renderDepth,material.depthTest和material.depthWrite达到同样的效果,但无济于事。 – Andrew

+0

@Andrew如果您有任何问题,请发邮件。 – WestLangley

+0

@Andrew现在试图做同样的事情,看着http://stackoverflow.com/questions/16247280/force-a-sprite-object-to-always-be-in-front-of-skydome-object-in -three-js – sixFingers

0

如果你想渲染只有一个正面目,您还可以通过该对象的材料设置depthTestfalse管理:

var onTopMaterial = new THREE.MeshStandardMaterial({ 
    color: 'red', 
    depthTest: false 
}); 

mesh.material = onTopMaterial; 

检查一个示范开始在this fiddle


注:请确保您有renderer.sortObjects设置为默认值true值。

+0

这不是一个好主意。有许多陷阱。首先,在蓝色立方体上设置'transparent:true'。但最大的问题是,通过设置'depthTest = false',所谓的“顶部网格”将不再对其自身进行深度测试,这会导致渲染伪像。 – WestLangley

+0

@WestLangley感谢您的反馈。它与透明设置冲突在我的情况下是可以接受的,但对于我不确定的工件。我如何测试这个?我只需要暂时将一个对象放在'mouseover'上的所有其他对象的前面,然后回到'mousout'上。在我看来,暂时将它添加到不同的场景在这种情况下是不可取的。 – Wilt

+0

我会在接受的答案中遵循该方法,除非您的用例非常有限。 – WestLangley