【问题标题】:THREE.Object3D : How to disable Raycast for Object, not Material?THREE.Object3D:如何禁用对象的光线投射,而不是材质?
【发布时间】:2019-06-15 01:16:41
【问题描述】:

所以常识似乎是将对象的材质可见性设置为false。

所以当我有无数个共享相同材质的对象时,这不起作用。但我想根据他们的数据禁用其中一些。

Object.visible = false;

我可以隐藏它们,但它们仍然可以选择。

Object.Material.visible = false

隐藏所有对象,因为它们的共享材质设置为不可见。

这个可以吗?

我没有创建那些对象,所以没有机会创建多种材质。我只能使用我获得的共享相同材质且需要隐藏的对象

【问题讨论】:

  • 查看源似乎(物体或材料的)可见性不会影响光线投射。根据您的最终目标,您可以向对象添加自定义字段,然后在光线投射后过滤交叉点,或者维护一个单独的对象列表,您知道您将要针对这些对象进行光线投射。

标签: three.js


【解决方案1】:

解决方案 1:手动过滤 raycast 候选者和结果

看起来没有任何内置字段可以实现您想要的,但您应该能够通过手动过滤要进行光线投射的对象列表来实现类似的行为。以下是您如何做到这一点的想法:

// scene with lots of nested objects
const scene, raycaster;

// ...

// Gather up which objects to try to raycast against based on
// a set of conditions
const raycastList = [];
scene.traverse(c => {
    if (c.isMesh && !c.disableRaycast) {
        raycastList.push(c);
    }
});

// raycast against only the items in the array
const intersections = raycaster.raycastObjects(raycastList);

如果您想基于网格父母disableRaycastfield 进行过滤,那么您可以创建一个自定义遍历函数,让您跟踪父母禁用状态及早停止遍历。

如果您已经提前知道应该或不应该对哪些对象进行光线投射,您可以预先创建该列表并保留它。

编辑

解决方案 2:覆盖并制作自定义 Mesh.raycast() 函数

如果您无权修改光线投射代码,那么您可以创建一个“DeactivateableRaycastMesh”类来实现自定义光线投射方法,并允许您启用或禁用它是否返回光线投射命中。

class DeactivateableRaycastMesh extends THREE.Mesh {

    constructor(...args) {
        super(...args);
        this.raycastEnabled = true;
    }

    raycast(...args) {
        if (!this.raycastEnabled) return;
        super.raycast(...args);
    }

}

如果您在每个 网格上都需要此功能,而不仅仅是您创建的网格,那么您可以修改THREE.Mesh.prototype 以将上述功能添加到所有网格。但是不建议这样做。

const originalRaycast = THREE.Mesh.prototype.raycast;
THREE.Mesh.prototype.raycast = function(...args) {
    if (!this.raycastEnabled) return;
    originalRaycast.call(this, ...args);
}

【讨论】:

  • 我无权访问这个。我可以改变场景图中的现有对象!
  • 无法访问我的意思是我没有在我的代码库中调用 raycaster。我正在尝试基于三个更改现有应用程序的场景。但是 disableRaycast 听起来可能很有趣!
  • 如果您不必修改光线投射逻辑,那么您可以查看我在上面编辑的帖子中包含的第二个解决方案,它应该可以提供您正在谈论的行为。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 2020-03-13
  • 2016-09-20
  • 1970-01-01
相关资源
最近更新 更多