camera - 隐藏特定相机的对象
问题描述
我使用 godot 来创建我的 3d 游戏。我在使用相机视口渲染到纹理创建门户时遇到了问题。问题是相机捕捉到了门户后面的不必要的对象。我通过将相机的参数“near”设置为从相机本身到门户的距离部分解决了这个问题,但是门户后面的部分开始被切断。问题是,是否可以隐藏特定相机的对象以便其他相机可以看到它们?也许还有另一种方法可以做到这一点,例如通过创建静态剪裁平面?
解决方案
接近淡入淡出
可能不是你要找的东西,但为了完整起见,我会提到它。
默认材质有接近淡入淡出和距离淡入淡出,您可以使用它们分别使材质离相机太近或太远时消失。
重要的是要注意这不是一个剔除平面,并且衰落是渐进的。
因此,使用接近淡入淡出您可以使相机附近的物体看起来是半透明的。
使用可见性图层和剔除蒙版
是否可以隐藏特定相机的对象以便其他相机可以看到它们?
每个VisualInstance
(你知道,所有在 3D 中可见的东西)都有layers
. 并且每个Camera
都有一个cull_mask
. 如果cull_mask
of theCamera
不包含任何 of layers
a VisualInstance
,那么 theCamera
看不到那个VisualInstance
。
VisualInstance
带有 no的 Alayers
不会显示在 no 上Camera
,即使其中Camera
包含所有的layers
(cull_mask
这是默认设置)。
您可以编辑cull_mask
相机的 以不包含 的layers
,VisualInstance
或编辑 的layers
,VisualInstance
或两者兼而有之。
使用自定义着色器剔除平面
也许还有另一种方法可以做到这一点,例如通过创建静态剪裁平面?
您可以使用自定义空间着色器根据平面切割事物。
您需要将飞机定义为制服。对于这个答案,我将使用平面的点法线定义:
n·(r - r_0)
那是:
dot(plane_normal, (world_position - plane_point)
因此,我们定义了 aplane_normal
和plane_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 节点一起消失的几何图形作为子节点。
然后,例如,您可以添加一个CSGSphere
with operation
set 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 还有一个自定义光照贴图器。
推荐阅读
- node.js - GitHub Action 无法构建 firebase 应用程序 w9jds/firebase-action
- mysql - LOAD DATA INFILE 将外键读取为逗号
- java - Spring Boot 集中日志记录 ELK
- node.js - 从终端安装 nodemon 时出错?实际上我在更新 Nodejs 时也遇到了同样的问题
- reactjs - 如何使用 Firebase 并做出反应以创建所有用户都可以访问的静态信息?
- javascript - 按钮将数据保存在 .txt 文件中并擦除其中的旧数据
- angular - formGroup.getRawValue() 以角度引发错误
- javascript - CryptoJS.enc.Hex.parse(hash) 做什么,以及如何在 Java 中复制它?
- javascript - 不允许在 jQuery 中选择超过 'n'
- ios - 围绕中心快速旋转动画