碰撞体
物理系统通过碰撞体组件定义物体的物理轮廓,这是物理交互的基础,碰撞体无需与网格完全匹配,合理的简化形状既能保证性能,又不影响游戏体验。
当前碰撞体支持:盒子碰撞体、胶囊碰撞体、平面碰撞体、球碰撞体、网格碰撞体。
脚本: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>)>&);描述:从物理系统移除碰撞、触发回调函数。
盒碰撞器

| 属性 | 功能 |
|---|---|
| 触发器 | 启用该属性时,碰撞体将用于触发事件,并被物理系统忽略 |
| 矩形内长/内高/内宽 | 碰撞体在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();描述:设置包围盒的大小
球碰撞器

| 属性 | 功能 |
|---|---|
| 触发器 | 启用该属性时,碰撞体将用于触发事件,并被物理系统忽略 |
| 圆半径 | 球碰撞体的半径,三轴具有相同的值 |
| 中心坐标X/Y/Z | 碰撞体在对象局部空间中的位置 |
| 物理材质 | 使用物理材质可确定该碰撞体与其他对象的交互方式 |
脚本:NSphereColliderComponent.h
接口:
cpp
void SetSphereRadius(float value);
float GetSphereRadius();描述:可设置球碰撞体的半径大小
平面碰撞器

| 属性 | 功能 |
|---|---|
| 触发器 | 启用该属性时,碰撞体将用于触发事件,并被物理系统忽略 |
| 矩形内长/内高 | 平面碰撞器的大小 |
| 中心坐标X/Y/Z | 碰撞体在对象局部空间中的位置 |
| 物理材质 | 使用物理材质可确定该碰撞体与其他对象的交互方式 |
脚本:NPlaneColliderComponent.h
接口:
cpp
void SetHalfExtentY(float value);描述:设置碰撞体大小
胶囊碰撞器

| 触发器 | 启用该属性时,碰撞体将用于触发事件,并被物理系统忽略 |
|---|---|
| 中心坐标X/Y/Z | 碰撞体在对象局部空间中的位置 |
| 半径 | 胶囊体两端半球的半径 |
| 半高 | 胶囊体高度的一半 |
| 胶囊体方向 | 碰撞器的方向,可设置为x轴,y轴,z轴 |
| 物理材质 | 使用物理材质可确定该碰撞体与其他对象的交互方式 |
网格碰撞器
网格碰撞器为物体的网格构建碰撞体,在进行碰撞检测时,其更为复杂、精准。 
脚本: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);
}
