2021SC@SDUSC

上篇我们进行flax Engine游戏引擎中物理引擎中physics(物理)内容的部分分析。讲述了光线和模拟物理系统中的一些函数定义和变量的源代码,本次我们紧接着上次的内容继续对flax Engine物理引擎中最关键的内容physics进行源代码的分析。

    API_FUNCTION() static bool SphereCast(const Vector3& center, float radius, const Vector3& direction, float maxDistance = MAX_float, uint32 layerMask = MAX_uint32, bool hitTriggers = true);

此函数的功能是使用球体几何体对场景中的对象执行扫描测试。

参数为1:center 球体中心的位置 2:radius:球体半径 3:direction:投射球体的标准化方向 4:maxDistance:光线应检查碰撞的最大距离 5:layerMask:将命中触发器,否则将跳过它们 5:hitTriggers:如果球体命中匹配对象,则为True,否则为false。

    API_FUNCTION() static bool SphereCastAll(const Vector3& center, float radius, const Vector3& direction, API_PARAM(Out) Array<RayCastHit, HeapAllocation>& results, float maxDistance = MAX_float, uint32 layerMask = MAX_uint32, bool hitTriggers = true);

此函数的功能是使用球体几何体对场景中的所有对象执行扫描测试。

与上述方法不同的是参数多了一个results:结果命中,仅当方法返回true时有效。

    API_FUNCTION() static bool CapsuleCast(const Vector3& center, float radius, float height, const Vector3& direction, const Quaternion& rotation = Quaternion::Identity, float maxDistance = MAX_float, uint32 layerMask = MAX_uint32, bool hitTriggers = true);

此函数的功能是使用胶囊几何体对场景中的对象执行扫描测试。

相关参数:1:center:胶囊中心 2:radius:胶囊的半径 3:height:胶囊的高度,不包括顶部和底部球体 4:diection:投射胶囊的标准化方向 5:rotation:胶囊旋转 6:maxDIstance:光线应检查碰撞的最大距离 7:layerMask:如果设置为<c>true,将命中触发器,否则将跳过它们 8:返回值:如果胶囊命中匹配对象,则为True,否则为false。

    API_FUNCTION() static bool CapsuleCastAll(const Vector3& center, float radius, float height, const Vector3& direction, API_PARAM(Out) Array<RayCastHit, HeapAllocation>& results, const Quaternion& rotation = Quaternion::Identity, float maxDistance = MAX_float, uint32 layerMask = MAX_uint32, bool hitTriggers = true);

此函数的功能是使用胶囊几何体对场景中的所有对象执行扫描测试。

与上述函数的区别是多一个参数:result 结果命中。仅当方法返回true时有效。

    API_FUNCTION() static bool ConvexCast(const Vector3& center, const CollisionData* convexMesh, const Vector3& scale, const Vector3& direction, const Quaternion& rotation = Quaternion::Identity, float maxDistance = MAX_float, uint32 layerMask = MAX_uint32, bool hitTriggers = true);

此函数的功能是使用凸面网格对场景中的对象执行扫描测试。

相关参数:1:center :凸面网格中心 2:convexMesh :凸面网格的比例 3:scale:投影凸面网格的规格化方向 4:direction:投影凸面网格的规格化方向 5:rotation:凸面网格旋转 6:maxDistance:光线应检查碰撞的最大距离 7:hitTiggers: 如果设置为<c>true,将命中触发器,否则将跳过它们 8:返回值:如果凸面网格命中匹配对象,则为True,否则为false。

    API_FUNCTION() static bool ConvexCastAll(const Vector3& center, const CollisionData* convexMesh, const Vector3& scale, const Vector3& direction, API_PARAM(Out) Array<RayCastHit, HeapAllocation>& results, const Quaternion& rotation = Quaternion::Identity, float maxDistance = MAX_float, uint32 layerMask = MAX_uint32, bool hitTriggers = true);

此函数的功能是使用凸面网格对场景中的所有对象执行扫描测试。

于上述函数相比结果命中。仅当方法返回true时有效。

    API_FUNCTION() static bool CheckBox(const Vector3& center, const Vector3& halfExtents, const Quaternion& rotation = Quaternion::Identity, uint32 layerMask = MAX_uint32, bool hitTriggers = true);

此函数检查给定框是否与其他碰撞器重叠。

相关参数:1center:框的中心 2:halfExtents:框在每个方向上的一半大小 3:rotation框旋转 4:hitTriggers:如果设置为<c>true,将命中触发器,否则将跳过它们 5:返回值如果框与任何匹配对象重叠,则为True,否则为false。

API_FUNCTION() static bool OverlapSphere(const Vector3& center, float radius, API_PARAM(Out) Array<Collider*, HeapAllocation>& results, uint32 layerMask = MAX_uint32, bool hitTriggers = true);

此函数是查找与给定球体接触或位于其内部的所有碰撞器。

相关参数:1:center:球体中心 2:radius:球体的半径 3:result:与给定球体重叠的结果碰撞器。仅当方法返回true时有效 4:hitTriggers:如果设置为<c>true,将命中触发器,否则将跳过它们。

.h文件中的public 公共函数:

1:启动函数,用来启动引擎的物理模拟

    API_FUNCTION() static void Simulate(float dt);

在主机循环期间调用以启动物理模拟。之后使用CollectResults。

参数:三角洲时间。

.c文件中此函数的具体实现。

void Physics::Simulate(float dt)
{ASSERT(IsInMainThread() && !_isDuringSimulation);ASSERT(CPhysX);const auto& settings = *PhysicsSettings::Get();// Flush the old/new objects and the other requests before the simulationFlushRequests();// Clamp deltadt = Math::Clamp(dt, 0.0f, settings.MaxDeltaTime);// Prepare util objectsif (ScratchMemory == nullptr){ScratchMemory = Allocator::Allocate(SCRATCH_BLOCK_SIZE, 16);}if (Stepper == nullptr){Stepper = New<FixedStepper>();}if (settings.EnableSubstepping){// Use substepsStepper->Setup(settings.SubstepDeltaTime, settings.MaxSubsteps);}else{// Use single stepStepper->Setup(dt);}// Start simulation (may not be fired due to too small delta time)_isDuringSimulation = true;if (Stepper->advance(PhysicsScene, dt, ScratchMemory, SCRATCH_BLOCK_SIZE) == false)return;EventsCallback.Clear();LastDeltaTime = dt;// TODO: move this call after rendering doneStepper->renderDone();
}

FlushRequests();在模拟之前刷新旧/新对象和其他请求

dt = Math::Clamp(dt, 0.0f, settings.MaxDeltaTime);抓紧

//准备util对象

if (ScratchMemory == nullptr)
    {
        ScratchMemory = Allocator::Allocate(SCRATCH_BLOCK_SIZE, 16);
    }
    if (Stepper == nullptr)
    {
        Stepper = New<FixedStepper>();
    }
    if (settings.EnableSubstepping)
    {
        // 使用子同步
        Stepper->Setup(settings.SubstepDeltaTime, settings.MaxSubsteps);
    }
    else
    {
        //使用单步
        Stepper->Setup(dt);
    }

启动模拟

if (Stepper->advance(PhysicsScene, dt, ScratchMemory, SCRATCH_BLOCK_SIZE) == false)
        return;

渲染完成后移动此调用

Stepper->renderDone();

2:公共函数:在主机循环期间调用,以收集物理模拟结果并将其应用于火灾碰撞事件。

    API_FUNCTION() static void CollectResults();

在.c文件中的实现:

由于此函数的实现很长,我们在此仅仅对其重要的内容进行源代码的分析工作。

    if (!_isDuringSimulation)return;ASSERT(IsInMainThread());ASSERT(CPhysX && Stepper);{PROFILE_CPU_NAMED("Physics.Fetch");// Gather results (with waiting for the end)Stepper->wait(PhysicsScene);}

首先:等待收集结果

if (WheelVehicles.HasItems()):如果有车

直接改变驾驶模式时自动换档

WheelVehiclesCache.Clear();
        WheelVehiclesCache.EnsureCapacity(WheelVehicles.Count());
        int32 wheelsCount = 0;
        for (auto wheelVehicle : WheelVehicles)
        {.........}

更新批次查询缓存

if (wheelsCount > WheelQueryResults.Count())
        {
            if (WheelRaycastBatchQuery)
                WheelRaycastBatchQuery->release();
            WheelQueryResults.Resize(wheelsCount, false);
            WheelHitResults.Resize(wheelsCount, false);
            PxBatchQueryDesc desc(wheelsCount, 0, 0);
            desc.queryMemory.userRaycastResultBuffer = WheelQueryResults.Get();
            desc.queryMemory.userRaycastTouchBuffer = WheelHitResults.Get();
            desc.queryMemory.raycastTouchBufferSize = wheelsCount;
            desc.preFilterShader = WheelRaycastPreFilter;
            WheelRaycastBatchQuery = PhysicsScene->createBatchQuery(desc);
        }

3:公共函数:
检查物理模拟是否正在运行如果模拟处于活动状态,则为True,否则为false

    API_PROPERTY() static bool IsDuringSimulation();

.c文件中的相关源代码的现实:

bool Physics::IsDuringSimulation()
{
    return _isDuringSimulation;
}

直接返回相关bool变量。

(十三)Flax Engine游戏引擎物理引擎 physics(2)相关推荐

  1. (十二)Flax Engine游戏引擎物理引擎 physics

    2021SC@SDUSC 最后我们进行flax Engine游戏引擎中物理引擎中physics(物理)的分析,这个包中含有所有用到的物理系统的相关应用,包括四个大类的定义:1:物理对撞机 2:铰链 3 ...

  2. (十一)Flax Engine游戏引擎物理引擎 joints (关节)

    2021SC@SDUSC 本次我们继续针对flax Engine 游戏引擎中物理引擎的joints 包进行源代码的分析.上次我们分析了距离铰链和固定铰链,本次我们将针对flax Engine 中最后一 ...

  3. (九)flax Engine 游戏引擎物理引擎joints(关节)

    2021SC@SDUSC 前八次文章我们分析了flax Engine 游戏引擎中物理引擎的Actors(角色)包下的相关的源码的分析,从本次开始我们将针对flax Engine 游戏引擎中的物理引擎中 ...

  4. (五)flax Engine 游戏引擎——载具

    2021SC@SDUSC 上次我们讲述了flax Engine游戏引擎中的最基本的组成结构刚体和其源代码的分析.本次我将讲述flax Engine游戏引擎中的WheeledVehicle(载具)的相应 ...

  5. 游戏开发物理引擎PhysX研究系列:运行官方较完整的demo

    一.介绍: 官方本身就自带几个demo,包括RPG和Racing Game ​​​​​​  二.操作步骤: 下载DXSDK_Jun10.exe Download DirectX Software De ...

  6. Physics Engine - Car Games [ 物理引擎 - 赛车游戏 ]

    时间:2017/3/22 大三下学期 最近做完了一堆想要进一步学习的东西,便突然闲了下来,于是突然想用C++和OpenGL做一个赛车游戏,顺便练一下手.可是,真正上手起来发现,对于一款游戏而言,游戏引 ...

  7. 【Unity3d学习】使用物理引擎——打飞碟游戏的物理引擎改进与射箭游戏设计

    文章目录 写在前面 HitUFO的物理引擎改进版本 物理引擎的改进版本思路与实现 PhysicsAction PhysicsManager 新接口类IActionManager 动作管理器基类的变化 ...

  8. 开发实现物理加速度移动_无限法则开发经验分享:射击游戏的物理引擎应用和移动模拟...

    9月21日,由腾讯游戏学院举办的第三届TGDC(腾讯游戏开发者大会)在深圳举行.在大会的技术论坛中,<无限法则>服务器主程序唐骏以<无限法则>的项目经验为例,分享了在特性.物理 ...

  9. 开发实现物理加速度移动_《无限法则》开发经验分享:射击游戏的物理引擎应用和移动模拟...

    文/腾讯游戏学院 9月21日,由腾讯游戏学院举办的第三届TGDC(腾讯游戏开发者大会)在深圳举行.在大会的技术论坛中,<无限法则>服务器主程序唐骏以<无限法则>的项目经验为例, ...

最新文章

  1. 万能钥匙ctf--4-ReeHY-main调试记录--unlink
  2. VMware ESXI 虚拟磁盘工具 - vmkfstools 使用实例
  3. jquery自定义动画animate方法
  4. oracle 负载均衡连接方式常用SQL语句备忘录
  5. 如何解决终端图标显示异常?
  6. DirectoryEntry使用-实现域登录
  7. EMC理论基础知识——电磁屏蔽
  8. oracle多表关联索引用法,关联表查询和索引使用的探讨一则
  9. Chromium 手势插件
  10. sql server中binary怎么得到char类型
  11. 【Spring】IoC容器系列的设计与实现:BeanFactory和ApplicationContext
  12. Android App的设计架构:MVC,MVP,MVVM与架构经验谈
  13. xinxin - 初步学习tkinter
  14. 用wireshark捕捉查看登录时账号密码的传输方式
  15. unity 下载图片使用并保存在本地
  16. Gazebo机器人仿真
  17. 什么是json对象?
  18. 基于STM32F103智能小车黑线寻迹运动实验(有代码)
  19. 闪聚支付 第2章-对接SaaS以及用户认证OAuth2.0概述
  20. 基于socket实现FTP服务器

热门文章

  1. 约瑟夫问题I(由n个人坐成一圈,按顺时针由1开始给他们编号。然后由第一个人开始报数,数到m的人出局。现在需要求的是最后一个出局的人的编号。)
  2. 最大矩形面积——单调栈
  3. 学理财应该从哪些学起_从零开始学理财 这些入门知识你一定要牢记
  4. 008:vue+openlayers加载6种形式google地图(代码示例)
  5. 黑苹果 macOS 10.10 on vmware15安装流程
  6. Hack The Box——OpenKeyS
  7. AIP 封装与搭建及登录注册关于token的一些理解
  8. 使用Itext操作PDF,修改文本内容及指定位置插入图片
  9. 完整的境外、港澳台、电信、移动、联通、教育网、国内其他ISP的IPv4列表(数据整理日期2022年4月)-IP列表太长只能份2篇发布(2/2)
  10. 头歌 第7章 函数2(课后习题8~12)第1关:习题8 椰子数