Skip to content

碰撞体

物理系统通过碰撞体组件定义物体的物理轮廓,这是物理交互的基础,碰撞体无需与网格完全匹配,合理的简化形状既能保证性能,又不影响游戏体验。

当前碰撞体支持:盒子碰撞体、胶囊碰撞体、平面碰撞体、球碰撞体、网格碰撞体。

脚本:NColloderComponent.h

接口描述
void SetIsTrigger(bool value);
bool GetIsTrigger();
可设置是否为触发器模式
void SetIsTrigger(bool value);
bool GetIsTrigger();
可设置静摩擦系数
void SetDynamicFriction(float value);
float GetDynamicFriction();
可设置动摩擦系数
void SetRestitution(float value);
float GetRestitution();
可设置弹性系数
void SetCenterPos(const Vector3& pos);
Vector3 GetCenterPos()const;
可设置碰撞体相对物体局部空间的位置
Quaternion GetRotation() const;可启用调试模式
接口:
cpp
void AddTriggerEnterCallback(std::function<void(NSharedPtr<NColliderComponent>)>&);
void AddTriggerStayCallback(std::function<void(NSharedPtr<NColliderComponent>)>&);
void AddTriggerExitCallback(std::function<void(NSharedPtr<NColliderComponent>)>&);
void AddCollisionEnterCallback(std::function<void(NSharedPtr<NColliderComponent>)>&);
void AddCollisionStayCallback(std::function<void(NSharedPtr<NColliderComponent>)>&);
void AddCollisionExitCallback(std::function<void(NSharedPtr<NColliderComponent>)>&);

描述:向物理系统注册碰撞、触发回调函数。

接口:

cpp
void RemoveTriggerEnterCallback(const std::function<void(NSharedPtr<NColliderComponent>)>&);
void RemoveTriggerStayCallback(const std::function<void(NSharedPtr<NColliderComponent>)>&);
void RemoveTriggerExitCallback(const std::function<void(NSharedPtr<NColliderComponent>)>&);
void RemoveCollisionEnterCallback(const std::function<void(NSharedPtr<NColliderComponent>)>&);
void RemoveCollisionStayCallback(const std::function<void(NSharedPtr<NColliderComponent>)>&);
void RemoveCollisionExitCallback(const std::function<void(NSharedPtr<NColliderComponent>)>&);

描述:从物理系统移除碰撞、触发回调函数。

盒碰撞器

alt text

属性功能
触发器启用该属性时,碰撞体将用于触发事件,并被物理系统忽略
矩形内长/内高/内宽碰撞体在X/Y/Z方向上的大小
中心坐标X/Y/Z碰撞体在对象局部空间中的位置
物理材质使用物理材质可确定该碰撞体与其他对象的交互方式

脚本:NBoxColliderComponent.h
接口:

cpp
void SetHalfExtentX(float value);  
float GetHalfExtentX();  
void SetHalfExtentY(float value);  
float GetHalfExtentY();  
void SetHalfExtentZ(float value);  
float GetHalfExtentZ();

描述:设置包围盒的大小

球碰撞器

alt text

属性功能
触发器启用该属性时,碰撞体将用于触发事件,并被物理系统忽略
圆半径球碰撞体的半径,三轴具有相同的值
中心坐标X/Y/Z碰撞体在对象局部空间中的位置
物理材质使用物理材质可确定该碰撞体与其他对象的交互方式

脚本:NSphereColliderComponent.h
接口:

cpp
void SetSphereRadius(float value);  
float GetSphereRadius();

描述:可设置球碰撞体的半径大小

平面碰撞器

alt text

属性功能
触发器启用该属性时,碰撞体将用于触发事件,并被物理系统忽略
矩形内长/内高平面碰撞器的大小
中心坐标X/Y/Z碰撞体在对象局部空间中的位置
物理材质使用物理材质可确定该碰撞体与其他对象的交互方式

脚本:NPlaneColliderComponent.h
接口:

cpp
void SetHalfExtentY(float value);

描述:设置碰撞体大小

胶囊碰撞器

alt text

触发器启用该属性时,碰撞体将用于触发事件,并被物理系统忽略
中心坐标X/Y/Z碰撞体在对象局部空间中的位置
半径胶囊体两端半球的半径
半高胶囊体高度的一半
胶囊体方向碰撞器的方向,可设置为x轴,y轴,z轴
物理材质使用物理材质可确定该碰撞体与其他对象的交互方式

网格碰撞器

网格碰撞器为物体的网格构建碰撞体,在进行碰撞检测时,其更为复杂、精准。 alt text
脚本:NMeshColliderComponent.h
接口:

cpp
void SetCustomMeshData(const std::vector<Tmpl_Vector3\<float>>& vertices, const std::vector\<uint32>& indices);

参数:

  • vertices:网格顶点数据
  • indices:网格索引数据

描述:使用指定顶点数据与索引数据构建网格碰撞体。
示例代码:

cpp
void Test()
{
    auto sphere = NActorManager::GetActor("Sphere_1");
    sphere->AddComponent<NRigidBodyComponent>();
    sphere->AddComponent<NSphereColliderComponent>();
    auto cube = NActorManager::GetActor("Cube_1");
    auto cubeColli = cube->AddComponent<NBoxColliderComponent>();
    callback = [&](NColliderComponentPtr ptr)
    {
        LogEngine("=============%s", ptr->GetNActor()->GetName().c_str());
    };
    cubeColli->AddCollisionEnterCallback(callback);
}