Zh/Areaportal: Difference between revisions

From Valve Developer Community
< Zh
Jump to navigation Jump to search
mNo edit summary
m (Setting bug notice hidetested=1 param on page where the bug might not need tested in param specified)
 
(28 intermediate revisions by 7 users not shown)
Line 1: Line 1:
{{lang|Areaportal|title=Areaportal}}
{{LanguageBar}}
本页面的译者及最后翻译时间为[[User:1416006136|大康]] ([[User talk:1416006136|talk]]) 08:35, 13 November 2021 (PST)。部分内容由机器翻译。文章中的注释是译者添加的,分别位于二级标题内容的最末尾。
----
[[Image:areaportal_simple_open.jpg|200px|right|thumb|caption|一个打开的 Areaportal (绿色轮廓)。]][[Image:areaportal_simple_closed.jpg|200px|right|thumb|caption|一个关闭的 Areaportal。]]


''Areaportal'' 是一个[[brush entity|笔刷(固体)实体]],<code>[[func_areaportal]]</code>,<code>[[func_areaportalwindow]]</code>, 可以用来"密封"分割的[[visleaves|可见性叶子块]]和控制可见性。
[[File:Toolsareaportal.gif|left|link=]]
[[File:areaportal_simple_open.jpg|200px|right|thumb|caption|一个打开的 Areaportal (绿色轮廓)。]][[File:areaportal_simple_closed.jpg|200px|right|thumb|caption|一个关闭的 Areaportal。]]


Areaportal 有两个不同的目的:剔除几何体并从渲染中移除整个区域。
''Areaportal'' 是一个{{L|brush entity|笔刷(固体)实体}},<code>{{L|func_areaportal}}</code>,<code>{{L|func_areaportalwindow}}</code>,可以用来"密封"两个单独的{{L|visleaves|可见性分支区域}}和控制可见性。


Areaportal 就像是打开或关闭的门。当 Areaportal 关闭时,它阻挡了几何图形和其后面区域中其他对象的可见性。当它打开时,几何体再次可见。 Areaportal 可以在引擎运行时动态打开和关闭。它们通常被设置为使用[[Inputs and Outputs|实体 I/O 系统]]或通过与[[Doors|门]]实体的链接从一组<code>[[trigger_multiple]]</code>笔刷打开和关闭。
Areaportal 有两个不同的目的:剔除几何体并从渲染中移除整个区域。
 
Areaportal 就像是打开或关闭的门。当 Areaportal 关闭时,它阻挡在后部分区域的几何图形和其它物体的可见性。当它打开时,几何体将再次可见。 Areaportal 可以在引擎运行时动态打开和关闭。它们通常被设置为使用{{L|Inputs and Outputs|实体 I/O 系统}}或通过与{{L|Doors|门}}实体的链接从一系列<code>{{L|trigger_multiple}}</code>笔刷打开和关闭。


== 属性 ==
== 属性 ==


[[Image:Areaportal trainstation04.jpg|200px|thumb|right|caption|trigger_multiple 可用于打开和关闭区域门户以及隐藏关卡区域。]]
[[File:Areaportal trainstation04.jpg|200px|thumb|right|caption|trigger_multiple 可用于打开和关闭 Areaportal 以及隐藏的关卡区域。]]


Areaportal:
对于 Areaportal 而言:


* 是要绑定到<code>[[func_areaportal]]</code>实体。
* 绑定到了<code>{{L|func_areaportal}}</code>实体上。
* 必须仅由一个固体构成。绑定了多个固体的 Areaportal 实体在 [[vbsp]]<sup>①</sup> 编译时会产生错误。
* 必须仅由一个固体构成。绑定了多个固体的 Areaportal 实体在 {{L|vbsp}}<sup>①</sup> 编译时会产生错误。
* 必须使用应用于 Areaportal 固体的所有面的<code>tools\toolsareaportal</code>纹理。
* 必须使用应用于 Areaportal 固体的所有面的<code>tools\toolsareaportal</code>纹理。
* 不能包含[[displacement|置换表层]]<sup>②</sup>,如果包含会产生 vbsp 错误。
* 不能包含{{L|displacement|置换表层}}<sup>②</sup>,如果包含会产生 vbsp 错误。
* 必须用于密封它们连接的所有区域,以避免[[leak|泄露]]<sup>③</sup>
* 必须用于密封它们连接的所有区域,以避免{{L|leak|泄露}}<sup>③</sup>
* 是体积,而不是单个表面。尽管 Areaportal 可以是任意大小,但通常它们由与它们连接的区域(门口)大小相同的细节笔刷构成。
* 是有体积的,而不是单个表面。尽管 Areaportal 可以是任意大小,但通常它们由与它们连接的区域(门口)大小相同的细节笔刷构成。
* 在 Areaportal 体积的大小生成一个新的[[visleaf|可见性叶子块]]。
* 在 Areaportal 体积的大小生成一个新的{{L|visleaf|可见性分支区域}}。
* 可以根据[[Inputs and Outputs|实体逻辑]]或通过将它们附加到门实体来设置打开或关闭。
* 可以根据{{L|Inputs and Outputs|输入与输出}}或通过将它们附加到门实体来设置打开或关闭。


=== areaportal_window ===
=== areaportal_window ===


<code>[[func_areaportalwindow]]</code>实体表现得像一个标准的 Areaportal,如果玩家移动到了指定的距离,则开始淡出和关闭。这避免了 Areaportal 突然"砰"的一下打开。
<code>{{L|func_areaportalwindow}}</code>实体表现得像一个标准的 Areaportal,如果玩家移动到了指定的距离,则开始淡出和关闭。这避免了 Areaportal 突然弹出式地打开。




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


== 放置 ==
== Areaportal 在地图编辑中的实现 ==


[[Image:areaportal_simple_ex1.jpg|200px|right|thumb|caption|Areaportal 的基本构造。]]
[[File:areaportal_simple_ex1.jpg|200px|right|thumb|caption|Areaportal 的基本构造。]]


# 使用单个[[brush|固体]]实体创建 Areaportal 的体积,(并用它)完全密封你想控制的两个区域之间的空间。(如有必要,多个 Areaportal 可以一起执行此操作<sup>①</sup>。不要给任何一个 Areaportal 实体提供六条以上的边。<sup>②</sup>)
# 使用单个{{L|brush|固体}}实体创建 Areaportal 的体积,(并用它)完全密封你想控制的两个区域之间的空间。(如有必要,多个 Areaportal 可以一起执行此操作<sup>①</sup>。不要给任何一个 Areaportal 实体提供六条以上的边。<sup>②</sup>)
# 如果 Areaportal 像门口一样连接两个区域,则让 Areaportal 的固体大小为这个门口的大小,并且其厚度与其连接的墙壁(的厚度)相同。如果区域是开放区域,例如室外部分,则厚度可以是任意大小(典型的网格大小为 8、16、32 等)
# 如果 Areaportal 像门口一样连接两个区域,则让 Areaportal 的固体大小为这个门口的大小,并且其厚度与其连接的墙壁(的厚度)相同。如果区域是开放区域,例如室外部分,则厚度可以是任意大小(典型的网格大小为 8、16、32 等)
# 将<code>[[Tool textures#Optimisation|tools\toolsareaportal]]</code>材质应用到笔刷的所有面。
# 将<code>[[Tool textures#Optimisation|tools\toolsareaportal]]</code>材质应用到笔刷的所有面。
# [[Entity Creation|将画笔绑定]][[func_areaportal]] [[func_areaportalwindow]] 实体。
# {{L|Entity creation|将画笔绑定}}{{L|func_areaportal}} {{L|func_areaportalwindow}} 实体。
# 设置 ''Initial State''(初始状态)键值,以便它不会在不应该阻止可见性时关闭。如果你想把它链接到一个命名的门,将 Areaportal 的 ''Initial State'' 键值设置为与门相同的初始状态,并将门的名称填入 Areaportal 的键值 ''Name of Linked Door''(链接的门的名称)中。当门关闭时,Areaportal 的 ''Initial State'' 也应为关闭,反之亦然。
# 设置 ''Initial State''(初始状态)键值,以便它不会在不应该阻止可见性时关闭。如果你想把它链接到一个命名的门,将 Areaportal 的 ''Initial State'' 键值设置为与门相同的初始状态,并将门的名称填入 Areaportal 的键值 ''Name of Linked Door''(链接的门的名称)中。当门关闭时,Areaportal 的 ''Initial State'' 也应为关闭,反之亦然。


{{Placement Tip:zh-cn|将 Areaportal 链接到命名门时,请确保它比门模型本身更薄,以确保后者在关闭时会被渲染。}}
{{Placement Tip:zh-cn|将 Areaportal 链接到命名门时,请确保它比门模型本身更薄,以确保后者在关闭时会被渲染。}}




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


== 性能影响 ==
== 性能影响 ==


<div style="text-align:center;">[[Image:areaportal_culling_engine1.jpg|350px|caption|在引擎运行时的 Areaportal 的线框的渲染。(引擎)仅渲染通过 Areaportal 看到的处于可见性叶子块中的世界几何体。]] [[Image:areaportal_culling_engine2.jpg|350px|caption|与没有 Areaportal 时相同的场景。连接的可见性叶子块中的所有几何体都被渲染。]]</div>
<div style="text-align:center;">[[File:areaportal_culling_engine1.jpg|350px|caption|在引擎运行时的 Areaportal 的线框的渲染。(引擎)仅渲染通过 Areaportal 看到的处于可见性叶子块中的世界几何体。]] [[File:areaportal_culling_engine2.jpg|350px|caption|与没有 Areaportal 时相同的场景。连接的可见性叶子块中的所有几何体都被渲染。]]</div>


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


[[Image:areaportal_culling_top.jpg|thumb|一个打开的 Areaportal 会严格剔除模型的可见性。]]
[[File:areaportal_culling_top.jpg|thumb|一个打开的 Areaportal 会严格剔除模型的可见性。]]


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


=== 过度使用 ===
=== 过度使用 ===


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


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




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


== 编译 ==
== 编译 ==


[[Image:AreaPortalLeakFig.jpg|300px|right|thumb|caption|Areaportal 泄漏(左)和完全密封区域(右)的俯视图。]]
[[File:AreaPortalLeakFig.jpg|300px|right|thumb|caption|Areaportal 泄漏(左)和完全密封区域(右)的俯视图。]]


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


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


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


=== 识别编译错误 ===
=== 识别编译错误 ===


Areaportal 编译错误由 [[vbsp|VBSP]] 输出。如果发生泄漏,你将看到:
Areaportal 编译错误由 {{L|vbsp|VBSP}} 输出。如果发生泄漏,你将看到:


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


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


{{bug:zh-cn|如果你的地图中没有实体,例如 info_player_start,Areaportal (以及地图的其余部分)将造成异常泄漏。要解决此问题,请确保你的地图中至少有一种实体。}}
{{bug|hidetested=1|如果你的地图中没有实体,例如 info_player_start,Areaportal (以及地图的其余部分)将造成异常泄漏。要解决此问题,请确保你的地图中至少有一种实体。}}


{{tip:zh-cn|[[glview]] 应用程序可用于显示 Areaportal, 如绘制为灰色表面。}}
{{tip|{{L|glview}} 应用程序可用于显示 Areaportal, 如绘制为灰色表面。}}


=== Areaportal 和水 ===
=== Areaportal 和水 ===
[[Image:areaportal_water.jpg||thumb|200px|right|在水中搭建 Areaportal 时,必须使用两个独立的 Areaportal。]]
[[File:areaportal_water.jpg||thumb|200px|right|在水中搭建 Areaportal 时,必须使用两个独立的 Areaportal。]]


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


=== 合并 ===
=== 合并 ===


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


{{tip:zh-cn|你可以使用<code>r_DrawPortals 1</code>控制台命令查看引擎中是否正在合并 Areaportal。}}
{{tip|你可以使用<code>r_DrawPortals 1</code>控制台命令查看引擎中是否正在合并 Areaportal。}}


== 通过区域查看 ==
== 穿过区域查看 ==


[[Image:Areaportal-areas.png|frame|right|叶<sup>②</sup>一和叶二之间的可见性不受影响。]]
[[File:Areaportal-areas.png|frame|right|叶<sup>②</sup>一和叶二之间的可见性不受影响。]]


Areaportal 只在它们封闭的区域''之间''进行剔除。根据右图思考:虽然建筑物的内容如你所料被剔除,但第一和第二个[[visleaf|可视叶]]<sup>①</sup>之间的可见性不受影响,因为它们通过建筑物的侧面相互连接。
Areaportal 只在它们封闭的区域''之间''进行剔除。根据右图思考:虽然建筑物的内容如你所料被剔除,但第一和第二个{{L|visleaf|可视性分支区域}}<sup>①</sup>之间的可见性不受影响,因为它们通过建筑物的侧面相互连接。


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




<small>——————<br>
<small>——————<br>
①〔可视叶〕可见性叶子块。<br>
① 可视叶:可见性叶子块。<br>
②〔叶〕叶子块,同上。</small>
② 叶:叶子块,同上。</small>
{{clr}}
{{clr}}


== 控制台命令 ==
== 控制台命令 ==


你可以使用一些特定于 Areaportal 的[[console|控制台]]变量在游戏中调试和测试 Areaportal:
你可以使用一些特定于 Areaportal 的{{L|console|控制台}}变量在游戏中调试和测试 Areaportal:


;r_DrawPortals 0/1
;r_DrawPortals 0/1
: 当设置为“1”时,以绿色渲染出任何 Areaportal 的表面边界(两个区域之间)。有时不止一个 Areaportal 被压缩成一个。如果属于它的 Areaportal 是打开的,还会绘制第二个绿色边框,显示另一侧的可见性被切割后的内容。
: 当设置为“1”时,以绿色渲染出任何 Areaportal 的表面边界(两个区域之间)。有时不止一个 Areaportal 被压缩成一个。如果属于它的 Areaportal 是打开的,还会绘制第二个绿色边框,显示另一侧的可见性被切割后的内容。
;mat_wireframe 0/1/2/3
;mat_wireframe 0/1/2/3
: 以线框模式绘制几何图形,可以轻松查看地图中 Areaportal 的效果。在调试 Areaportal 时,你通常应该将 mat_wireframe 设置为“1”或“2”,因为“3”设置可以隐藏实际渲染的几何体。
: 以线框模式绘制几何图形,可以轻松查看地图中 Areaportal 的效果。在调试 Areaportal 时,你通常应该将 mat_wireframe 设置为“1”或“2”,因为“3”设置可以隐藏实际渲染的几何体。
;r_portalscloseall 0/1
;r_portalscloseall 0/1
: 将此设置为“1”会强制关闭所有 Areaportal (因此它们无法打开)。覆盖<code>r_portalsopenall 1</code>(如果没有效果,请重试此操作。它可以告诉你问题是否只是 Areaportal 没有正确关闭。)
: 将此设置为“1”会强制关闭所有 Areaportal (因此它们无法打开)。覆盖<code>r_portalsopenall 1</code>(如果没有效果,请重试此操作。它可以告诉你问题是否只是 Areaportal 没有正确关闭。)
{{note:zh-cn|此命令不存在于:{{Tf2}} {{Csgo}}}}
{{note|此命令不存在于:{{Tf2}} {{Csgo}}}}
;r_portalsopenall 0/1
;r_portalsopenall 0/1
: 将此设置为“1”会强制所有区域门户打开(因此它们无法关闭)
: 将此设置为“1”会强制所有区域门户打开(因此它们无法关闭)


{{tip:zh-cn|使用<code>BindToggle</code>控制台命令允许使用单个键来切换控制台变量。}}
{{tip|使用<code>BindToggle</code>控制台命令允许使用单个键来切换控制台变量。}}


== 在多人游戏中 ==
== 在多人游戏中 ==


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


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




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


== 与封堵器(occluder)的关系 ==
== 与遮挡器(occluder)的关系 ==


Areaportal 类似于 [[Occluder]],因为它们有助于控制可见性。它们之间的主要区别是:
Areaportal 类似于 {{L|Occluder}},因为它们有助于控制可见性。它们之间的主要区别是:


* Occluder 仅隐藏其背后的模型(道具)几何体。Areaportal 隐藏所有类型的对象。
* Occluder 仅隐藏其背后的模型(道具)几何体。Areaportal 隐藏所有类型的对象。
* Areaportal 必须完全密封区域(不允许出现[[leak|泄漏]]),而 Occluder 可以是独立的内部区域。
* Areaportal 必须完全密封区域(不允许出现{{L|leak|泄漏}}),而 Occluder 可以是独立的内部区域。
* Occluder 的每个对象比开放的 Areaportal 更昂贵。
* Occluder 的每个对象比开放的 Areaportal 更昂贵。
* Occluder 可以根据屏幕区域控制它们将隐藏的对象的大小。
* Occluder 可以根据屏幕区域控制它们将隐藏的对象的大小。


{{note:zh-cn|Areaportal 和 Occluder 实体中的笔刷不应相互交叉(接触),如果交叉,它们将无法正常工作。}}
{{note|Areaportal 和 Occluder 实体中的笔刷不应相互交叉(接触),如果交叉,它们将无法正常工作。}}


== 另请参阅 ==
== 另请参阅 ==


* [[func_areaportal]] / <code>[[CAreaPortal]]</code>
* {{L|func_areaportal}} / <code>{{L|CAreaPortal}}</code>
* [[func_areaportalwindow]]
* {{L|func_areaportalwindow}}
* <code>[[CAreaPortalOneWay]]</code> (新实体的 C++ 代码)
* <code>{{L|CAreaPortalOneWay}}</code> (新实体的 C++ 代码)
* [[Controlling Geometry Visibility and Compile Times]]
* {{L|Controlling Geometry Visibility and Compile Times}}
* [[Leak]]
* {{L|Leak}}
* [[Visleaf]]
* {{L|Visleaf}}
 
{{ACategory|Level Design}}{{ACategory|Glossary}}
 
{{ACategory|Level Design}}
{{ACategory|Glossary}}
 


[[Category:Level Design:zh-cn]][[Category:Glossary:zh-cn]]
{{stub}}

Latest revision as of 07:19, 20 May 2025

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.