首页 > 解决方案 > 隐藏特定相机的对象

问题描述

我使用 godot 来创建我的 3d 游戏。我在使用相机视口渲染到纹理创建门户时遇到了问题。问题是相机捕捉到了门户后面的不必要的对象。我通过将相机的参数“near”设置为从相机本身到门户的距离部分解决了这个问题,但是门户后面的部分开始被切断。问题是,是否可以隐藏特定相机的对象以便其他相机可以看到它们?也许还有另一种方法可以做到这一点,例如通过创建静态剪裁平面?

标签: cameragodot

解决方案



接近淡入淡出

可能不是你要找的东西,但为了完整起见,我会提到它。

默认材质有接近淡入淡出和距离淡入淡出,您可以使用它们分别使材质离相机太近或太远时消失。

重要的是要注意这不是一个剔除平面,并且衰落是渐进的。

因此,使用接近淡入淡出您可以使相机附近的物体看起来是半透明的。


使用可见性图层和剔除蒙版

是否可以隐藏特定相机的对象以便其他相机可以看到它们?

每个VisualInstance(你知道,所有在 3D 中可见的东西)都有layers. 并且每个Camera都有一个cull_mask. 如果cull_maskof theCamera不包含任何 of layersa VisualInstance,那么 theCamera看不到那个VisualInstance

VisualInstance带有 no的 Alayers不会显示在 no 上Camera,即使其中Camera包含所有的layerscull_mask这是默认设置)。

您可以编辑cull_mask相机的 以不包含 的layersVisualInstance或编辑 的layersVisualInstance或两者兼而有之。


使用自定义着色器剔除平面

也许还有另一种方法可以做到这一点,例如通过创建静态剪裁平面?

您可以使用自定义空间着色器根据平面切割事物。

您需要将飞机定义为制服。对于这个答案,我将使用平面的点法线定义

n·(r - r_0)

那是:

dot(plane_normal, (world_position - plane_point)

因此,我们定义了 aplane_normalplane_point制服:

uniform vec3 plane_normal;
uniform vec3 plane_point;

plane_normal给我们平面的方向,而 是平面上plane_point的一个点,它允许我们定位它。

然后使用这个逻辑:

vec3 wold_position = (CAMERA_MATRIX * vec4(VERTEX, 1.0)).xyz;
ALPHA = clamp(sign(dot(plane_normal, wold_position - plane_point)), 0.0, 1.0);

这里我们将当前点的坐标转换到世界空间,然后使用平面的定义找到一侧的点(使用sign),并ALPHA以此为基础进行设置,使得平面一侧的所有东西都变得不可见。

注意:这不是定义平面的唯一方法。另一个流行的定义是 4D 向量,其中 xyz 是法线,w 是从平面到原点的距离。

可悲的是,我不认为有办法让这个工作与多个材质通道一起工作,因为ALPHA控制通道的混合,并且不会产生透明度。不,使用discard;也不能解决它,因为其他通道无论如何都可以写入片段。因此,您将需要修改您的材料以包含它。

更可悲的是,Godot 3.x 不支持全局统一(请参阅Godot 4.0 获取全局和每实例着色器统一)。这意味着您必须在需要它们的任何地方设置这些参数。


使用构造实体几何 (CSG)

添加一个CSGCombiner使需要与其他 CSG 节点一起消失的几何图形作为子节点。

然后,例如,您可以添加一个CSGSpherewith operationset to "Subtraction",并将其与 the 一起移动Camera(为此,我建议将一个RemoteTransform节点作为子节点添加到 theCamera并将其远程路径设置为 the CSGSphere)。

当然,它不一定是CSGSphere,您可以为此目的使用任何 CSG 节点。对于门户,我想您可以使用 aCSGBox并将其与门户平面对齐。

注意:目前在 Godot 3.3 CSG 节点上不支持烘焙灯。这是一种回归。请参阅:由于缺乏为 CSG 节点生成 UV2 的能力,无法使用 CSG 烘焙光照贴图


门户网站,实际上

Bartleby Lawnjelly 有一个适用于 Godot 3.x的门户 ( godot-lportal ) 模块。

作为一个模块,他们需要从源代码构建 Godot。请参阅Godot 官方文档上的编译。没那么糟糕,我保证。或者使用godot-titan 的build 。

我必须解释一下,这些门户不是 Valve Portal 视频游戏系列意义上的门户……该模块允许您将区域定义为“房间”,并将平面定义为连接这些房间的“门户”,这样您就可以从一个给对方。这样做的目的是剔除整个房间,除非您通过其中一个门户查看。

希望这对视频更有意义。这是一个有点旧的,但很好理解这个想法:Godot 3.2 中的门户渲染模块 - 改进的性能看到视频中的影子便便了吗?Bartleby Lawnjelly 还有一个自定义光照贴图器。


推荐阅读