首頁 資料庫 mysql教程 box2d源码解析 一

box2d源码解析 一

Jun 07, 2016 pm 03:20 PM
為什麼 原始碼 解析

为什么写这篇博文: 前一段时间一直在花时间看box2d源码,真可谓废了九牛二虎之力,四处扒资料,皇天不负有心人,最终还是将源码看完了,可以长舒一口气了.不过会想起我在学习过程中遇到的没有资料之苦,是绝不能让后来人再次承受,因为这非但不是对毅力的历练,反而

为什么写这篇博文:

前一段时间一直在花时间看box2d源码,真可谓废了九牛二虎之力,四处扒资料,皇天不负有心人,最终还是将源码看完了,可以长舒一口气了.不过会想起我在学习过程中遇到的没有资料之苦,是绝不能让后来人再次承受,因为这非但不是对毅力的历练,反而是对时间的浪费。

网上的资料实在少得可怜,有关于box2d的,也是box2d的用法,根本就不是源码的解析。所以决定将我的学习历程分享给大家,帮助后来人,共勉。

还想说一些关于学习要深入到精髓源码中去,而不是浮在表面学习一下别人写的东西的api之类的话,想着我等无名小辈,人微言轻,怕被喷,还是算了,还是算了。

Box2d介绍:

我就不从维基百科上复制了,自己说下了.这个东西对游戏开发者来说是再熟悉不过了,就是一个物理引擎,通过输入(刚体的位置,速度,角速度,用户的操作)通过一定的计算,给出输出(刚体新的位置,速度,角速度).如果不是特别了解的朋友,回忆下愤怒的小鸟,其中的物理效果就是靠Box2d来实现的~

 

为什么会去看box2d源码:

         去看源码真心的出于兴趣,就是感觉box2d这个东西那是相当的神奇啊,怎么就能通过运算模拟出了物体(主要是刚体)的运动,还有各种约束。更重要的一点是我能找到源码,这就要感谢box2d的作者开放了源代码

 

博文计划:

         第一篇博文主要是一个概述,说下我看了那些资料,还有一些看源码的时候的难以理解的点(通过看box2d作者写的文章到最后也不能理解的点) ,对于出来找资料准备自己研究源码的人来说,看第一篇博文足够用了,这里面会有必要资料,对box2d的概述.

         后面的博文会陆陆续续的出,主要是对一些具体的点的解析,还有就是一些外文网站的翻译,看源码的时候有哪里看不懂的可以回来看看.

基本上废话就这么多,让我们直奔主题:

学习历程:刚开始拿到源码的时候,想着一天看一个类不出一个月也能看完。可是后来发现,如果不知道一个类的用途,想去看懂其中的逻辑真心的费事。所以还是来csdn搜索了一下,发现了扭曲45 的文章,跟着他写的几篇文章的思路一直坚持,一直到他的最后一篇关于box2d的博文(真心感谢扭曲45 如果没有您,我不会坚持到最后,但是您的几篇文章都是将源码粘上去加上注释也是真心难看懂啊╭(╯3╰)╮)。但是后面的约束并没有涉及,也就是说看完他的文章如果都理解的话也只是知道了如何检测刚体之间发生了碰撞,得到碰撞的信息(后面的William的文章中也有说举得例子更详细~),至于如果判断刚体的进一步运动,如果合理约束,还是需要自己研究。然后通过,扭曲45的推荐找到了http://www.codezealot.org/这个网站,上面讲了很多关于约束的东西,然后通过codezealot的博主William的推荐找到了box2d的作者ErinCatto存放资料的地方https://code.google.com/p/box2d/downloads/list,里面有每年ErinCatto在WDC上的演讲的东西,其中的2005年 2006年的演讲资料,以及一个box2_Lite(box2d简化版)对看懂box2d源码意义重大。总结来说扭曲45 的博文主要是基础部分和碰撞部分,William的博文主要是详细的碰撞方法部分,和约束部分,ErinCatto的演讲资料,就是总结,所以看ErinCatto资料之前一定要对box2d有个基本的了解,这样看才会有收获才会发现精髓原来在这里,要不然指定是更加的迷糊一头雾水。还有最重要的就是自己的思考和不懈地坚持。通过这么多博文资料 自己的努力 足够看懂源码的了

类解析:概要的介绍这里也不可能说的太详细,box2d中的很多函数都是全局函数,很多很多。还有一点不得不说,box2d中每个刚体都有着两套坐标,一套本地坐标,直接保存在属性中,还有一套世界坐标通过transform计算出来,两套坐标的好处,game-physics-engine-development-the-morgan-kaufmann-series-in-interactive-3d-technology.pdf中有讲,有中文版。

一、Common文件夹下:此文件夹下最重要的莫过于对象池的实现了,其余的都是一些小函数,定义,and so on。

1.      b2BlockAllocator:使用栈内存的小对象分配器,说白了其实就是自己先向系统申请一块较大的内存,然后自己掌控这块内存的分配回收,最后返回给系统。

2.      b2StackAllocator:使用堆内存的小对象分配器。堆内存就是最后系统会自动回收,栈内存就是new alloc 申请的最后要释放的 那种内存。(应该没记错)

3.      b2Draw:因为不懂OpenGl 所以看不懂写的什么,不过反正知道就是在黑窗口的时候画出一些图形,关节,碰撞点等等。

4.      后面的就不写了很简单 源码自带的注释非常详细。

二、Collision/Shapes文件夹下:各种形状的定义,都是继承自b2Shape

三、Collision文件夹:

1.      B2Distance:通过输入两个刚体(各种上面Shapes文件夹中定义的形状的),transform(刚体在世界坐标系中的位置,旋转角度),得出刚体的距离,return出去。

2.      B2Collision:碰撞的常用函数实现。    RayCast()用来判断射线和刚体相交的位置,b2ClipSegmentToLine()在后面的分离轴处使用,b2TestOverlap()调用的b2Distance中的b2Distance()函数得到距离看是否重叠(碰撞)。

3.      B2DynamicTree:动态AABB树,其实就是树,里面存的对象是AABB。AABB就是碰撞包围盒, 包裹在刚体周围的,一对边和x轴平行,另一对边和x轴垂直的矩形,详细的在game-physics-engine-development-the-morgan-kaufmann-series-in-interactive-3d-technology.pdf中有讲,有中文版.

4.      B2BroadPhase:中有一个b2DynamicTree对象,也就是说b2BroadPhase是为了操作b2DynamicTree而生,在检测碰撞初期先用AABB进行粗略的碰撞检测,只有AABB碰撞的一对刚体才真的可能发生了碰撞,如果AABB都没有碰撞,说明这对刚体没有碰撞,引入AABB的意义在于,加快碰撞的检测,因为判断AABB是否碰撞远比判断具体的形状之间是否发生了碰撞代价小。

5. b2CollideCircle。Cpp 这个家伙连个头文件都没有,其中的函数直接就是全局函数,用于计算圆形和圆形的碰撞。通过输入(constb2PolygonShape* polygonA,constb2Transform&xfA,

constb2CircleShape* circleB,constb2Transform&xfB),计算出碰撞点的位置,个数,类型,放在输出(b2Manifold* manifold)中。

6.      b2CollideEdge中的b2CollideEdgeAndCircle用于计算线段和圆形,b2EPCollider结构体用于计算线段和多边形。

7.      b2CollidePolygon用于计算多边形和多变性,具体后面翻译的外文博客中有讲。

四、Dynamic/Contacts文件夹

1.      各种碰撞的定义都是继承自b2Contact,其中的得到碰撞信息都是调用的三、5.6。中的东西。

五、Dynamic/Joint文件夹:

1.      各种关节,都是继承于b2Joint,具体的东西,后面翻译的外文网站中有。

六、Dynamic文件夹:这里面的东西,基本上就是相当于人类的大脑,操控全局,调用其它的类,函数。很多熟悉的就不多说了,很好理解。

1.      b2Island:这个东西主要是b2word在处理碰撞的时候需要计算时,将各种东西塞进b2Island中进行计算,也就是说这个类存在的意义就是计算。

2.      b2ConatactManager:同样也是为b2Word服务,用来管理碰撞。

 

box2d源码解析 一  到这里基本上就结束了,全是一些概述。不过不急,谁也不可能一口吃成大胖子,慢慢来,一步一步展开。

后面先翻译几篇外文,将必备知识储备完善,之后再说其他.

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在父分類的存檔頁面上顯示子分類 如何在父分類的存檔頁面上顯示子分類 Apr 19, 2025 pm 11:54 PM

您想了解如何在父分類存檔頁面上顯示子分類嗎?在自定義分類存檔頁面時,您可能需要執行此操作,以使其對訪問者更有用。在本文中,我們將向您展示如何在父分類存檔頁面上輕鬆顯示子分類。為什麼在父分類存檔頁面上顯示子分類?通過在父分類存檔頁面上顯示所有子分類,您可以使其不那麼通用,對訪問者更有用。例如,如果您運行一個關於書籍的WordPress博客,並且有一個名為“主題”的分類法,那麼您可以添加“小說”、“非小說”等子分類法,以便您的讀者可以

centos7如何安裝mysql centos7如何安裝mysql Apr 14, 2025 pm 08:30 PM

優雅安裝 MySQL 的關鍵在於添加 MySQL 官方倉庫。具體步驟如下:下載 MySQL 官方 GPG 密鑰,防止釣魚攻擊。添加 MySQL 倉庫文件:rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm更新 yum 倉庫緩存:yum update安裝 MySQL:yum install mysql-server啟動 MySQL 服務:systemctl start mysqld設置開機自啟動

Centos停止維護2024 Centos停止維護2024 Apr 14, 2025 pm 08:39 PM

CentOS將於2024年停止維護,原因是其上游發行版RHEL 8已停止維護。該停更將影響CentOS 8系統,使其無法繼續接收更新。用戶應規劃遷移,建議選項包括CentOS Stream、AlmaLinux和Rocky Linux,以保持系統安全和穩定。

oracle數據庫的語句怎麼寫 oracle數據庫的語句怎麼寫 Apr 11, 2025 pm 02:42 PM

Oracle SQL語句的核心是SELECT、INSERT、UPDATE和DELETE,以及各種子句的靈活運用。理解語句背後的執行機制至關重要,如索引優化。高級用法包括子查詢、連接查詢、分析函數和PL/SQL。常見錯誤包括語法錯誤、性能問題和數據一致性問題。性能優化最佳實踐涉及使用適當的索引、避免使用SELECT *、優化WHERE子句和使用綁定變量。掌握Oracle SQL需要實踐,包括代碼編寫、調試、思考和理解底層機制。

oracle數據庫怎麼導入 oracle數據庫怎麼導出 oracle數據庫怎麼導入 oracle數據庫怎麼導出 Apr 11, 2025 pm 02:30 PM

Oracle數據庫遷移主要依靠expdp和impdp工具。 1. expdp用於導出數據,其語法簡潔但選項豐富,需注意目錄權限和文件大小,避免導出失敗;2. impdp用於導入數據,需確保目標數據庫空間充足、字符集一致且無同名對象,可使用remap_schema參數解決衝突;3. 可使用parallel、query、network_link、exclude等參數優化遷移過程;4. 大型數據庫遷移需注意網絡環境、數據庫資源利用及分批遷移策略,以提高效率並降低風險。 熟練掌握這些步驟和技巧,才能

連接mongodb的工具有哪些 連接mongodb的工具有哪些 Apr 12, 2025 am 06:51 AM

連接MongoDB的工具主要有:1. MongoDB Shell,適用於快速查看數據和執行簡單操作;2. 編程語言驅動程序(如PyMongo, MongoDB Java Driver, MongoDB Node.js Driver),適合應用開發,但需掌握其使用方法;3. GUI工具(如Robo 3T, Compass),提供圖形化界面,方便初學者和快速數據查看。選擇工具需考慮應用場景和技術棧,並註意連接字符串配置、權限管理及性能優化,如使用連接池和索引。

docker原理詳解 docker原理詳解 Apr 14, 2025 pm 11:57 PM

Docker利用Linux內核特性,提供高效、隔離的應用運行環境。其工作原理如下:1. 鏡像作為只讀模板,包含運行應用所需的一切;2. 聯合文件系統(UnionFS)層疊多個文件系統,只存儲差異部分,節省空間並加快速度;3. 守護進程管理鏡像和容器,客戶端用於交互;4. Namespaces和cgroups實現容器隔離和資源限制;5. 多種網絡模式支持容器互聯。理解這些核心概念,才能更好地利用Docker。

See all articles