Skip to main content

场景碰撞查询

概述

场景碰撞查询(碰撞检测)功能用于检测物理场景内物理对象及对象碰撞体表面信息。

碰撞检测类型

检测方法说明
射线(Raycast)射线碰撞检测。从场景中的起始位置向目标位置发射一条射线,检测射线路径上是否存在其他场景物体。
Raycast
重叠(Overlap)重叠碰撞检测。使用碰撞体(球、胶囊或盒子),在场景指定位置检测碰撞体形状范围内是否存在其他场景物体。
Overlap-16842223236121
扫描(Sweep)扫描碰撞检测。与射线碰撞检测类似,只是射线被替换为碰撞体(球、胶囊或盒子)。从场景的起始位置向目标位置方向移动碰撞体,并检测碰撞体扫过的路径上是否与其他场景物体碰撞。
Sweep

碰撞体类型

碰撞体说明
球体(Sphere)球体通过一个半径参数来进行描述。球体原点在球体正中心。
Sphere
盒子体(Box)盒子体通过长宽高三个参数来进行描述。盒子体原点在盒子体正中心。
Box
胶囊体(Capsule)胶囊体通过半径和半高两组参数来进行描述。胶囊体方向延X轴方向延伸。胶囊体原点在胶囊体正中心。
Capsule

碰撞响应类型

碰撞响应说明
阻挡
(Block)
射线(Raycast)和扫描(Sweep)检测,将返回距离最近且碰撞响应为阻挡(Block)的碰撞结果,并且结束碰撞检测。
重叠(Overlap)检测,将返回所有碰撞响应为阻挡(Block)的碰撞结果。
重叠(Overlap)射线(Raycast)和扫描(Sweep)检测,将返回检测起始点到距离最近的且碰撞响应为阻挡(Block)的物体之间,所有的碰撞响应为重叠(Overlap)的碰撞结果。
重叠(Overlap)检测,将返回所有碰撞响应为重叠(Overlap)的碰撞结果。
忽略(Ignore)射线(Raycast)、重叠(Overlap)、扫描(Sweep)检测,将忽略碰撞响应为忽略(Ignore)的碰撞结果。

碰撞查询方式

查询方式说明
Test仅返回是否发生碰撞的信息,不会返回碰撞到的物体信息。
Single返回距离起始点最近的,发生阻挡(Block)的物体的碰撞信息。
Multi对于射线(Raycast)和扫描(Sweep)碰撞检测,返回距离起始点最近的,发生阻挡(Block)的物体的碰撞信息,以及从起始点到最近发生碰撞物体之间,所有的碰撞结果为重叠(Overlap)的物体的碰撞信息。
对于重叠(Overlap)检测,会返回碰撞体范围内所有发生阻挡(Block)和重叠(Overlap)的物体。
查询方式说明
ByChannel按通道(对象类型)和碰撞响应参数查询。
场景中每个组件都自带一组碰撞参数(通道 + 碰撞响应参数)。
ByChannel通过接口传入的碰撞参数,与场景里的组件做碰撞判定。
碰撞结果为阻挡(Block)或重叠(Overlap)(查询方式需为Multi)的组件将被返回。
关于通道和碰撞响应参数的说明,以及碰撞判定规则的说明,详见文档常用物理属性碰撞章节。
ByObjectType按对象类型查询。
ByObjectType通过输入需要查询的对象类型,与场景里的组件做碰撞判定。
对象类型匹配的组件将被返回。
ByProfile按碰撞预设类型查询。
ByProfile接口传入的碰撞预设配置,与场景里的组件做碰撞判定。
碰撞结果为阻挡(Block)或重叠(Overlap)(查询方式需为Multi)的组件将被返回。
ByComponent按组件查询。
ByComponent通过组件自身的碰撞体设置和碰撞参数设置,与场景里的其他组件做碰撞判定。
碰撞结果为阻挡(Block)或重叠(Overlap)(查询方式需为Multi)的组件将被返回。

重要参数说明

碰撞通道类型(enum COLLISION_CHANNEL)

相关头文件路径:\source\fx_component\physics\physics_define.h

enum class COLLISION_CHANNEL : unsigned char
{
WorldStatic = CollisionChannel::eStatic,
WorldDynamic = CollisionChannel::eDynamic,
Pawn = CollisionChannel::ePawn,
Vehicle = CollisionChannel::eVehicle,
Destructible = CollisionChannel::eDestructible,
Visibility = CollisionChannel::eVisibility,
Camera = CollisionChannel::eCamera,
Trigger = CollisionChannel::eTrigger,
EngineTraceChannel1 = CollisionChannel::eEngineChannel8,
EngineTraceChannel2 = CollisionChannel::eEngineChannel9,
EngineTraceChannel3 = CollisionChannel::eEngineChannel10,
EngineTraceChannel4 = CollisionChannel::eEngineChannel11,
EngineTraceChannel5 = CollisionChannel::eEngineChannel12,
EngineTraceChannel6 = CollisionChannel::eEngineChannel13,

GameTraceChannel1,
GameTraceChannel2,
GameTraceChannel3,
GameTraceChannel4,
GameTraceChannel5,
GameTraceChannel6,
GameTraceChannel7,
GameTraceChannel8,
GameTraceChannel9,
GameTraceChannel10,
GameTraceChannel11,
GameTraceChannel12,
GameTraceChannel13,
GameTraceChannel14,
GameTraceChannel15,
GameTraceChannel16,
GameTraceChannel17,
GameTraceChannel18,

MAX,
}FX_ENUM();
通道类型说明
WorldStatic表示场景中位置不会发生改变的静态物体。比如场景中的建筑物、树木等。
WorldDynamic表示场景中位置可能发生改变的动态物体。比如桌椅、易拉罐等。
Pawn表示受玩家或者AI控制的角色。
Vehicle表示场景中的载具。
Destructible表示场景中的可破碎物体。
Visibility经常用于可视性碰撞检测。
Camera经常用于场景中的相机对象,以及相机的碰撞检测。
Trigger经常用于场景中的触发器对象,以及触发器事件触发的碰撞检测。
EngineTraceChannel(1-6)引擎的预留碰撞通道类型。
GameTraceChannel(1-18)预留给用户自定义的碰撞通道类型。
关于在编辑器中添加用于自定义的碰撞通道的方法,详见文档碰撞预设编辑器

注:一共32种碰撞通道(对象)类型,其中18种提供给用户自定义使用。

按对象类型查询参数(struct collision_object_query_params_t)

接口说明
AddObjectTypesToQuery添加本次查询的对象(通道)类型。

碰撞响应参数(struct collision_response_params_t)

头文件路径:\source\fx_component\physics\physics_define.h

struct COMPONENT_API collision_response_params_t
{
collision_response_container_t CollisionResponse;
collision_response_params_t(COLLISION_RESPONSE DefaultResponse = COLLISION_RESPONSE::Block)
{
CollisionResponse.SetAllChannels(DefaultResponse);
}

collision_response_params_t(const collision_response_container_t& ResponseContainer)
{
CollisionResponse = ResponseContainer;
}

static collision_response_params_t DefaultResponseParam;
};
参数说明
collision_response_container_t CollisionResponse碰撞响应参数容器。包含对32种碰撞通道的碰撞响应设置。
关于通道和碰撞响应参数的说明,以及相应的碰撞判定规则的说明,详见文档常用物理属性碰撞章节。

碰撞查询参数(class CCollisionQueryParams)

参数说明
bool bFindInitialOverlaps当射线(Raycast)或扫描(Sweep)碰撞检测的起始位置位于其他场景物体内部时,碰撞检测会结束并在碰撞结果中提示起始位置陷入到其他物体内部。当bFindInitialOverlaps == true时,碰撞检测会忽略起始位置处物体的碰撞,并继续进行碰撞检测。
bool bIgnoreBlocks忽略本次碰撞检测,所有碰撞响应为阻挡(Block)的结果。
bool bIgnoreTouches忽略本次碰撞检测,所有碰撞响应为重叠(Overlap)的结果。
QueryMobilityType::Enum eMobilityType碰撞检测时仅查询动态/静态碰撞体。
QueryMobilityType::eStatic 本次碰撞检测仅查询静态碰撞体。
QueryMobilityType::eDynamic 本次碰撞检测仅查询动态碰撞体。
QueryMobilityType::eAny 本次碰撞检测同时查询动态和静态碰撞体。
bool bPickBothSides开启双面检测。仅在射线(Raycast)碰撞检测时生效,当bPickBothSides == true时,如果射线穿透物体,则可以拾取到物体背面的碰撞信息。

忽略与指定对象的碰撞

仅通过碰撞检测和各个组件上的碰撞响应(Collision Response)参数设置,可能无法满足逻辑对忽略某些对象碰撞检测的需求。此时可以通过添加忽略对象的方法,在碰撞检测中忽略某些特定对象的碰撞。

接口说明
AddIgnoredGameObject忽略与指定游戏对象的碰撞。
AddIgnoredComponent忽略与指定组件对象的碰撞。

编写自定义的碰撞筛选逻辑

接口说明
SetLogicExt添加一个逻辑扩展,用于筛选所有碰撞响应为阻挡(Block)的对象,决定本次碰撞检测是否保留与该对象的碰撞结果。

可参照 \source\fx_component\fx_physics\collision_query_filter.h中类class CollisionQueryFilter的实现。通过从CollisionQueryFilter派生出新的类型,来实现自己的碰撞筛选逻辑。CollisionQueryFilter类的实现如下:

#include "collision_query_filter.h"
#include "rigid_instance.h"
#include "ragdoll_instance.h"
#include "../primitive_component.h"
#include "../game_object.h"
#include "../physics/physx_user_data.h"
#include "flexi/physics/i_physics_rigid.h"
#include "flexi/utils/array_utils.h"
#include "flexi/object/casts.h"

CollisionQueryFilter::CollisionQueryFilter(const CCollisionQueryParams& QueryParams)
: m_IgnoreComponents(QueryParams.GetIgnoredComponents())
, m_IgnoreGameObjects(QueryParams.GetIgnoredGameObjects())
{

}

bool CollisionQueryFilter::OnKeepHit(const PERSISTID& phy_obj, unsigned int shape_key,
const wchar_t* debug_tag, const wchar_t* owner_tag)
{
FxPhysicsBase* pPhysicsObj = (FxPhysicsBase*)g_pCore->GetEntity(phy_obj);
if (NULL == pPhysicsObj)
{
return false;
}

LPrimitiveComponent* pOwnerComponent = NULL;

PhysicsProxy* pPhysicsProxy =
physx_user_data_t::Get<PhysicsProxy>(pPhysicsObj->GetUserData());

if (pPhysicsProxy != NULL)
{
pOwnerComponent = Cast<LPrimitiveComponent>(pPhysicsProxy->GetOwnerComponent());
}

if (NULL == pOwnerComponent)
{
return false;
}

LGameObject* pOwner = pOwnerComponent->GetGameObjectOwner();
if (NULL == pOwner)
{
Assert(0);
return false;
}

if (ArrayContains(m_IgnoreGameObjects, pOwner->GetID()))
{
return false;
}

if (ArrayContains(m_IgnoreComponents, pOwnerComponent->GetID()))
{
return false;
}

return true;
}

当OnKeepHit函数返回true时,碰撞结果被保留,否则碰撞结果被忽略。

碰撞体参数(class CCollisionShape)

接口说明
SetCapsule设置胶囊体(Capsule)外观。
SetBox设置盒子体(Box)外观。
SetSphere设置球体(Sphere)外观。

碰撞检测结果参数(struct hit_result_t)

参数说明
PERSISTID GameObjectID碰撞到的游戏对象。
PERSISTID ComponentID碰撞到的组件对象。
STRINGID BoneName当碰撞检测到布娃娃骨骼刚体时,BoneName表示碰撞到的布娃娃骨骼名称。
float fTimefTime = fDistance / length(f3QueryEnd - f3QueryStart)。
bool bBlockingHit当bBlockingHit == true时,表示当前碰撞结果的碰撞响应类型为阻挡(Block),否则碰撞响类型应为重叠(Overlap)。
PERSISTID ActorID碰撞到的刚体/破碎对象。
int nShapeIndex当ActorID是刚体对象时,nShapeIndex表示刚体的碰撞体索引。
当ActorID是破碎对象时,nShapeIndex表示碰撞到的破碎Chunk索引,-1代表无效的破碎Chunk。
PERSISTID MateiralID碰撞检测到的碰撞体表面的物理材质对象。
关于物理材质,详见文档创建和使用物理材质
FFLOAT3 f3QueryStart碰撞检测起始位置。
FFLOAT3 f3QueryEnd碰撞检测结束位置。
bool bStartPenetrating起始位置是否陷入其他物体。
float fPenetrationDepth陷入深度。
FFLOAT3 f3Location碰撞发生时碰撞体的位置。
FFLOAT3 f3ImpactPoint碰撞点位置。
FFLOAT3 f3Normal当扫描(Sweep)碰撞检测的碰撞体类型为球体(Sphere)或者胶囊体(Capsule)时,该值为碰撞点指向碰撞体原点的向量。
FFLOAT3 f3ImpactNormal碰撞点所在的表面法线。
float fDistance发生碰撞的距离。
unsigned int nFaceIndex碰撞三角面索引。

接口说明

射线检测

按对象类型查询

LineTraceTestByObjectType
bool LineTraceTestByObjectType(CXMVECTOR vStart, CXMVECTOR vEnd,
const co11ision_object_query_params_t& ObjectQueryParams,
const CCollisionQueryParams& Params = CCollisionQueryParams());
参数说明
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
const collision_object_query_params_t& ObjectQueryParams按对象类型查询参数。
const CCollisionQueryParams& Params碰撞查询参数。

返回值(bool):是否有阻挡(Block)碰撞结果。


LineTraceSingleByObjectType
bool LineTraceSingleByObjectType(hit_result_t& OutHit, CXMVECTOR vStart,
CXMVECTOR vEnd, const collision_object_query_params_t& ObjectQueryParams,
const CCollisionQueryParams& Params = CCollisionQueryParams());
参数说明
hit_result_t& OutHit距离射线起始点最近,第一个类型匹配的结果。
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
const collision_object_query_params_t& ObjectQueryParams按对象类型查询参数。
const CCollisionQueryParams& Params碰撞查询参数。

返回值(bool):是否有阻挡(Block)碰撞结果。


LineTraceMultiByObjectType
bool LineTraceMultiByObjectType(TArray<hit_result_t, 1>& OutHits,
CXMVECTOR vStart, CXMVECTOR vEnd,
const collision_object_query_params_t& ObjectQueryParams,
const CCollisionQueryParams& Params = CCollisionQueryParams());
参数说明
TArray<hit_result_t, 1>& OutHits射线路径上所有类型匹配的结果。
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
const collision_object_query_params_t& ObjectQueryParams按对象类型查询参数。
const CCollisionQueryParams& Params 碰撞查询参数。

返回值(bool):是否有阻挡(Block)碰撞结果。

按通道和碰撞响应参数查询

LineTraceTestByChannel
bool LineTraceTestByChannel(CXMVECTOR Start, CXMVECTOR End,
COLLISION_CHANNEL TraceChannel,
const CCollisionQueryParams& Params = CCollisionQueryParams(),
const collision_response_params_t& ResponseParam = collision_response_params_t::DefaultResponseParam);
参数说明
CXMVECTOR Start碰撞检测起始位置。
CXMVECTOR End碰撞检测结束位置。
COLLISION_CHANNEL TraceChannel碰撞通道类型。
const CCollisionQueryParams& Params碰撞查询参数。
const collision_response_params_t& ResponseParam碰撞响应参数。

返回值(bool):是否有阻挡(Block)碰撞结果。


LineTraceSingleByChannel
bool LineTraceSingleByChannel(hit_result_t& OutHit, CXMVECTOR vStart,
CXMVECTOR vEnd, COLLISION_CHANNEL nTraceChannel,
const CCollisionQueryParams& Params = CCollisionQueryParams(),
const collision_response_params_t& ResponseParam = collision_response_params_t::DefaultResponseParam);
参数说明
hit_result_t& OutHit距离起始点最近的Block碰撞结果。
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
COLLISION_CHANNEL nTraceChannel碰撞通道类型。
const CCollisionQueryParams& Params碰撞查询参数。
const collision_response_params_t& ResponseParam碰撞响应参数。

返回值(bool):是否有阻挡(Block)碰撞结果。


LineTraceMultiByChannel
bool LineTraceMultiByChannel(TArray<hit_result_t, 1>& OutHits,
CXMVECTOR vStart, CXMVECTOR vEnd, COLLISION_CHANNEL TraceChannel,
const CCollisionQueryParams& Params = CCollisionQueryParams(),
const collision_response_params_t& ResponseParam = collision_response_params_t::DefaultResponseParam);
参数说明
TArray<hit_result_t, 1>& OutHits距离起始点最近的阻挡(Block)碰撞结果 + 起始点到最近的阻挡(Block)碰撞结果之间,所有的重叠(Overlap)碰撞结果。
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
COLLISION_CHANNEL TraceChannel碰撞通道类型。
const CCollisionQueryParams& Params碰撞查询参数。
const collision_response_params_t& ResponseParam碰撞响应参数。

返回值(bool):是否有阻挡(Block)碰撞结果。

按碰撞预设查询

LineTraceTestByProfile
bool LineTraceTestByProfile(CXMVECTOR vStart, CXMVECTOR vEnd,
STRINGID ProfileName,
const CCollisionQueryParams& Params = CCollisionQueryParams());
参数说明
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
STRINGID ProfileName碰撞预设名称。
const CCollisionQueryParams& Params碰撞查询参数。

返回值(bool):是否有阻挡(Block)碰撞结果。


LineTraceSingleByProfile
bool LineTraceSingleByProfile(hit_result_t& OutHit, CXMVECTOR vStart, 
CXMVECTOR vEnd, STRINGID ProfileName,
const CCollisionQueryParams& Params = CCollisionQueryParams());
参数说明
hit_result_t& OutHit距离起始点最近的阻挡(Block)碰撞结果。
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
STRINGID ProfileName碰撞预设名称。
const CCollisionQueryParams& Params碰撞查询参数。

返回值(bool):是否有阻挡(Block)碰撞结果。


LineTraceMultiByProfile
bool LineTraceMultiByProfile(TArray<hit_result_t, 1>& OutHits, 
CXMVECTOR vStart, CXMVECTOR vEnd, STRINGID ProfileName,
const CCollisionQueryParams& Params = CCollisionQueryParams());
参数说明
TArray<hit_result_t, 1>& OutHits距离起始点最近的阻挡(Block)碰撞结果 + 起始点到最近的阻挡(Block)碰撞结果之间,所有的重叠(Overlap)碰撞结果。
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
STRINGID ProfileName碰撞预设名称。
const CCollisionQueryParams& Params碰撞查询参数。

返回值(bool):是否有阻挡(Block)碰撞结果。

重叠检测

按对象类型查询

OverlapAnyTestByObjectType
bool OverlapAnyTestByObjectType(CXMVECTOR vPos, CXMVECTOR vQuatRot,
const collision_object_query_params_t& ObjectQueryParams,
const CCollisionShape& CollisionShape,
const CCollisionQueryParams& Params = CCollisionQueryParams());
参数说明
CXMVECTOR vPos碰撞检测位置。
CXMVECTOR vQuatRot碰撞体旋转。
const collision_object_query_params_t& ObjectQueryParams按对象类型查询参数。
const CCollisionShape& CollisionShape碰撞体外观。
const CCollisionQueryParams& Params碰撞查询参数。

返回值(bool):是否有阻挡(Block)碰撞结果。


OverlapMultiByObjectType
bool OverlapMultiByObjectType(TArray<overlap_result_t, 1>& OutOverlaps,
CXMVECTOR vPos, CXMVECTOR vQuatRot,
const collision_object_query_params_t& ObjectQueryParams,
const CCollisionShape& CollisionShape,
const CCollisionQueryParams& Params = CCollisionQueryParams());
参数说明
TArray<overlap_result_t, 1>& OutOverlaps碰撞体范围内所有类型匹配的结果。
CXMVECTOR vPos碰撞检测位置。
CXMVECTOR vQuatRot碰撞体旋转。
const collision_object_query_params_t& ObjectQueryParams按对象类型查询参数。
const CCollisionShape& CollisionShape碰撞体外观
const CCollisionQueryParams& Params碰撞查询参数。

返回值(bool):是否有阻挡(Block)碰撞结果。

按通道和碰撞响应参数查询

OverlapAnyTestByChannel
bool OverlapAnyTestByChannel(CXMVECTOR vPos, CXMVECTOR vQuatRot,
COLLISION_CHANNEL nTraceChannel, const CCollisionShape& CollisionShape,
const CCollisionQueryParams& Params = CCollisionQueryParams(),
const collision_response_params_t& ResponseParam = collision_response_params_t::DefaultResponseParam);
参数说明
CXMVECTOR vPos碰撞检测位置。
CXMVECTOR vQuatRot碰撞体旋转。
COLLISION_CHANNEL nTraceChannel碰撞通道类型。
const CCollisionShape& CollisionShape碰撞体外观。
const CCollisionQueryParams& Params碰撞查询参数。
const collision_response_params_t& ResponseParam碰撞响应参数。

返回值(bool):是否有阻挡(Block)碰撞结果。


OverlapBlockingTestByChannel
bool OverlapBlockingTestByChanne1(CXMVECTOR vPos, CXMVECTOR vQuatRot, 
COLLISION_CHANNEL nTraceChannel, const CCollisionShape& CollisionShape,
const CCollisionQueryParams& Params = CCollisionQueryParams(),
const collision_response_params_t& ResponseParam = collision_response_params_t::DefaultResponseParam);
参数说明
CXMVECTOR vPos碰撞检测位置。
CXMVECTOR vQuatRot碰撞体旋转。
COLLISION_CHANNEL nTraceChannel碰撞通道类型。
const CCollisionShape& CollisionShape碰撞体外观。
const CCollisionQueryParams& Params碰撞查询参数。
const collision_response_params_t& ResponseParam碰撞响应参数。

返回值(bool):是否有阻挡(Block)碰撞结果。

OverlapAnyTestByChannel的区别是,OverlapAnyTestByChannel会检测碰撞体范围内,碰撞响应为阻挡(Block)重叠(Overlap)的结果。而OverlapBlockingTestByChannel仅检测碰撞响应为阻挡(Block)的结果。


OverlapMultiByChannel
bool OverlapMultiByChannel(TArray<overlap_result_t, 1>& OutOverlaps, 
CXMVECTOR vPos, CXMVECTOR vQuatRot,
COLLISION_CHANNEL nTraceChannel, const CCollisionShape& CollisionShape,
const CCollisionQueryParams& Params = CCollisionQueryParams(),
const collision_response_params_t& ResponseParam = collision_response_params_t::DefaultResponseParam);
参数说明
TArray<overlap_result_t, 1>& OutOverlaps碰撞体范围内所有的阻挡(Block)和重叠(Overlap)碰撞结果。
CXMVECTOR vPos碰撞检测位置。
CXMVECTOR vQuatRot碰撞体旋转。
COLLISION_CHANNEL nTraceChannel碰撞通道类型。
const CCollisionShape& CollisionShape碰撞体外观。
const CCollisionQueryParams& Params碰撞查询参数。
const collision_response_params_t& ResponseParam碰撞响应参数。

返回值(bool):是否有阻挡(Block)碰撞结果。

按碰撞预设查询

OverlapMultiByProfile
bool OverlapMultiByProfile(TArray<overlap_result_t, 1>& OutOverlaps, 
CXMVECTOR vPos, CXMVECTOR vQuatRot, STRINGID ProfileName,
const CCollisionShape& CollisionShape,
const CCollisionQueryParams& Params = CCollisionQueryParams());
参数说明
TArray<overlap_result_t, 1>& OutOverlaps碰撞体范围内所有的阻挡(Block)和重叠(Overlap)碰撞结果。
CXMVECTOR vPos碰撞检测位置。
CXMVECTOR vQuatRot碰撞体旋转。
STRINGID ProfileName碰撞预设名称。
const CCollisionShape& CollisionShape碰撞体外观。
const CCollisionQueryParams& Params碰撞查询参数。

返回值(bool):是否有阻挡(Block)碰撞结果。

按组件查询

ComponentOverlapMulti
bool ComponentOverlapMulti(TArray<overlap_result_t, 1>& OutOverlaps, 
LPrimitiveComponent* pPrimComp, CXMVECTOR vPos, CXMVECTOR vQuatRot,
const CComponentQueryParams& Params);
参数说明
TArray<overlap_result_t, 1>& OutOverlaps碰撞体范围内所有的阻挡(Block)和重叠(Overlap)碰撞结果。
LPrimitiveComponent* pPrimComp组件对象指针。
CXMVECTOR vPos碰撞检测位置。
CXMVECTOR vQuatRot碰撞体旋转。
const CComponentQueryParams& Params碰撞查询参数。

返回值(bool):是否有阻挡(Block)碰撞结果。

扫描检测

按对象类型查询

SweepTestByObjectType
bool SweepTestByObjectType(CXMVECTOR vStart, CXMVECTOR vEnd, CXMVECTOR vQuatRot, 
const collision_object_query_params_t& ObjectQueryParams,
const CCollisionShape& CollisionShape,
const CCollisionQueryParams& Params = CCollisionQueryParams());
参数说明
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
CXMVECTOR vQuatRot碰撞体旋转。
const collision_object_query_params_t& ObjectQueryParams按对象类型查询参数。
const CCollisionShape& CollisionShape碰撞体外观。
const CCollisionQueryParams& Params碰撞查询参数。

返回值(bool):是否有阻挡(Block)碰撞结果。


SweepSingleByObjectType
bool SweepSingleByObjectType(hit_result_t& OutHit, CXMVECTOR vStart,
CXMVECTOR vEnd, CXMVECTOR vQuatRot,
const collision_object_query_params_t& ObjectQueryParams,
const CCollisionShape& CollisionShape,
const CCollisionQueryParams& Params = CCollisionQueryParams());
参数说明
hit_result_t& OutHit距离起始点最近的阻挡(Block)碰撞结果。
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
CXMVECTOR vQuatRot碰撞体旋转。
const collision_object_query_params_t& ObjectQueryParams按对象类型查询参数。
const CCollisionShape& CollisionShape碰撞体外观。
const CCollisionQueryParams& Params碰撞查询参数。

返回值(bool):是否有阻挡(Block)碰撞结果。


SweepMultiByObjectType
bool SweepMultiByObjectType(TArray<hit_result_t, 1>& OutHits,
CXMVECTOR vStart, CXMVECTOR vEnd, CXMVECTOR vQuatRot,
const collision_object_query_params_t& ObjectQueryParams,
const CCollisionShape& CollisionShape,
const CCollisionQueryParams& Params = CCollisionQueryParams());
参数说明
TArray<hit_result_t, 1>& OutHits距离起始点最近的阻挡(Block)碰撞结果 + 起始点到最近的阻挡(Block)碰撞结果之间,所有的重叠(Overlap)碰撞结果。
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
CXMVECTOR vQuatRot碰撞体旋转。
const collision_object_query_params_t& ObjectQueryParams按对象类型查询参数。
const CCollisionShape& CollisionShape碰撞体外观。
const CCollisionQueryParams& Params碰撞查询参数。

返回值(bool):是否有阻挡(Block)碰撞结果。

按通道和碰撞响应参数查询

SweepTestByChannel
bool SweepTestByChannel(CXMVECTOR vStart, CXMVECTOR vEnd, CXMVECTOR vQuatRot,
COLLISION_CHANNEL TraceChannel, const CCollisionShape& CollsionShape,
const CCollisionQueryParams& Params = CCollisionQueryParams(),
const collision_response_params_t& ResponseParam = collision_response_params_t::DefaultResponseParam);
参数说明
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
CXMVECTOR vQuatRot碰撞体旋转。
COLLISION_CHANNEL TraceChannel碰撞通道类型。
const CCollisionShape& CollisionShape碰撞体外观。
const CCollisionQueryParams& Params碰撞查询参数。
const collision_response_params_t& ResponseParam碰撞响应参数。

返回值(bool):是否有阻挡(Block)碰撞结果


SweepSingleByChannel
bool SweepSingleByChannel(hit_result_t& OutHit, CXMVECTOR vStart,
CXMVECTOR vEnd, CXMVECTOR vQuatRot, COLLISION_CHANNEL nTraceChannel,
const CCollisionShape& CollisionShape,
const CCollisionQueryParams& Params = CCollisionQueryParams(),
const CCollision_response_params_t& ResponseParam = collision_response_params_t::DefaultResponseParam);
参数说明
hit_result_t& OutHit距离起始点最近的阻挡(Block)碰撞结果。
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
CXMVECTOR vQuatRot碰撞体旋转。
COLLISION_CHANNEL nTraceChannel碰撞通道类型。
const CCollisionShape& CollisionShape碰撞体外观。
const CCollisionQueryParams& Params碰撞查询参数。
const collision_response_params_t& ResponseParam碰撞响应参数。

返回值(bool):是否有阻挡(Block)碰撞结果。


SweepMultiByChannel
bool SweepMultiByChannel(TArray<hit_result_t, 1>& OutHits,
CXMVECTOR vStart, CXMVECTOR vEnd, CXMVECTOR vQuatRot,
COLLISION_CHANNEL TraceChannel, const CCollisionShape& CollisionShape,
const CCollisionQueryParams& Params = CCollisionQueryParams(),
const collision_response_params_t& ResponseParam = collision_response_params_t::DefaultResponseParam);
参数说明
TArray<hit_result_t, 1>& OutHits距离起始点最近的阻挡(Block)碰撞结果 + 起始点到最近的阻挡(Block)碰撞结果之间,所有的重叠(Overlap)碰撞结果。
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
CXMVECTOR vQuatRot碰撞体旋转。
COLLISION_CHANNEL TraceChannel碰撞通道类型。
const CCollisionShape& CollisionShape碰撞体外观。
const CCollisionQueryParams& Params碰撞查询参数。
const collision_response_params_t& ResponseParam碰撞响应参数。

返回值(bool):是否有阻挡(Block)碰撞结果

按碰撞预设查询

SweepTestByProfile
bool SweepTestByProfile(CXMVECTOR vStart, CXMVECTOR vEnd, CXMVECTOR vQuatRot,
STRINGID ProfileName, const CCollisionShape& CollisionShape,
const CCollisionQueryParams& Params);
参数说明
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
CXMVECTOR vQuatRot碰撞体旋转。
STRINGID ProfileName碰撞预设名称。
const CCollisionShape& CollisionShape碰撞体外观。
const CCollisionQueryParams& Params碰撞查询参数。

返回值(bool):是否有阻挡(Block)碰撞结果


SweepSingleByProfile
bool SweepSingleByProfile(hit_result_t& OutHit, CXMVECTOR vStart,
CXMVECTOR vEnd, CXMVECTOR vQuatRot, STRINGID ProfileName,
const CCollisionShape& CollisionShape,
const CCollisionQueryParams& Params = CCollisionQueryParams());
参数说明
hit_result_t& OutHit距离起始点最近的阻挡(Block)碰撞结果。
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
CXMVECTOR vQuatRot碰撞体旋转。
STRINGID ProfileName碰撞预设名称。
const CCollisionShape& CollisionShape碰撞体外观。
const CCollisionQueryParams& Params碰撞查询参数。

返回值(bool):是否有阻挡(Block)碰撞结果


SweepMultiByProfile
bool SweepMultiByProfile(TArray<hit_result_t, 1>& OutHits,
CXMVECTOR vStart, CXMVECTOR vEnd, CXMVECTOR vQuatRot,
STRINGID ProfileName, const CCollisionShape& CollisionShape,
const CCollisionQueryParams& Params = CCollisionQueryParams());
参数说明
TArray<hit_result_t, 1>& OutHits距离起始点最近的阻挡(Block)碰撞结果 + 起始点到最近的阻挡(Block)碰撞结果之间,所有的重叠(Overlap)碰撞结果。
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
CXMVECTOR vQuatRot碰撞体旋转。
STRINGID ProfileName碰撞预设名称。
const CCollisionShape& CollisionShape碰撞体外观。
const CCollisionQueryParams& Params碰撞查询参数。

返回值(bool):是否有阻挡(Block)碰撞结果。

按组件查询

ComponentSweepMulti
bool ComponentSweepMulti(TArray<hit_result_t, 1>& OutHits,
LPrimitiveComponent* pPrimComp, CXMVECTOR vStart, CXMVECTOR vEnd,
CXMVECTOR vQuatRot, const CComponentQueryParams& Params);
参数说明
TArray<hit_result_t, 1>& OutHits距离起始点最近的阻挡(Block)碰撞结果 + 起始点到最近的阻挡(Block)碰撞结果之间,所有的重叠(Overlap)碰撞结果。
LPrimitiveComponent* pPrimComp组件对象指针。
CXMVECTOR vStart碰撞检测起始位置。
CXMVECTOR vEnd碰撞检测结束位置。
CXMVECTOR vQuatRot碰撞体旋转。
const CComponentQueryParams& Params碰撞查询参数。

返回值(bool):是否有阻挡(Block)碰撞结果

LPhyPickupComponent

属性说明

属性说明
启用查询(Enable Query)碰撞检测开关。启用查询(Enable Query) == true时,组件会对场景每帧做碰撞检测。
查询类型(Query Type)碰撞检测类型。
  • 射线检测(Raycast)
  • 重叠检测(Overlap)
忽略阻挡(Ignore Block)是否忽略所有阻挡(Block)结果。
忽略重叠(Ignore Overlap)是否忽略所有重叠(Overlap)结果。

射线检测(Raycast)

image-20230519104431408

属性说明
主轴(Main Axis)指定坐标轴向量,作为射线方向。
距离(Distance)射线长度。
多重查询(Query Multi)是否返回多个查询结果。
两侧拾取(Pick Both Sides)是否开启双面查询。

重叠检测(Overlap)

image-20230518175856917

属性说明
碰撞体组件(Collider Component)组件对象。 当指定了组件对象后,会使用指定组件做碰撞检测。
几何体类型(Geom Type)碰撞体类型。
  • 盒子体(Box)
  • 球体(Sphere)
  • 胶囊体(Capsule)
X轴范围(Extent X)盒子体X轴的长度。几何体类型(Geom Type) == 盒子体(Box)时生效。
Y轴范围(Extent Y)盒子体Y轴的长度。几何体类型(Geom Type) == 盒子体(Box)时生效。
Z轴范围(Extent Z)盒子体Z轴的长度。几何体类型(Geom Type) == 盒子体(Box)时生效。
半径(Radius)胶囊体或球体的半径。
几何体类型(Geom Type) == 球体(Sphere)或几何体类型(Geom Type) == 胶囊体(Capsule)时生效。
半高(Half Height)胶囊体半高。
几何体类型(Geom Type) == 胶囊体(Capsule)时生效。