Areaportal

From Valve Developer Community
< Zh
Revision as of 06:19, 20 May 2025 by Nesciuse (talk | contribs) (Setting bug notice hidetested=1 param on page where the bug might not need tested in param specified)
Jump to navigation Jump to search
English (en)Español (es)Русский (ru)中文 (zh)Translate (Translate)
Toolsareaportal.gif
一个打开的 Areaportal (绿色轮廓)。
一个关闭的 Areaportal。

Areaportal 是一个笔刷(固体)实体(en),func_areaportal(en),func_areaportalwindow(en),可以用来"密封"两个单独的可见性分支区域(en)和控制可见性。

Areaportal 有两个不同的目的:剔除几何体并从渲染中移除整个区域。

Areaportal 就像是打开或关闭的门。当 Areaportal 关闭时,它阻挡在后部分区域的几何图形和其它物体的可见性。当它打开时,几何体将再次可见。 Areaportal 可以在引擎运行时动态打开和关闭。它们通常被设置为使用实体 I/O 系统(en)或通过与(en)实体的链接从一系列trigger_multiple(en)笔刷打开和关闭。

属性

trigger_multiple 可用于打开和关闭 Areaportal 以及隐藏的关卡区域。

对于 Areaportal 而言:

  • 绑定到了func_areaportal(en)实体上。
  • 必须仅由一个固体构成。绑定了多个固体的 Areaportal 实体在 vbsp(en) 编译时会产生错误。
  • 必须使用应用于 Areaportal 固体的所有面的tools\toolsareaportal纹理。
  • 不能包含置换表层(en),如果包含会产生 vbsp 错误。
  • 必须用于密封它们连接的所有区域,以避免泄露(en)
  • 是有体积的,而不是单个表面。尽管 Areaportal 可以是任意大小,但通常它们由与它们连接的区域(门口)大小相同的细节笔刷构成。
  • 在 Areaportal 体积的大小生成一个新的可见性分支区域(en)
  • 可以根据输入与输出(en)或通过将它们附加到门实体来设置打开或关闭。

areaportal_window

func_areaportalwindow(en)实体表现得像一个标准的 Areaportal,如果玩家移动到了指定的距离,则开始淡出和关闭。这避免了 Areaportal 突然弹出式地打开。


——————
① vbsp:VBSP 是将原始 VMF 文件编译为二元空间划分格式(BSP)。
② 表层位移:指玩家所说的地形。
③ 泄露:导致地图与地图之外的虚空相连的一个口。会导致地图无法编译。

Areaportal 在地图编辑中的实现

Areaportal 的基本构造。
  1. 使用单个固体(en)实体创建 Areaportal 的体积,(并用它)完全密封你想控制的两个区域之间的空间。(如有必要,多个 Areaportal 可以一起执行此操作。不要给任何一个 Areaportal 实体提供六条以上的边。)
  2. 如果 Areaportal 像门口一样连接两个区域,则让 Areaportal 的固体大小为这个门口的大小,并且其厚度与其连接的墙壁(的厚度)相同。如果区域是开放区域,例如室外部分,则厚度可以是任意大小(典型的网格大小为 8、16、32 等)。
  3. tools\toolsareaportal材质应用到笔刷的所有面。
  4. 将画笔绑定(en)func_areaportal(en)func_areaportalwindow(en) 实体。
  5. 设置 Initial State(初始状态)键值,以便它不会在不应该阻止可见性时关闭。如果你想把它链接到一个命名的门,将 Areaportal 的 Initial State 键值设置为与门相同的初始状态,并将门的名称填入 Areaportal 的键值 Name of Linked Door(链接的门的名称)中。当门关闭时,Areaportal 的 Initial State 也应为关闭,反之亦然。
Placementtip.gif 放置提示: 将 Areaportal 链接到命名门时,请确保它比门模型本身更薄,以确保后者在关闭时会被渲染。


——————
① 多个 Areaportal 可以一起执行此操作:就是可以用几个 Areaportal 密封泄露口。
②“不要给任何一个 Areaportal”一句:原文为:Avoid giving more than six sides to any single areaportal entity.

性能影响

在引擎运行时的 Areaportal 的线框的渲染。(引擎)仅渲染通过 Areaportal 看到的处于可见性叶子块中的世界几何体。 与没有 Areaportal 时相同的场景。连接的可见性叶子块中的所有几何体都被渲染。

打开的 Areaportal (无论它们总是打开还是触发打开)通过看这个 Areaportal 可以知道(它)具有剔除几何体的行为。这跟透过房子的敞开窗户看一样,只有通过 Areaportal 直接可以被看到的可见性叶子块(en)会被引擎渲染。通过这种方法,下一个区域中的几何体被粗略地“剔除”到 Areaportal 的大小,减少了渲染的几何体数量,并提高了性能。最重要的是,模型(道具)几何体根本不会被渲染,除非模型的一部分通过区域门户的视锥体(view frustum)(或可见角度)直接可见。这让处于打开状态的 Areaportal 对于控制模型几何图形的可见性非常有用。

一个打开的 Areaportal 会严格剔除模型的可见性。

由于这些性能优势, Areaportal 通常在始终打开(always-open)状态下使用。通过将func_areaportal(en)实体上的“Initial State(初始状态)”键值设置为“打开”来创建始终打开的 Areaportal。始终打开的 Areaportal 用于通往包含大量视觉和几何形状的其他区域的开口。例如,简单地在走廊的尽头放置一个始终打开的 Areaportal,通向更广阔的空间,可以产生显著的性能提升。当玩家在里面时,从门口向外看,(引擎)只会绘制通过门口直接可见的每片叶子中的几何图形。

过度使用

必须小心避免同时可见太多的 Areaportal。每个都有处理成本,如果 Areaportal 没有剔除足够的细节,没有它们的场景绘制速度会更快!

Areaportal 不会在已编译的地图中形成笔刷,因此不会计入笔刷块的大小限制。当你拥有非常完整的 BSP 并使用大量提示时,会很有用。


——————
① 剔除:这里指看不到的部分不会被渲染,即从渲染中剔除掉看不到的部分。
② 可见:可以被看见。
③ 叶子:在起源引擎中一般指“可见分支区域”,英文为“(vis)leaf”“(vis)leaves(pl.)”。详情请参阅该条目(en)

编译

Areaportal 泄漏(左)和完全密封区域(右)的俯视图。

重要的是,Areaportal 应该封锁的任何区域都不要彼此泄漏(en)。与常规泄漏一样,只有当地图的一个区域完全被世界(非实体)固体(Areaportal 笔刷除外)包围且没有空隙时,才认为该地图区域与另一个区域是密封的。如果区域有多种连接的路线,则每条路线的出入口都必须放置一个 Areaportal。

想象一个装满水的鱼缸两侧有几个孔可能会有所帮助你理解。一个 Areaportal 必须填补这些漏洞中的每一个,否则该区域将泄漏,由 vbsp(en) 产生 leak(en) 错误。

必须使用 Areaportal 来密封该区域的每个入口。func_detail 笔刷(en)、半透明纹理和表层位移(en)无法封闭区域,并且会产生泄漏,从而阻止地图运行。如果编译器仍然可以在任何一个 Areaportal 的两个主要表面之间找到​​一条路,它将报告 Areaportal 泄漏。

识别编译错误

Areaportal 编译错误由 VBSP(en) 输出。如果发生泄漏,你将看到:

Brush <brush number>: areaportal brush doesn't touch two areas
done

这些错误消息有时不像正常的泄漏(en)错误消息那样容易发现,但是当涉及到在地图中定位泄漏时,vbsp 会生成一个点文件来帮助你,就像常规几何泄漏一样。

Icon-Bug.png错误:如果你的地图中没有实体,例如 info_player_start,Areaportal (以及地图的其余部分)将造成异常泄漏。要解决此问题,请确保你的地图中至少有一种实体。
Tip.png提示:glview(en) 应用程序可用于显示 Areaportal, 如绘制为灰色表面。

Areaportal 和水

在水中搭建 Areaportal 时,必须使用两个独立的 Areaportal。

使用 Areaportal 的另一个棘手方面是它们不允许跨越水边界,如水面。要在水中搭建 Areaportal,你需要将 Portal 分成两部分——一个 Areaportal 在水面上方,另一个 Areaportal 位于水面下方——以便它们都在水面相遇。

合并

出于优化原因,引擎会自动合并共享同一平面(对齐)的 Areaportal。如果不需要这种行为,只需确保 Areaportal 笔刷不在同一平面上。这通常很简单,只需在编辑器中稍微缩小或移动一个 Areaportal,使其不再对齐。即使是一个网格单位也足以避免自动合并。

Tip.png提示:你可以使用r_DrawPortals 1控制台命令查看引擎中是否正在合并 Areaportal。

穿过区域查看

一和叶二之间的可见性不受影响。

Areaportal 只在它们封闭的区域之间进行剔除。根据右图思考:虽然建筑物的内容如你所料被剔除,但第一和第二个可视性分支区域(en)之间的可见性不受影响,因为它们通过建筑物的侧面相互连接。

这可以通过在建筑物的两侧创建另外两个 Areaportal 来解决。


——————
① 可视叶:可见性叶子块。
② 叶:叶子块,同上。

控制台命令

你可以使用一些特定于 Areaportal 的控制台(en)变量在游戏中调试和测试 Areaportal:

r_DrawPortals 0/1
当设置为“1”时,以绿色渲染出任何 Areaportal 的表面边界(两个区域之间)。有时不止一个 Areaportal 被压缩成一个。如果属于它的 Areaportal 是打开的,还会绘制第二个绿色边框,显示另一侧的可见性被切割后的内容。
mat_wireframe 0/1/2/3
以线框模式绘制几何图形,可以轻松查看地图中 Areaportal 的效果。在调试 Areaportal 时,你通常应该将 mat_wireframe 设置为“1”或“2”,因为“3”设置可以隐藏实际渲染的几何体。
r_portalscloseall 0/1
将此设置为“1”会强制关闭所有 Areaportal (因此它们无法打开)。覆盖r_portalsopenall 1。(如果没有效果,请重试此操作。它可以告诉你问题是否只是 Areaportal 没有正确关闭。)
Note.png注意:此命令不存在于:军团要塞2 反恐精英:全球攻势
r_portalsopenall 0/1
将此设置为“1”会强制所有区域门户打开(因此它们无法关闭)。
Tip.png提示:使用BindToggle控制台命令允许使用单个键来切换控制台变量。

在多人游戏中

Areaportal 在多人游戏中非常有用。它们的创建与单人游戏中的相同,但它们的功能和用法略有不同。由于游戏服务器中有多个玩家,因此对 Areaportal 何时打开的控制较少,并且需要针对最坏情况场景(即所有可见 Areaportal 都打开时)优化关卡性能。因此,在大多数情况下,最常放置“始终打开”的 Areaportal,其次是与门链接的 Areaportal,然后是由触发器控制的 Areaportal。在最坏的情况下,精心设计的“始终开放”Areaportal 将比旨在触发的门户提高性能。

Areaportal 窗户(en)也可用于多人游戏中的密封结构,但不太有用,因为它们会在竞争性多人游戏中造成游戏玩法不平衡。靠近 Areaportal 窗户的建筑物内的玩家可以看到外面的任何玩家,但外面较远的玩家将无法看到里面的玩家。


——————
① “始终打开”的 Areaportal:通过设置键值“Initial State”为“Open”并且没有任何实体I/O关联的 Areaportal 来实现。
② 触发器:一般指以“trigger_”开头的实体,通常是固实体。这类实体统一使用tools/toolstrigger纹理。

与遮挡器(occluder)的关系

Areaportal 类似于 Occluder(en),因为它们有助于控制可见性。它们之间的主要区别是:

  • Occluder 仅隐藏其背后的模型(道具)几何体。Areaportal 隐藏所有类型的对象。
  • Areaportal 必须完全密封区域(不允许出现泄漏(en)),而 Occluder 可以是独立的内部区域。
  • Occluder 的每个对象比开放的 Areaportal 更昂贵。
  • Occluder 可以根据屏幕区域控制它们将隐藏的对象的大小。
Note.png注意:Areaportal 和 Occluder 实体中的笔刷不应相互交叉(接触),如果交叉,它们将无法正常工作。

另请参阅


小作品

This article or section is a stub. You can help by expanding it.