UDN
Search public documentation:

StaticMeshCollisionReferenceCH
English Translation
日本語訳
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

静态网格物体碰撞参考

文档摘要:本文档涵盖静态网格物体碰撞的相关说明。

文档修改日志:由Chris Linder(DemiurgeStudios)于2003年10月28日创建的基于2226的相关建模文档。

相关文档

CollisionTutorial, KarmaReference, StaticMeshesTutorial, ActorVariables

介绍

在虚幻引擎中,碰撞是一个非常微妙的部分,不仅非常复杂而且还存在细微差别,完全可以成为长篇累述的主题。本文档缩小了碰撞的范围,主要关注Physics设置为PHYS_None的静态网格物体或者Mover(移动者(Mover))。对于“静态网格物体”而言,我指的是DrawType设置为DT_StaticMesh的任何对象。这包括您通过右击并选择添加Add static mesh:“...”而放置在虚拟世界中的静态网格物体以及用在Actor浏览器中绘制的静态网格物体。静态网格物体的物理属性也非常重要,因为当静态网格物体正位于此位置而其它东西撞入它们或者当静态网格物体为移动者(Mover)时,静态网格物体的碰撞效果最好。运动的静态网格物体(但不是移动者(Mover))也可以碰撞,本文档对这些情况也会有所帮助。欲获得更多详细信息请查看运动的静态网格物体章节。

即使在以上描述的狭义范围内,也存在众多复杂情况。本文档旨在提供一个关于与给定设置发生碰撞的静态网格物体种类和方式的全面参考。关于碰撞,首先要意识到需要设置许许多多的变量,而且它们相互关联。不存在您可检测并使碰撞发生的单一字段。有些关于碰撞的碰撞检测发生在其它碰撞检测之前,因此它们有高优先级。由于特定碰撞碰撞检测的优先级,本文档按步骤介绍流程,指导您制作静态网格物体碰撞。在任一步骤中,您可以制作一个不发生碰撞的对象。要确保一个对象确实会发生碰撞,您必须继续完成所有其它步骤。

步骤 1:actor碰撞属性

如果您将actor碰撞属性(属性中的“Collision”类别)设置为不发生碰撞,没有任何静态网格物体碰撞的更改(静态网格物体浏览器中的属性)将使它发生碰撞。actor碰撞属性表明如果该actor试图要发生碰撞,则静态网格物体碰撞属性说明它是否及如何发生碰撞。

例如,如果您想要一个网格物体阻挡一个KActor,但是您将bBlockKarma 设置为假,它将不会发生碰撞。如果您将bBlockKarma设置为真(并将一个静态网格物体的所有其它碰撞属性保持为默认值),它将发生碰撞。如果对所有材质,您将UseSimpleKarmaCollision,UseSimpleBoxCollision,与UseSimpleLineCollision设置为假而将EnableCollision设置为真,毫无疑问它会发生碰撞。

碰撞变量

collision.gif

本部分解释了静态网格物体的actor碰撞变量。微妙的一点是:根据 bWorldGeometry 的值为真或者假,碰撞变量将表现不同。当您通过右击并选择Add static mesh:'....'将一个静态网格物体放置在UnrealEd的关卡中,这种类型的静态网格物体的 bWorldGeometry 为真。其它类型的有一个 DrawTypeDT_StaticMesh 的actor,其 bWorldGeometry 可能为假。 bWorldGeometry 值在UnrealEd中不能被修改甚至不能查看;它只能够在UnrealScript中被看到并更改。总体来说,如果某物体为三维几何体,它从不运动或者改变,它的 bWorldGeometry 可能为真。如果一个用静态网格物体绘制的actor曾经运动或者改变,它的 bWorldGeometry 可能为假。

还值得注意有些actor通过代码复写UnrealEd中指定的值,更改它们的一些碰撞值,敬请留心。例如,这是 TriggersTeleporters ,与 WarfareStationaryWeapons 的情况。

关于“Collision(碰撞)”对“Blocking(阻挡)”的一个重要注意事项

“Collision(碰撞)”(例如在 bCollideActors 的情况下)是指引擎计算两个物体是否发生接触。“Blocking(阻挡)”(例如在bBlockKarma的情况下)是指一个物体使另一个物体停止。例如触发器发生碰撞但不阻挡。这就是引擎知道您接触了触发器的方式,但您仍然可以穿过这个触发器。

bWorldGeometry 为真的变量描述

下面是当actor碰撞变量应用于 bWorldGeometry 设置为真的actor时,对actor碰撞变量的描述。这是通过右击并选择Add static mesh:'....'而生成的 StaticMeshActor 的情况。默认值按照 StaticMeshActor 所提供的情况。

设置 描述 默认值
bCollideActors 这是最重要的碰撞变量。如果 bCollideActors 为假,此静态网格物体将不会与任何东西发生碰撞。这是由于它不在碰撞散列中。如果它为真,根据下面的其它设置,此静态网格物体可能会发生碰撞。
bBlockZeroExtentTraces bBlockZeroExtentTraces 确定此静态网格物体是否要试图阻挡零粗细追踪。例如大多数武器开火使用零粗细追踪。无论 bUseCylinderCollision 为真或者为假,此网格物体是否真的阻挡将由圆柱体碰撞决定。静态网格物体碰撞属性在后面解释。
bBlockNonZeroExtentTraces bBlockNonZeroExtentTraces 确定此静态网格物体是否要试图阻挡非零粗细追踪。例如运动员运动使用非零粗细追踪。无论 bUseCylinderCollision 为真或者为假,此网格物体是否真的阻挡将由圆柱体碰撞决定。静态网格物体碰撞属性在后面解释。
bBlockKarma 将此设置为真将使此静态网格物体试图阻挡karma。网格物体是否发生实际阻挡由下面解释的静态网格物体碰撞属性决定。注意:这不受 bUseCylinderCollision 影响。
bUseCylinderCollision 如果此为真,引擎将对除karma碰撞外的所有碰撞使用圆柱体碰撞(由 CollisionRadiusCollisionHeight 确定)。除了karma碰撞外,静态网格物体碰撞属性中的所有设置都被忽略。
bPathColliding 如果 bBlockActorsbCollideActors 为真,且 bStatic 为假,如果您将 bPathColliding 设置为假,此actor在路径建立时不发生碰撞。这意味着人工智能认为它们能够运动穿越该actor,即使它们不能。如果人工智能能够运动穿越该actor,设置 bPathColliding 为真将不阻止人工智能找到查找穿越该actor的路径,。此设置对在AI移动者(Mover)试图穿越它时会主动从该路径上移开的移动者(Mover)或者任何actor有用。在大多数情况下,由于 StaticMeshActors 的bStatic 为真, bPathColliding 与静态网格物体不相关。
bCollideWorld 不影响 bWorldGeometry = 真 静态网格物体如何碰撞。
bBlockActors 不影响 bWorldGeometry = 真 静态网格物体如何碰撞。
bBlockPlayers 不影响 bWorldGeometry = 真 静态网格物体如何碰撞。
bProjTarget 不影响 bWorldGeometry = 真 静态网格物体如何碰撞。

bWorldGeometry 为假的变量描述

下面是当actor碰撞变量应用于 bWorldGeometry 设置为假的actor时,对actor碰撞变量的更多描述。这种类型的静态网格物体表现的和上文所述静态网格物体一样,但他们有另外一个机会不阻挡物体。首先使用上表查看被讨论的静态网格物体是否阻挡物体。如果不会,更改这些设置。如果根据以上描述您的静态网格物体将发生阻挡,现在您可以使用以下更多的碰撞检测查看是否真的会发生阻挡。

设置 描述
bCollideWorld 此设置既不与有PHYS_None的静态网格物相关,也不与移动者(Mover)相关。然而,如果您的静态网格物体正在运动,您最好将它设置为真。
bBlockActors 试图阻挡其它非玩家actor。必须在 bBlockNonZeroExtentTraces 设置为真时才有效。如果 bUseCylinderCollision 为真,此网格物体是否真的阻挡由圆柱体碰撞决定,或者 bUseCylinderCollision 为假,此静态网格物体碰撞属性在后面解释。
bBlockPlayers 阻挡其它的玩家actor。必须在 bBlockNonZeroExtentTraces 设置为 真时才有效。如果 bUseCylinderCollision 为真,此网格物体是否真的阻挡由圆柱体碰撞决定,或者 bUseCylinderCollision 假,此静态网格物体碰撞属性在后面解释。
bProjTarget 阻挡火箭等抛射体甚至直接射击的子弹。必须在 bBlockNonZeroExtentTraces 设置为真时才有效。如果 bUseCylinderCollision 为真,此网格物体是否真的阻挡由圆柱体碰撞决定,或者 bUseCylinderCollision 为假,此静态网格物体碰撞属性在后面解释。

步骤2:静态网格物体碰撞属性

如果对象没有被设置为根据步骤1中描述的actor碰撞属性碰撞,本章讨论的静态网格物体碰撞属性将不被使用。

本章讨论了一些静态网格物体浏览器窗口中的一些属性。它使用图标说明碰撞模型与静态网格物体浏览器中“UseSimple”属性两者间的关系,如下图所示。

StaticMeshCollisionProps.gif

每种碰撞模型都有不同的图表;无,类型1与类型2。在每个图表中, UseSimpleKarmaCollisionUseSimpleBoxCollision ,和 UseSimpleLineCollision 所有可能的设置都分别在 KarmaBox ,与 Line 栏中列出。

Karma Objects(Karma对象) 栏指出网格物体将使用什么阻挡Karma物体。 Non-Zero Extent Traces(非零粗细追踪)(例如Pawn运动) 栏指出网格物体将使用什么阻挡被Pawn运动及圆柱体碰撞等使用的非零粗细追踪物体。 Zero Extent Traces(零粗细追踪)(例如武器开火) 栏指出网格物体将使用什么阻挡被武器开火等使用的零粗细追踪物体。

无碰撞模型

本图表查看一个没有碰撞模型的静态网格物体如何发生碰撞。

默认值 Karma Box Line Karma Objects(Karma对象) Non-Zero Extent Traces (非零粗细追踪)(例如Pawn 运动) Zero Extent Traces (零粗细追踪)(例如武器开火)
  材质碰撞 材质碰撞 材质碰撞
  材质碰撞 材质碰撞 材质碰撞
  材质碰撞 材质碰撞 材质碰撞
  材质碰撞 材质碰撞 材质碰撞
  不发生碰撞 材质碰撞 材质碰撞
  不发生碰撞 材质碰撞 材质碰撞
* 不发生碰撞 材质碰撞 材质碰撞
  不发生碰撞 材质碰撞 材质碰撞

类型 1

本图表查看一个碰撞模型为类型1的静态网格物体如何发生碰撞。使用将Brush(画刷)另存为Collision(碰撞),或者K-DOP可以创建类型1碰撞模型。此类型的碰撞还包括在建模程序中用MCDCX 标签创建的碰撞形状。

默认 Karma Box Line Karma Objects(Karma对象) Non-Zero Extent Traces (非零粗细追踪)(例如Pawn 运动) Zero Extent Traces (零粗细追踪)(例如武器开火)
  材质碰撞 材质碰撞 材质碰撞
  材质碰撞 材质碰撞 碰撞 w/ 碰撞模型
  材质碰撞 碰撞 w/ 碰撞模型 材质碰撞
  材质碰撞 碰撞 w/ 碰撞模型 碰撞 w/ 碰撞模型
  碰撞 w/ 碰撞模型 材质碰撞 材质碰撞
  碰撞 w/ 碰撞模型 材质碰撞 碰撞 w/ 碰撞模型
* 碰撞 w/ 碰撞模型 碰撞 w/ 碰撞模型 材质碰撞
  碰撞 w/ 碰撞模型 碰撞 w/ 碰撞模型 碰撞 w/ 碰撞模型

类型 2

本图表查看一个碰撞模型为类型2的静态网格物体如何发生碰撞。 类型 2 碰撞模型通过Fit Karma Primitive 或者在建模程序中用MCDBX,MCDSP,或 MCDCY 标签创建的碰撞形状创建。

默认 Karma Box Line Karma Objects(Karma对象) Non-Zero Extent Traces (非零粗细追踪)(例如Pawn 运动) Zero Extent Traces (零粗细追踪)(例如武器开火)
  材质碰撞 材质碰撞 材质碰撞
  材质碰撞 材质碰撞 材质碰撞
  材质碰撞 材质碰撞 材质碰撞
  材质碰撞 材质碰撞 材质碰撞
  碰撞 w/ 碰撞模型 材质碰撞 材质碰撞
  碰撞 w/ 碰撞模型 材质碰撞 材质碰撞
* 碰撞 w/ 碰撞模型 材质碰撞 材质碰撞
  碰撞 w/ 碰撞模型 材质碰撞 材质碰撞

步骤 3:材质碰撞

材质碰撞仅仅在使用碰撞模型时才被使用。从步骤2开始参见上表,确定材质碰撞是否与您的静态网格物体相关。

碰撞可以在静态网格物体浏览器中按照每个材质设置。有时候仅仅使一些材质在网格物体碰撞中生效是非常有用的。通过按照下图所示扩展Materials数组并为每个材质设置EnableCollision可以完成设置材质碰撞。

StaticMeshCollisionPropsMat.gif

当一个材质的 EnableCollision 为真,网格物体的所有用该材质纹理化的三角形都将被用于碰撞计算。这意味着碰撞计算将正确地基于您所见的三角形。有时这与使用简化的碰撞模型速度相同但是在大多数情况下会更慢,由于在此使用了更多的三角形计算碰撞。

内存问题

除速度之外,使用碰撞模型而不是材质碰撞有一个内存获取的问题。即使没有使用材质碰撞,如果 EnableCollision 为真,该材质的碰撞数据被存储在静态网格物体中。大量静态网格物体可能导致巨大的内存浪费。本Xbox内存优化文档讨论与静态网格物体材质碰撞相关的内存节省。虽然该文档针对Xbox,内存节省对所有平台适用。总体而言,如果您对所有类型的碰撞使用碰撞模型 (参见步骤2获得更多详细信息),确认您关闭了所有材质的材质碰撞。

运动的静态网格物体

如上所示,本文档并不真正涵盖静态网格物体的任意运动物理属性。本章将给出一个简明的摘要,关于运动如何影响静态网格物体以及您可能想做什么使其正确工作。首先,如果您希望一个静态网格物体环绕运动,它可能是一个移动者(Mover),一个Karma物体,或者一个使用圆柱体碰撞的Pawn。

非常有趣的是,即使您的静态网格物体不是这些东西中的任何一个,它仍然可以运动并发生碰撞。问题是,静态网格物体与其它运动物体间的接触是在其它物体运动时计算的。所以如果该静态网格物体运动到另一个物体内,如果它是一个玩家或者一个karma物体,该静态网格物体通常会直接穿过另一个物体。但是如果玩家或者karma物体运动进入静态网格物体,它们将被阻挡。另一个问题是即使静态网格物体的 bUseCylinderCollision 为假,当它运动时,该引擎将对该运动使用圆柱体碰撞。例如,如果您有一个 PHYS_Falling 中的静态网格物体,当碰撞圆柱体被阻挡时它将停止下落,它将忽略该网格物体的所有其它部分。其它运动物体仍然将与网格物体碰撞但是会有上述的运动穿越问题。

移动者(Mover)碰撞

由于移动者(Mover)被设计为运动,它们不存在仅仅在其它 Actors 运动时计算碰撞的问题。碰撞总是被计算,从而移动者(Mover)对本文档中的所有图表起作用。

Karma碰撞

如果您希望静态网格物体按照一种逼真的方式碰撞并反应到作品中,您应该让它成为Karma actor。由于Karma有其自身的碰撞计算,本文档描述的碰撞相关性并不大。参见以下文档获得关于Karma的更多信息。

IntroToKarma, KarmaReference, ImportingKarmaActors, UsingKarmaActors, ExampleMapsKarmaColosseum, KarmaAuthoringTool

Pawn碰撞

如果您将静态网格物体用于Pawn,通过按照上文所述将 bUseCylinderCollision 设置为真,则使用圆柱体碰撞可以使效果达到最好。此静态网格物体将仅仅被用作外观且并不会牵涉到碰撞中,Karma除外。如果根据前文的所有设置,此静态网格物体已经被配置成与Karma发生碰撞,那么当它运动时,Pawn将推动周围的Karma对象。