最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Unity3D定點數(shù)物理引擎實戰(zhàn)系列1.4 基于Unity整合BEPUphysicsint物理引擎實戰(zhàn)

2022-07-26 10:08 作者:博毅創(chuàng)為  | 我要投稿

1.4 基于Unity整合BEPUphysicsint物理引擎實戰(zhàn)

上一節(jié)我們詳細(xì)的講解BEPUphysicsint 的物理事件。此物理引擎會產(chǎn)生了碰撞事件與非碰撞事件,碰撞事件大家好理解,非碰撞事件例如: 物理Entity的update事件,Entity的activation/deactivation事件等。本節(jié)課來實戰(zhàn)如何編譯BEPUphysicsint源碼到自己的項目, 如何整合物理引擎與Unity圖形渲染。本文分成4個部分:


1: 源碼編譯, 將github上的源碼下載下來編譯到Unity項目;

2: 在Unity中初始化BEPUphysicsint的物理世界;

3: 編寫PhyBoxEntity組件創(chuàng)建物理Entity并同步Unity圖像;

4: 使用Unity自帶碰撞器組件,來生成創(chuàng)建PhyBoxEntity;


創(chuàng)建項目,源碼編譯BEPUphysicsint


準(zhǔn)備源碼,我們從github上面下載下來BEPUphysicsint的源碼,下載地址為:

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

下載下來以后,解壓開來代碼截圖,如圖1.4-1:


圖1.4-1 項目源碼目錄截圖

下載下來源碼后怎么用到Unity(百度也百度不到),我的方法是先分析文件夾,搞清楚每個文件夾的大概的功能與作用,看下項目,打開vs的工程BEPUphysics.sln看下源碼項目如何組織的,如圖1.4-2:

圖1.4-2 工程目錄截圖

結(jié)合我們的文件夾,我們大膽來猜測分析下代碼的作用,哪些我們可能需要的,哪些要刪除的。分析時,我一般會先根據(jù)名字來猜測,再核對一下里面的代碼。BEPUbenchmark/BEPUfloatBenchmark,我先查找名字benchmark的意思,benchmark的英文有類似單元測試,實例代碼的意思,所以這兩個文件夾下的代碼應(yīng)該是供我們整合到項目做的實例參考,可以閱讀里面的源碼,但是不用放Unity源碼編譯。進(jìn)一步核實一下里面的代碼驗證一下自己的判斷,打開入口文件Benchmark.cs,里面講解的就是如何setup物理世界等。如圖1.4-3所示:

圖1.4-3 示例代碼構(gòu)建物理世界


BEPUik/?BEPUphysics:?ik與physics看上去就是物理引擎的核心代碼庫,打開代碼大概驗證一下,ik里面有IKJoint.cs相關(guān)代碼, physics里面有Entity, Space等代碼,所以這個應(yīng)該是核心代碼,等會要放入Unity項目工程。如圖1.4-4所示

圖1.4-4 物理引擎核心代碼

經(jīng)過類似的分析名字與內(nèi)容,我們發(fā)現(xiàn)BEPUutilities(工具代碼)+ BEPUik+ BEPUphysics+ FixedMath.Net文件夾所對應(yīng)的代碼為引擎編譯所依賴的必須代碼, ConversionHelper這里是向量定點與浮點的轉(zhuǎn)換代碼,在Unity中可能用到或參考,可以考慮放項目中。


接下來創(chuàng)建Unity項目來編譯源碼(參考unity 2020.3.33f1版本)。項目創(chuàng)建完成后分好文件夾,這里我分了3個一級目錄文件夾: AssetsPackage, Scenes, Scripts,Scripts又分為了3rd, Framework, 兩個文件夾,如圖1.4-5:

圖1.4-5 物理引擎核心代碼

其中3rd用來存放第三方的代碼,我在里面又新建了一個BEPU的文件夾,拷貝我們分析的必須代碼到Unity項目。

圖1.4-6 移植物理引擎源碼到項目

不出意外的話,大量的報錯,主要分成幾類, AssemblyInfo.cs 里面的代碼報錯,打開這個代碼一看,沒有什么用,直接連同里面的” Properties”一起刪除掉。又發(fā)現(xiàn)源碼文件夾里面”bin”與”obj”文件夾,這個是源碼工程的編譯時生成的目錄,刪掉。如圖1.4-7:


圖1.4-7 刪除原項目工程編譯文件夾

接著就是BoxBoxCollider.cs代碼報錯,打開代碼一看,對比原版,發(fā)現(xiàn)原版里面有個編譯的宏開關(guān)ALLOWUNSAFE,原版本打開了,Unity版本沒有,我們在Unity PlayerSetting里面加上這個宏,如圖1.4-8:


圖1.4-8 打開編譯宏開關(guān)

經(jīng)過這些操作,代碼很神奇的就全部編譯過了。接下來往Unity里來構(gòu)建我們的物理世界了。


在Unity中初始化BEPUphysicsint的物理世界


這個簡單多了,打開BEPUphysicsint的benchmark代碼參考,copy過來就可以了。初始化的時,主要做的事情有: 構(gòu)建物理世界, 配置物理世界重力,設(shè)置物理迭代的參數(shù),關(guān)閉原來Unity自帶物理引擎, Update中迭代物理世界。這里是全局執(zhí)行一次,新建一個BEPUPhyMgr.cs的全局單例,用來做初始化。代碼實現(xiàn)在Framework/BEPUWrapper文件夾下,直接上代碼:


在Unity中創(chuàng)建一個GameApp空節(jié)點,掛這個BEPUPhyMgr組件來做初始化(這里是測試,具體在項目框架中做初始化)。創(chuàng)建一個Cube與Plane, 刪除掉它原來的物理碰撞器。如圖1.4-9所示:

創(chuàng)建物理Entity并同步Unity圖像

構(gòu)建完物理世界后,我們就是要往物理世界里面放物理的Entity, 物理世界迭代計算Entity,然后再把Entity里面的位置,旋轉(zhuǎn)等信息同步到Unity的圖像節(jié)點的Transform中,這樣物理的Entity就可以帶著圖像的節(jié)點移動了。這個需要我們開發(fā)者來自己開發(fā),同時Entity的類型有很多,我們以Box Entity為例,主要做2件事情:

(1) 根據(jù)用戶給定的物體大小與物體是否可移動,來創(chuàng)建對應(yīng)的物理Entity;

(2) 對于可移動的物體,我們每次update同步Entity位置等到Unity Transform組件;

新建一個PhyBoxEntity.cs的組件到Framework/BEPUWrapper文件夾下。構(gòu)建物理Entity Box需要長,寬,高,我們也設(shè)定相關(guān)參數(shù),物體是否可以移動,給一個bool給用戶選擇。有時候我們要調(diào)整物理的中心(與標(biāo)準(zhǔn)Unity物理引擎類似),我們加個相當(dāng)于Unity節(jié)點的中心偏移:

根據(jù)這些設(shè)定,我們來使用BEPUphysics來創(chuàng)建Box的Entity,其它的類似,并加入到物理世界。

接下來同步Unity的圖像節(jié)點的Transform到物理Entity,直接把物體Transform的位置同步設(shè)置到Entity里面。

最后對于移動的物體,我們在LateUpdate里面同步物理Entity位置到Unity Transform。

?public void LateUpdate() {
? ? ? ?if (this.isStatic) {?? ? ? ? ? ?return;?? ? ? ?}?? ? ? // ?FixMath.NET.Fix64 g = 9.81m;?? ? ? ?// Debug.Log(g.ToString());
? ? ? ?BEPUutilities.Vector3 worldPos = this.box.position;?? ? ? ?// Debug.Log(worldPos.ToString());?? ? ? ?double x = System.Convert.ToDouble((decimal)worldPos.X);?? ? ? ?double y = System.Convert.ToDouble((decimal)worldPos.Y);?? ? ? ?double z = System.Convert.ToDouble((decimal)worldPos.Z);
? ? ? ?this.transform.position = new Vector3((float)x - this.centerX, (float)y - this.centerY, (float)z - this.centerY);?? ?}

掛一個BoxPhyEntity組件到Cube節(jié)點,你會神奇的發(fā)現(xiàn)Cube在物理引擎的迭代作用下掉下去了。


使用Unity自帶碰撞器組件,來生成創(chuàng)建PhyBoxEntity

這里還有一個問題,就是物理Entity的大小設(shè)置無法像Unity自帶的物理引擎一樣,可視化編輯,其實這個問題很好解決,我們的策略是添加Unity對應(yīng)的物理碰撞器組件 (如: BoxCollider),利用Unity做好的功能特性來編輯物理Entity大小與中心,運行的時候讀取數(shù)據(jù)即可。這里我做了一個簡單的轉(zhuǎn)化,代碼如下:

[RequireComponent(typeof(BoxCollider))]

添加PhyBoxEntity組件的時候,必要要添加BoxCollider組件。

初始化的時候,從碰撞器中讀取大小數(shù)據(jù),這樣就可以關(guān)聯(lián)到Unity自帶的形狀。后續(xù)你開發(fā)PhyBoxEntity, PhySphereEntity等都可以通過這樣的方式來整合。同時這些Entity可以繼承一個基類PhyBaseEntity, 來做些設(shè)計上的調(diào)整。最后上下效果圖,我添加一個Cube與一個平面到物理世界,效果如下:

今天的分享就到這里了,關(guān)注我們,可以獲取Unity BEPUphysint3D實戰(zhàn)源碼。

下節(jié)預(yù)告: 基于BEPUphysicsint整合到Unity項目實戰(zhàn)

附:視頻教程

Unity幀同步核心技術(shù):3D定點數(shù)物理引擎架構(gòu)實戰(zhàn)www.bycwedu.com/promotion_channels/1454843650



Unity3D定點數(shù)物理引擎實戰(zhàn)系列1.4 基于Unity整合BEPUphysicsint物理引擎實戰(zhàn)的評論 (共 條)

分享到微博請遵守國家法律
清流县| 车险| 冀州市| 安乡县| 钟祥市| 台南市| 三台县| 峨边| 韶关市| 轮台县| 惠来县| 兰州市| 古蔺县| 合江县| 潮安县| 高陵县| 那坡县| 东港市| 新绛县| 井研县| 晋中市| 伊宁市| 翁源县| 陇川县| 佳木斯市| 鄯善县| 任丘市| 凤阳县| 白玉县| 丁青县| 张北县| 象山县| 清流县| 当涂县| 临清市| 商河县| 固镇县| 尖扎县| 永登县| 宁海县| 始兴县|