3D物理系统

在3D世界中我们经常会遇到一些游戏需要模拟真实的物理运动,例如赛车游戏中汽车飞跃拱桥时的斜抛运动,两辆车碰撞后互相弹开, 在终点处旗子跟随风飘荡等,都需要用到物理系统。引擎引入了PhysX库来实现物理系统。

开发人员可以参考PhysX开发人员指南

1. 3D物理系统的使用

1.1. 物理系统资源文件

物理系统的资源文件格式是(*.phy), 可以在[物理编辑器](../magic_cube_editor/physics_editor.md)进行编辑。

1.2. 静态网格模型使用物理系统

    local pActor = world:Create(XEStaticMeshActor.Actor_TypeName);
    ---@type XEModelComponent
    local pComponent = pActor:GetRootComponent();
    ---加载物理资源文件 
    ---第一个参数是资源文件地址 文件格式是.phy
    ---第二个参数是类型 区分静态和动态 RAT_STATIC为静态类型
    ---返回值是是否加载成功
    local bSuccess = pComponent:LoadPhysicalAsset(szPath, RAT_STATIC);
    ---同样也可以通过接口来判断是否加载物理资源
    local bLoaded = pComponent:IsLoadedPhysicalRes();
    ---我们也可以移除物理资源
    local bSuccess = pComponent:RemovePhysicalAsset();

资源加载完成之后,我们可以对其属性进行修改

    ---我们可以设置Actor是否受重力影响
    pComponent:SetGravityEnabled(true);
    ---然后获取看看它是否受重力影响了
    local bGravity = pComponent:IsGravityEnabled(); ---bGravity == true
    ---设置是否启用物理模拟
    pComponent:SetSimulatePhysics(true);
    ---看看它是否进行物理模拟
    local bSimulate = pComponent:IsSimulatePhysics();   ---bSimulate == true
    ---设置刚体的质量
    pComponent:SetMass(fMass)
    ---获取刚体只想
    local fMass = pComponent:GetMess()
    ---设置刚体线性运动阻尼
    pComponent:SetLinearDamping(fLinearDamping)
    ---获取刚体线性运动阻尼
    local fLinearDamping = pComponent:GetLinearDamping();
    ---设置刚体角速度阻尼
    pComponent:SetAndularDamping(fAngularDamping)
    ---获取角速度阻尼
    local fAngularDamping = pComponent:GetAngularDamping();
    ---设置线性速度和角速度
    pComponent:SetLinearVelocity(vVelocity)
    pComponent:SetAngularVelocity(fVelocity)
    ---获取线速度和角速度
    local vVelocity = pComponent:GetLinearVelocity();
    local fVelocity = pComponent:GetAngularVelocity();
    ---是否启用连续碰撞检测
    pComponent:SetRigidCCDEnabled(false);

1.3. 动态网格模型使用物理系统

local pActor = world:CreateActor(XEAnimationMeshActor.ACTOR_TYPENAME);
---@type XEAnimatableModelComponent
local pComponent = pActor:GetRootComponent()
---加载物理资源文件
---第一个参数是资源路径 .phy格式
---第二个参数是刚体类型 RAT_DYNAMIC是动态刚体类型
local bSuccess = pComponent:LoadPhysicalAsset(szAsset, RAT_DYNAMIC)

关于动态模型物理系统属性设置大多数和静态模型是一样的 这里我们说几个不一样的

    ---设置是否渲染全部刚体 在Debug下使用
    pComponent:SetRenderBodyShapeDebug(bRender)
    ---创建物理骨骼根实例
    pComponent:BuildPhysicsSkeletalRootInstance()
    ---销毁物理骨骼根实例
    pComponent:DestoryPhysicsSkeletalRootInstance()
    ---创建一个骨骼物理实例
    ---1. 获取ModelInstance
    local pModelInstance = pComponent:GetModelInstance()
    ---2. 通过PhysicalManager创建骨骼物理实例
    local pPhysicalIns = xe.Director:GetInstance():GetEngine():GetPhysicalMananger():CreateSkeletalPhysicsInstance(szPath, pModelInstance, pOwningScene)
    ---3. 设置到pComponent中
    pComponent:SetIXSkeletalPhysicsInstance(pPhysicalIns);
    ---创建骨骼物理实例的第二种放啊
    pComponent:CreateSkeletalPhysicsInstance()
@Copyright © cosmos 2019 all right reserved,powered by Gitbook修订时间: 2021-04-12 18:28:15

results matching ""

    No results matching ""