Three.js Ray忽略透明像素

时间:2014-09-01 02:00:00

标签: javascript 3d three.js

我有一些Vector3ds包含使用透明png作为材料的平面几何形状。

我遇到的麻烦是Raycaster正在拾取整个物体,因此点击材料附近足以激活相应的功能。

是否可以从raycaster中隐藏网格的透明部分?

除了Alex的帮助外,我还得到了对象的实际观点。

我现在如何将其转换为图像上的像素,以测试透明度?

1 个答案:

答案 0 :(得分:4)

我不熟悉Three.js,但online documentation告诉我,Raycast算法是根据空间中对象的分布计算的,而不是基于它们的构成。在这方面,我认为告知 Raycast没有任何具体方法,我们只想测试不透明的像素。

我想首先,使用Three.js的{​​{1}}来分析你的哪些物体与光线的空间扩展大致相撞。过滤对象后,您需要执行特定测试以确定光线是否与不透明像素碰撞。

这样做的一种简单方法是采用我们保证与光线碰撞的物体,并确定光线穿过物体时的中心位置。 (这将增加不复杂性,具体取决于您的对象是否可以缩放,或者您的对象/光线是否可以旋转。)3D空间中光线的交点的绝对位置可以使用三角函数找到,这需要考虑对于光线的Raycast.intersectObjects(pObjects, pRecursive)near值。

通过了解图像的位置和尺寸,您可以将3D世界中光线投影交点的坐标转换为相对于您正在使用的图像的离散2D坐标。

作为一个例子,想象一个简单的2D案例。如果您在原点处有50px²图像,并且光线与位置(25,25)处的图像相交,则可以使用此信息来索引像素数据阵列并测试像素的Alpha值。由于PNG图像数据存储RGBA数据,因此您需要查看每个像素四个字节。因此,您需要一个类似于下面示例的实现,因为图像数据是连续存储的。

far

找到像素数据区域后,可以测试字母字节以确定它们是不透明(0xFF)还是透明(0x00)。您可以使用它来确定光线投射是否已成功与您的对象发生碰撞。