首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >隐藏特定相机的对象

隐藏特定相机的对象
EN

Stack Overflow用户
提问于 2021-05-06 05:09:33
回答 1查看 231关注 0票数 1

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

EN

回答 1

Stack Overflow用户

发布于 2021-05-06 09:22:22

邻近淡入淡出

可能不是您想要的,但为了完整起见,我会提及它。

默认材质具有接近淡入淡出和距离淡入淡出,如果材质离摄影机太近或太远,可以分别使用它们来使材质消失。

重要的是要注意,这不是一个剔除平面,淡入淡出是渐进的。

因此,使用接近淡入淡出可以使摄影机附近的对象显示为半透明。

使用可见层和消隐蒙版

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

每个VisualInstance (你知道,所有在3D中可见的东西)都有layers。而且每个Camera都有一个cull_mask。如果Cameracull_mask不包括VisualInstance的任何layers,则Camera看不到该VisualInstance

没有layersVisualInstance不会在任何Camera上显示,即使Cameracull_mask中包含所有layers (这是默认设置)。

您可以编辑摄影机的cull_mask以不包括VisualInstancelayers,也可以编辑VisualInstancelayers,或者同时编辑两者。

使用自定义着色器消隐平面

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

您可以使用自定义空间着色器根据平面裁剪对象。

你需要将飞机定义为制服。对于这个答案,我将使用point-normal definition of a plane

代码语言:javascript
复制
n·(r - r_0)

这就是:

代码语言:javascript
复制
dot(plane_normal, (world_position - plane_point)

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

代码语言:javascript
复制
uniform vec3 plane_normal;
uniform vec3 plane_point;

plane_normal告诉我们平面的方向,而plane_point是平面上的一个点,我们可以用它来定位它。

然后使用这个逻辑:

代码语言:javascript
复制
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;也不能解决这个问题,因为其他的传递都可以写入片段。因此,您将需要修改您的材料以包括这一点。

此外,可悲的是,Godot3.x不支持全球统一(参见Godot 4.0 gets global and per-instance shader uniforms)。这意味着您必须在需要它们的任何地方设置这些参数。

使用构造性实体几何(CSG)

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

例如,您可以添加一个operation设置为"Subtraction"CSGSphere,并使用Camera移动它(为此,我建议添加一个RemoteTransform节点作为Camera的子节点,并将其远程路径设置为CSGSphere)。

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

注意:当前在Godot3.3CSG节点上不支持烘焙灯光。这是一种回归。请参阅:Unable to bake lightmap with CSG due to the lack of ability to generate UV2 for CSG nodes

门户网站,实际上

Bartleby Lawnjelly为Godot3.x提供了一个门户(godot-lportal)模块。

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

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

希望有一个视频能让这更有意义。这是一个有点老的概念,但很容易理解:Portal rendering module in Godot 3.2 - Improved performance。看到视频里的影子大便了吗?Bartleby Lawnjelly也有一个自定义的光照映射器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67408766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档