游戏引擎架构----物理部分

游戏引擎开发 在游戏程式的领域中,经常会听到GameEngine(游戏引擎)这个东西。是否是听起来是个很炫很酷的名词?实际上游戏引擎一词它经常被过度泛称与误用。经常听到的游戏引擎架构,是由低阶(Low-Level)至高阶(High-Level)可细分为以下三个层级(Layer):   1.绘图API(例如:DirectX与OpenGL)   2.绘图引擎(例如:OGRE、Renderware与Game... 阅读详情
1. 碰撞检测系统
物理世界
形状:
  • 相交、
  • 接触(分离矢量,沿该矢量运动就能高效脱离碰撞妆容)、
  • 凸(由形状内发射的光线不会穿越形状两次以上)
原型:
  • 球体、
  • 胶囊体、
  • 轴对其包围盒AABB、
  • 定向包围盒OBB、
  • 离散定向多胞形discrete oriented polytope DOP、
  • 任意凸体积、
  • 多边形汤(碰撞引擎必须和每个三角形测试)、
  • 复合形状
碰撞测试:
  • 点和球体相交
  • 球体和球体相交
  • 分离轴定理:凸形状于该轴(分离轴)上的投影不重叠,能确定两个形状不相交。分离两个物体的轴/面称为分离线/面。三维空间中,分离轴仍然是个轴,分离线变成分离面。可以把形状逐一投影到各个潜在分离轴,并检查投影区间是否相交
  • AABB相交:分离轴定理。三个轴x,y,z。只有在三个轴都重叠,才是相交的。
  • 检测凸碰撞:GJK算法。依赖闵可夫斯基差:把A中的所有点与B中的所有点都成对相减,得到的集合就是闵可夫斯基差。当且仅当两个形状相交,闵可夫斯基差包含原点。GJK尝试在闵科夫斯基的凸包内,尝试找出一个包含原点的四面体。若找到,则相交。
  • 运动物体间的碰撞:
    • 离散的静态碰撞;
    • sweep shape扫琼形状做静态测试(结果不准确);
    • 连续碰撞检测continuous collision detection CCD,求出最早的冲击时间TOI
性能优化:
  • 利用时间一致性避免每帧重新计算一些类型的信息
  • 空间划分
  • 粗略阶段,中间阶段,精确阶段:先AABB测试哪些物体会碰撞;再用符合形状的逼近包围体检测;最终进行青雀的碰撞检测
  • 扫琼裁剪:sweep and prune,对各个膨胀提的AABB的最小,最大坐标再三个主轴上排序,然后通过遍历改有序表检测AABB之间是否重叠
碰撞查询:
  • 光线投射:投射的物体并不存在于碰撞世界,不会影响其他物体。返回一个t值,P = P0 + td
  • 形状投射:返回多个接触点。模拟玩家的脚
  • Phantom:查询碰撞体是否在其他指定体积里。对于其他碰撞体是透明的,也不参与动力学模拟。
碰撞过滤:决定碰撞体之间的接触是否成立
  • 碰撞掩码及碰撞层:掩码
  • 碰撞回调:回调函数按自己的条件决定接受或拒绝碰撞
  • 碰撞材质:包含碰撞属性,如音效,粒子效果,摩擦系数等等
2. 刚体动力学
6个自由度DOF
线性动力学(质点)
  • 线性速度&加速度
  • 力&动量
运动方程求解
  • 力作为函数:位置、速度、时间等的函数(常微分方程(ordinary differential equation ODE))。类似弹簧
  • 解析解:找到闭合式函数,描述所有可能的时间值t的刚体位置(例如抛物线),但是游戏中几乎不可能。
  • 常微分方程的数值解的特性:
    • 收敛性:delta_t趋近于0的时候,近似解趋近镇世界?
    • 阶数:误差是O(t^?)
    • 稳定性:数值解是否会稳定下来?
  • 数值积分:游戏引擎使用数值积分求解运动方程
    • 显示欧拉
pos(t2) = pos(t1) + v(t1)delta_t
v(t2) = v(t1) + F(t)/m * delta_t
实际是假设在该时间步中,物体速度维持不变。由于位置的斜率就是速度,实际上也能理解为导数的逼近。当delta_t趋近于0的时候是合法的
一阶方法,误差是O(t^2),准确度达到并包括delta_t一次方的泰勒级数
    • 韦尔莱积分
可以仅仅用到加速度就求解位置
pos(t1+delta_t) = 2pos(t1) - pos(t1-delta_t) + F(t1)/m * delta_t^2 + O(t^4)
v(t1+delta_t) = delta_pos / delta_t
    • 速度韦尔莱积分
pos(t+delta_t)= pos(t1) + v(t1)*delta_t + 0.5a(t1)*delta_+t^2
v(t+0.5delta_t) = v(t1) + 0.5a(t1)*delta_t
求a(t1+delta_t)  (假设a仅仅依赖位置,如果依赖速度,则需要先计算速度近似值)
v(t+delta_t) = v(t1) + 0.5a(t1)*delta_t + 0.5a(t2)*delta_t
旋转动力学(刚体)
  • 二维:
    • 定向:角度theta
    • 角速率&加速度:



    • 转动惯量moment of inertia:改变角速率的难易程度。用I表示
    • 力矩torque:用N表示
N=rxF
二维中力矩必然和z轴平行

    • 二维旋转方程求解:
显示欧拉逼近解:
  • 三维:
    • 惯性张量:inertia tensor,标记为I
Ixx,Iyy,Izz是刚体绕三个主轴的转动惯量。如果3个主轴对称,则对角线以外的元素(也叫惯量积)就是0
物理引擎中惯性张量简化为三元素矢量[Ixx, Iyy, Izz]
转动惯量:Izz(惯性张量沿转轴方向的主值)
    • 方向:
可以表示为3个欧拉角[theta_x, theta_y, theta_z],但是会有万向节死锁,所以也会用四元数q表示
q=[旋转轴u*sin(0.5 theta), cos(0.5 theta)]
    • 角速度:
矢量w:绕旋转轴u转角速度标量w=theta' * u
在无力矩情况下角速度能改变:角速度不守恒
但是角动量(angular momentum,表示为L)守恒。
L=[Lx, Ly, Lz]

由于w不守恒,所以不会像线性速度一般,视角速度为一个基本的两。角速度是第二级别的量,在确定了角动量L后才计算出w
    • 力矩:
N = rxF = Ia = I dw/dt = d(Iw)/dt = dL/dt
  • 三维旋转求解:
不能用二维旋转方程求解的方法求解了
需要直接对L求解
将角速度转化成四元数:w = [wx, wy, wz, 0]
方向q' = 0.5(w*q) =>四元数积

显示欧拉:

3.碰撞响应
  • 冲量碰撞响应
    • 根据动量守恒+动能守恒,得到公式:



如果是完全弹性碰撞,能量损失为0
    • 无摩擦力下瞬时碰撞的牛顿恢复定律:假设接触点没有摩擦力,冲量必然垂直于表面法线

恢复系数:v2'-v1'=e(v2 - v1)
将两者求解得
根据e求得p^,带入v1 + p^/m1*n 求出v1'
  • 惩罚性力:力会在短但有限的时间内产生所需的碰撞响应。就类似一个坚硬的阻尼弹簧。
容易实现及理解,适合低速撞击
  • 约束
4. 摩擦力
静摩擦力
滑动摩擦力
滚动摩擦力
碰撞摩擦力

5. 休眠
将休眠物体移除模拟之外,但是仍然参与碰撞检测
条件:
刚体受到支持
v和角动量低于阈值
总动能(0.5pv+0.5Lw)低于阈值
Havok中有模拟岛:潜在近期会互动的物体组成。模拟岛能独立于其他岛模拟,并以整个岛为单位进入休眠。
6.约束
点对点约束
弹簧约束
铰链约束
活塞约束
平面约束
轮子:无限旋转的铰链+阻尼弹簧加入某种形式的垂直悬挂系统
约束链:特殊群组,内含供求解程序使用的物体连接信息。模拟一长串的刚体信息
布娃娃:刚体用约束互相链接。是由物理系统驱动的程序式动画
富动力约束(powered constraint):外部引擎间接控制布娃娃的平移和定向。力+动画,力改变动画
7.控制运动
引力
施加力:多数引擎设计为每帧调用一次,力的影响也在该帧内
施加力矩:改变速度&角速度;力偶:一样大,方向相反,离质心距离相同的对点上施加。
施加冲量:速度瞬间改变,无穷短时间内的施力
8.游戏对象和刚体:
物理驱动的刚体
游戏驱动的刚体(动画、玩家驱动):可当作含有无穷质量,力和力矩无法改变游戏驱动刚的速度
固定刚体:不参加动力学模拟,只有碰撞的刚体
9.更新模拟
更新游戏驱动刚体
更新phantom
施以力,冲量并调整约束
步进模拟:
对运动方程数值积分,求出次帧物理状态
碰撞检测
碰撞决议
实行约束
更新物理驱动的游戏对象
执行phantom&碰撞投射查询(以回调方式异步查询or使用上一帧的结果同步查询)
渲染
更新策略:
单线程更新
多线程更新:
物理专用线程:可能导致过期的位置信息-race condition-线程同步 or 使用命令队列做线程通信
fork, join:每个模拟岛步进的过程fork成独立的线程,当所有线程完成工作后join结果,主线程继续单线程更新。
作业模型



(图片没法调整大小,扎心了)

























3D游戏引擎设计:核心技术和实践指南第二版 简介:《3D Game Engine Design》第二版详细探讨了3D游戏引擎设计的核心技术与理念,适用于游戏开发人员、计算机图形学爱好者和软件工程师。该书涵盖了基础架构设计、渲染技术、物理模拟、资源管理、脚本与AI系统设计、网络编程以及引擎的可扩展性等方面,旨在帮助读者深入理解并掌握3D游戏引擎的构建与优化。 阅读详情

相关推荐

整个游戏的架构图

自己制作的整个游戏的架构图

游戏架构设计的一些整理

一个大型的网落游戏服务器应该包含几个模块:网络通讯,业务逻辑,数据存储,守护监控(不是必须),其中业务逻辑可能根据具体需要,又划分为好几个子模块。这里说的模块可以指一个进程,或者一个线程方式存在,本质上就是一些类的封装。对于服务器的并发性,要么采用单进程多线程,要么采用多进程单线程的方式,说说两种方式的优缺点:一、单进程多线程的服务器设计模式只有一个进程,但一个进程包好多个线程:网络通讯层,业务逻辑

yangjinkui的博客 2万+

基于韦尔莱算法的可撕扯幕布模拟2

模拟一个可撕扯的幕布,基于韦尔莱算法实现,C++

实体扫掠算法浅谈

虽然实体扫掠算法可以创建各种形状的三维模型,但是其创建的模型必须是由一个二维轮廓沿着一条三维路径进行移动得到的,这就限制了其适用范围,对于某些特殊的模型可能无法使用实体扫掠算法进行创建。实体扫掠算法在创建三维模型时,如果轮廓和路径的选择不准确,或者计算过程中出现错误,可能会导致生成的三维模型与预期不符,影响模型的精度和质量。在使用实体扫掠算法的过程中,可以通过调整轮廓和路径的位置和形状,轻松地控制生成的三维模型的形状和大小。实体扫掠算法不仅可以用于创建新的三维模型,也可以用于修改现有的三维模型。

T20151470的博客 1541

基于韦尔莱算法的可撕扯幕布模拟

模拟一个可撕扯的幕布,基于韦尔莱算法实现,C++

基于C++的五种算法实现

利用C++完成大整数阶乘、动态规划、回溯法、分支限界、随机化算法、贪心算法的简单实现。

手把手教你搓——割草游戏碰撞检测框架

本文仅提供对象管理和碰撞检测策略和思路,不讨论其他性能优化方案如ECS。这些算法都没有绝对的优劣,都有各自的优缺点,实际应用中要根据情况选择合适的算法才能起到最大的优化效果。作为一个割草游戏,主要的玩法就是,主要的逻辑就是发射子弹攻击敌人。那么最关键的逻辑就是如何判断子弹能攻击到敌人,即碰撞检测...

weixin_42186870的博客 3917

Python 模拟经营即时策略游戏源码

模拟经营即时策略游戏源码,基于FIFE引擎,主要是模拟城市建设和经济发展,通过收税、提供资源和宝物,可以从一个小地盘发展成一个富强的殖民地

模拟物理运动的三个常见方法

简单介绍在游戏中模拟物理运动的三个常见方法。 欧拉方法 显式欧拉方法 在数学和计算机科学中,欧拉方法,命名自它的发明者莱昂哈德·欧拉,是一种一阶数值方法,用以对给定初值的常微分方程(即初值问题)求解。它是一种解决数值常微分方程的最基本的一类显型方法(Explicit method)。 欧拉方法通过记录物体位置和速度,然后在每帧循环期间把速度累加到位置上,从而模拟物体的物理运动。 初中物理内容了,根据此刻速度和加速度,可计算出下一刻的速度和位移差。 vn+1=vn+andt pn+1=pn+vndt 改进的欧

weixin_42294965的博客 1897

NOIP2008年普及组初赛题目答案及解析

NOIP2008年初赛详细题解

城南蝈蝈 926

从零到千兆:KSZ9031 PHY芯片在Zynq PS端的驱动移植心路历程

本文详细记录了在Xilinx Zynq-7000平台(基于XC7Z020芯片)上,为KSZ9031千兆以太网PHY芯片移植LwIP协议栈驱动的完整过程。从硬件连接配置、Vivado工程设置到LwIP库的深度修改与调试,分享了解决PHY识别、自协商及性能优化等关键问题的实战经验,助力开发者实现稳定的千兆网络连接。

honey的博客 1104

游戏引擎架构 中文完整版第一部分

游戏引擎架构 中文完整版第一部分 去发现同类优质开源项目:https://gitcode.com/ 《游戏引擎架构》是一本深入探讨游戏引擎设计和实现的经典著作。本资源文件是该书的第一部分,内容详实,为游戏开发和引擎架构的爱好者提供了宝贵的知识。 本书详细介绍了游戏引擎的各个组成部分,包括渲染引擎、物理引擎、音频引擎、AI引擎等,旨在帮助读者全面理解游戏引擎的工作原理和设计方法。 注意事项: 本资...

gitblog_06729的博客 332

从零构建:毫米波雷达生命信号检测系统的Matlab仿真全流程解析

本文详细解析了毫米波雷达生命信号检测系统的Matlab仿真全流程,涵盖原理、信号处理链路设计及算法优化策略。通过FMCW雷达技术,实现非接触式呼吸心跳信号检测,结合Matlab代码示例展示距离FFT、相位提取与信号分离等关键步骤,为医疗监护和智能家居应用提供实用指南。

weixin_29303701的博客 355

【免费下载】 游戏引擎架构 PDF电子书带书签目录 完整版

游戏引擎架构 PDF电子书带书签目录 完整版 【下载地址】游戏引擎架构PDF电子书带书签目录完整版 游戏引擎架构 PDF电子书带书签目录 完整版欢迎来到游戏开发的知识宝库!本仓库自豪地提供《游戏引擎架构》PDF电子书的完整版本,特别优化了阅读体验,内置详细书签目录,方便读者快速导航至感兴趣的部分 ...

gitblog_09707的博客 1967

Loupe Browser实战指南:解锁10xGenomics单细胞数据的可视化奥秘

本文提供了Loupe Browser的实战指南,帮助用户无需编程即可探索和可视化10xGenomics单细胞数据。文章详细介绍了从数据导入、界面导航到细胞亚群鉴定、差异基因分析的核心操作流程,并分享了高级技巧与避坑指南,是快速上手这一强大可视化工具的必备参考。

weixin_29313423的博客 206

手把手教你完成基于cnn的手写数字识别系统MATLAB语言

手写数字识别是经典的 CNN 分类应用之一,常用的数据集就是 MNIST 手写数字数据集,包含 0~9 这 10 个数字的手写图片,每个数字都由 6 万幅训练图像和 1 万幅测试图像构成。为了便于直观分析,这里选择 MATLAB 工具箱提供的 DigitDataset 进行训练识别,读者也可以直接利用 MNIST 数据集或者自己设计的数据集进行实验。其中,数据集文件夹 db 如图 所示。在数据集文件夹 db 里面对每个数字都建立了子文件夹,各自包含 1000 幅 28×28 大小的二维灰度图像。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1368

游戏引擎架构PDF电子书完整版下载说明:深入游戏引擎设计的不二选择

游戏引擎架构PDF电子书完整版下载说明:深入游戏引擎设计的不二选择 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 《游戏引擎架构》中文完整版PDF电子书,是游戏开发领域的一份宝藏级资料。本书深入浅出地解析了游戏引擎的设计与实现,无论是对于游戏开发新手还是资深开发者,都具有极高的学习和参考价值。本资源库提供了该电子书的第四部分下载,帮助您全面掌握游戏引擎的核心架构。 项...

gitblog_06709的博客 386

《QGIS快速入门与应用基础》239:指北针样式选择(预设/自定义)

系统解析指北针设计的核心规范与实操方法。文章首先强调行业规范红线,包括强制要求N字标注、箭头辨识度等关键要素,通过正误示例对比强化合规意识。其次详细讲解QGIS内置预设样式的分类应用,提供极简箭头、标准三角箭头等4类样式的选型对照表,并配图说明适用场景。最后介绍从基础微调到SVG导入的进阶自定义方法,帮助用户实现从合规到专业的样式设计。全文贯穿"合规优先、可读为本、美观为辅"原则,配有详细操作截图与规范对照表,适合从GIS新手到专业制图人员参考。

LuckyHanMo的博客 530

游戏引擎架构中文完整版第一部分:深入理解游戏引擎核心功能

游戏引擎架构中文完整版第一部分:深入理解游戏引擎核心功能 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在游戏开发领域,对引擎架构的深入了解是提升开发效率和游戏性能的关键。今天,我们将为您推荐《游戏引擎架构》中文完整版第一部分,这是一本专为游戏开发和引擎架构爱好者打造的深度学习资源。本书详细解析了游戏引擎的各个核心组成部分,帮助您全面掌握游戏引擎的工作原理和设计方法。...

gitblog_06775的博客 745

YOLOv8 改进:使用 MobileNetV3 轻量化架构改进特征提取网络

通过使用 MobileNetV3 作为 YOLOv8 的特征提取器,能够显著降低模型复杂度和运行时资源消耗,同时在一定程度上保持检测精度。这种方法特别适合需要高效计算的边缘设备和嵌入式系统。

走向CTO的路上... 1275

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

游戏引擎概述-Part1

游戏引擎,UNITY,UE

leikang111的博客 785

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【Iphone 游戏开发】游戏引擎剖析

李华明Himi 原创,转载务必在明显处注明:转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-object/406.html为了解决“如何在IPHONE上创建一个游戏”这个大问题,我们需要首先解决诸如“如何显示图像”与“如何播放声音”等一系列小问题。这些问题关系到创建部分游戏引擎。就像人类的身体一样,游戏引擎的每个部分虽然不同,但是却都不可

李华明Himi 2万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【爱上cocos2d-x之二】Cocos2d-x架构和目录结构

此系列文章用的是cocos2d-x 2.2.2版本 1. cocos2d-x架构 cocos2d-x架构如下图,摘自cocos2d-x官网。 2. cocos2d-x目录结构 解压cocos2d-x压缩包后,可以看到如下目录结构: 下面详细介绍cocos2d-x目录结构: (1)cocos2dx:游戏引擎源码。 (2)CocosDenshion

三十画生 一个北漂的人 4248

【iOS(译)】游戏引擎剖析

转载自【黑米GameDev街区】原文链接: http://www.himigame.com/iphone-cocos2d/406.html 为了解决“如何在IPHONE上创建一个游戏”这个大问题,我们需要首先解决诸如“如何显示图像”与“如何播放声音”等一系列小问题。这些问题关系到创建部分游戏引擎。就像人类的身体一样,游戏引擎的每个部分虽然不同,但是却都不可或缺。因此,首先从游戏引

lynjay的专栏 1244

IPHONE游戏开发 第二章 游戏引擎剖析

    为了解决“如何在IPHONE上创建一个游戏”这个大问题,我们需要首先解决诸如“如何显示图像”与“如何播放声音”等一系列小问题。这些问题关系到创建部分游戏引擎。就像人类的身体一样,游戏引擎的每个部分虽然不同,但是却都不可或缺。因此,首先从游戏引擎剖析开始本章。我们将会讨论一个游戏引擎的所有主要部分,包括应用程序框架、状态机、图像引擎、物理引擎、声音引擎、玩家输入和游戏逻辑。    写一个好玩的游戏是一项牵扯到很多代码的大任务。非常有必要从一开始就对项目进行良好的,有组织的设计,而不是随着进度的进行而到

coolyama的专栏 3241
上一篇: 最短路径算法----Dijkatra
下一篇: 游戏引擎架构----渲染
圆形毕露
博客等级 码龄17年 20粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值