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()