使用顶点着色器修改网格的顶点不会更改其BufferGeometry属性,并且会导致光线投射器不准确

时间:2019-02-17 08:51:24

标签: three.js

[使用JSFiddle here更新了] 如果您将鼠标悬停在平面之外,光线投射器仍会认为它悬停在对象上,因为我们修改了顶点着色器中的z位置

对于我的项目,我有一个需要平面悬停效果的平面轮播(PlaneBufferGeometry和ShaderMaterial)。

但是,我处于一种状态,即通过在顶点着色器中为每个顶点的z坐标设置动画来缩小平面。在这种状态下,我使用THREE.Raycaster的悬停效果被破坏了,因为BufferGeom数组中的位置未更新,因此Raycaster仍使用与原始大小的平面相同的uvs。

我已经尝试在顶点着色器运行之后为每个平面p调用以下函数:

p.frustrumCulled = false;
p.geometry.verticesNeedUpdate = true;
p.geometry.normalsNeedUpdate = true;
p.geometry.computeBoundingBox();
p.geometry.computeBoundingSphere();
p.geometry.computeFaceNormals();
p.geometry.computeVertexNormals();
p.geometry.attributes.position.needsUpdate = true;

我还知道,如果仅使用THREE.Mesh内置的scale缩放每个平面,就可以正确地发出uv光线,但是我不能这样做,因为有一个特定的动画我只能实现使用顶点着色器。

1 个答案:

答案 0 :(得分:1)

射线广播发生在CPU上。如果要(通过顶点着色器)在GPU上放置顶点,光线投射将无法正常工作,因为无法在交集测试中使用转换后的顶点。

您现在有两个选择。在执行光线投射之前,可以在CPU而不是GPU上应用转换。另一种选择是使用不同的方法(例如GPU拾取)来检测与3D对象的交互。