场景碰撞查询
概述
场景碰撞查询(碰撞检测)功能用于检测物理场景内物理对象及对象碰撞体表面信息。
碰撞检测类型
检测方法 | 说明 |
---|---|
射线(Raycast) | 射线碰撞检测。从场景中的起始位置向目标位置发射一条射线,检测射线路径上是否存在其他场景物体。![]() |
重叠(Overlap) | 重叠碰撞检测。使用碰撞体(球、胶囊或盒子),在场景指定位置检测碰撞体形状范围内是否存在其他场景物体。![]() |
扫描(Sweep) | 扫描碰撞检测。与射线碰撞检测类似,只是射线被替换为碰撞体(球、胶囊或盒子)。从场景的起始位置向目标位置方向移动碰撞体,并检测碰撞体扫过的路径上是否与其他场景物体碰撞。![]() |
碰撞体类型
碰撞体 | 说明 |
---|---|
球体(Sphere) | 球体通过一个半径参数来进行描述。球体原点在球体正中心。 |
盒子体(Box) | 盒子体通过长宽高三个参数来进行描述。盒子体原点在盒子体正中心。![]() |
胶囊体(Capsule) | 胶囊体通过半径和半高两组参数来进行描述。胶囊体方向延X轴方向延伸。胶囊体原点在胶囊体正中心。![]() |
碰撞响应类型
碰撞响应 | 说明 |
---|---|
阻挡 (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 fTime | fTime = 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) | 碰撞检测类型。
|
忽略阻挡(Ignore Block) | 是否忽略所有阻挡(Block)结果。 |
忽略重叠(Ignore Overlap) | 是否忽略所有重叠(Overlap)结果。 |
射线检测(Raycast)
属性 | 说明 |
---|---|
主轴(Main Axis) | 指定坐标轴向量,作为射线方向。 |
距离(Distance) | 射线长度。 |
多重查询(Query Multi) | 是否返回多个查询结果。 |
两侧拾取(Pick Both Sides) | 是否开启双面查询。 |
重叠检测(Overlap)
属性 | 说明 |
---|---|
碰撞体组件(Collider Component) | 组件对象。 当指定了组件对象后,会使用指定组件做碰撞检测。 |
几何体类型(Geom Type) | 碰撞体类型。
|
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)时生效。 |