首页 > 其他分享 >BEPUphysicsint定点数3D物理引擎介绍

BEPUphysicsint定点数3D物理引擎介绍

时间:2023-10-27 11:24:19浏览次数:39  
标签:BEPUphysicsint 1.2 1111 引擎 定点数 3D 物理

帧同步的游戏中如果用物理引擎,为了保证不同设备上的结果一致,需要采用定点数来计算迭代游戏过程中的物理运算。也就是我们通常说的定点数物理引擎(确定性物理引擎)。本系列教程给大家详细的讲解如何在你的项目中内置一个确定性物理引擎。确定性物理引擎我们使用github上开源的物理引擎BEPUphysicsint v1库。本节内容主要有:

https://github.com/sam-vdp/bepuphysics1int 

定点数计算的原理与优缺点

首先来给第一次接触定点数的开发者介绍一下定点数计算的基本原理。定点数计算的原理很简单, 例如: 1.2 * 1.2, 我们用整数来模拟小数,原理就是确定一个精度,把小数的小数部分放大, 比如1.2, 我们确定精度为在10进制下精确到小数点后1位, 那么1.2对应的定点数为12, (定点数是对应的小数扩大10倍后取整), 如果确定精度是小数点后2位,那么1.2对应的定点数位120(定点数是对应的小数扩大100倍)。我们都知道计算机是二进制的,一个int在32位的机器上, 为32bit, 最高位表示的是符号位,剩下的是31位, 31位中多少表示小数位,就代表定点数的精度。比如 8个bit表示小数部分的精度,那么这个定点数就扩大了2^8。所以1.2变成定点数就是 int (1.2 * 256 = 307.2 整数化后就为307)。

32bit位: 1111 1111 1111 1111 1111 1111 1111 1111, 当你把精度定在哪个bit位,就相当于把小数点定在了多少位, 如上面, 小数点定在了8bit地方, 1111 1111 1111 1111 1111 1111. 1111 1111所以叫做”定点数”。通过扩大倍数,把小数部分按照特定的精度变成了整数,后续都基于整数来进行运算。如果我们的物理引擎使用定点数计算,最后虽然将定点数转化为Unity Transform的相关浮点数显示物体位置,但是最终在决定物理碰撞,游戏事件中, 物理移动中都是定点数化后的整数运行,所以这样就做到了物理引擎迭代的确定性。做到了不同机器上跑物理引擎模拟,结果一致。

1.2 * 1.2 = 1.44 12 * 12 = 144 / 10 = 14

除法: 两个定点数的除法,分子,分母都扩大10倍,结果相当于没有扩大, 我们可以先把分子再继续扩大十倍,然后再除以分母。也可以把分母缩小10倍再计算(有很多种处理方式)。一般做除法,我们会把分子扩大10倍,再除以分母。1.4 / 1.2 = 1.166 定点数: 14 * 10 / 12 = 11,表示的结果为1.1,也是精确到小数点后1位。

搞懂了上述的计算过程后,我们知道定点数的优点就是都是基于整数计算,结果确定,在没有浮点运算器的CPU下计算性能好。接下来分析下定点数计算的缺点,就是定点数在做乘法 or 除法的时候容易溢出。我们拿乘法为例,假设32 bit的整数,16bit作为小数部分,那么就是 15.16的定点数(最高表示符号,15个bit表示整数部分,16bit表示小数部分),如果两个数相乘,很大的概率就溢出了(计算结果超过32bit)。如2^20与2^21两个定点数相乘为: (2^20 * 2^21)/ (2^16) = 2^41 / 2^16, 计算分子相乘的时候得2^41次,在32bit的int存储中就溢出了。 而2^20与2^21都是合法的定点数。

BEPUphysicsint v1的由来

在github中有一个开源的3D物理引擎的项目,叫做BEPUphysics, 它分成了v1, v2两个重大版本的分支如图1.1-1:

图1.1-1

BEPUphysicsint v1 开源项目是将BEPUphysics v1的代码中的浮点运算用定点数来代替而fork出的一个分支。BEPUphysicsint v1与BEPUphysics v1使用方式上基本都是一致的,只是内部采用的是定点与浮点的区别。在BEPUphysicsint这个项目中,采用定点数,所以精度很有限,无法达到浮点的精度,而且经常容易溢出,所以它有一个要求,物理世界中x, y, z每个轴的范围在1000的范围内。BEPUphysicsint 定点数物理引擎的性能要比BEPUphysics float版本的性能要差4倍左右。以后可能差距没有那么大,但是定点数版本的要比浮点数版本的性能差。如图1.1-2:

图1.1-2 官方关于性能与精度的介绍

 

如果在实际的项目中发现性能问题,也可以自己实现物理引擎或者基于自己项目实现一个阉割版的高性能物理引擎。

今天的分享就到这里了, 关注我们, 接下来还会继续更新定点3D物理引擎系列教程。

下节预告: 基于BEPUphysicsint的使用详解

标签:BEPUphysicsint,1.2,1111,引擎,定点数,3D,物理
From: https://www.cnblogs.com/bycw/p/17791822.html

相关文章

  • BEPUphysicsint碰撞事件详解
    上一节我们給大家介绍了BEPUphysicsint的基本使用,在游戏开发中我们经常要使用物理引擎的事件,所以本节我们详细的讲解BEPUphysicsint的物理事件。此物理引擎会产生了碰撞事件与非碰撞事件,碰撞事件大家好理解,非碰撞事件例如:物理Entity的update事件,Entity的activation/deactivat......
  • CF1883D In Love
    思路如果每一次加或者删一个区间,再去暴力找有没有互不相交的区间的话,铁定TLE。那么,我们考虑维护有多少对互不相交的区间,那么每次加或者删一个区间,就去算这个区间对答案的贡献,然后再看答案是否为\(0\)即可快速判断有没有互不相交的区间。现在考虑如何计算一个新加入或者删去......
  • Civil 3d 创建装配并添加、镜像部件
    英文论坛中有人提的问题,问题我也看不懂,就截图回复了一下,后来他进一步描述了问题,我大致清楚了,虽然我之前使用代码创建装配并添加过部件,但之前的操作仅添加一个部件,如何添加更多的部件并镜像部件,确实没有尝试过,于是试着写了以下测试代码,分享给大家。publicvoidC_AssTe......
  • 3DCAT+东风日产:共建线上个性化订车实时云渲染方案
    近年来,随着5G网络和云计算技术的不断发展,交互式3D实时云看车正在成为一种新的看车方式。与传统的到4S店实地考察不同,消费者可以足不出户,通过网络与终端设备即可实现全方位展示、自选汽车配色、模拟效果、快捷选车并进行个性化定制。3DCAT实时渲染云作为一家专注于为汽车行业提供......
  • Python 43days
    Python操作Mysql***SQL注入问题  安全相关视图 触发器  事务 ***存储过程   类似于自定义函数内置函数   流程控制索引***—————————————————————————————————————————————————————————......
  • cesium 加载3dtiles
    注意cesium版本问题,还有这个是异步加载,定位到该模型时要加个延时settimeout效果 代码如下//3dtiles  functionaddThreeDTiles(url,option){    //开启地形深度检测:    //控制在渲染场景时,相机是否进行深度测试以避免将被遮挡的物体绘制在前......
  • Unity 3D定点数物理引擎实战系列
    1.1 BEPUphysicsint3D定点数物理引擎介绍 帧同步的游戏中如果用物理引擎,为了保证不同设备上的结果一致,需要采用定点数来计算迭代游戏过程中的物理运算。也就是我们通常说的定点数物理引擎(确定性物理引擎)。本系列教程给大家详细的讲解如何在你的项目中内置一个确定性物理引......
  • Unity 3D定点数物理引擎实战系列2
    1.2 BEPUphysicsint定点数3D物理引擎使用上一节給大家介绍了BEPUphysicsint的一些基本的情况,这节课我们来介绍它的基本使用,本节主要从以下5个方面来介绍:(1) 创建一个物理世界Space,并开启模拟迭代;(2) 添加一个物理物体Entity到世界;(3) 物理引擎的基本处理与操作使用;(......
  • 从DETR到DETR3D(1)
    最近参加了手写ai的车道线检测项目,后续会更新一些文章展现对相关项目邻域的总结和理解。一 DETR的原理DETR输出是定长的:100个检测框和类别。这种操作可能跟COCO评测的时候取top100的框有关,从这种角度看,DETR可以被认为具有100个adaptiveanchor,其中Encoder和ObjectQuery分别对......
  • CF1523D Love-Hate 题解
    抽象化题意:一共有\(m\)个元素,给定\(n\)个集合,每个集合的元素不超过\(15\)个,求出一个元素个数最多的集合\(S\)是至少\(\lceil\dfrac{n}{2}\rceil\)个集合的子集。其中$p$$(1\len\le2\cdot10^5,1\lep\lem\le60)$我们先假设\(limit=\lceil\dfrac......