今天給大家?guī)硪粋€比較有意思的Houdini vex 模擬交通系統(tǒng)案例教程分享 Houdini學習群:19969476
今天給大家?guī)硪粋€比較有意思的Houdini vex 模擬交通系統(tǒng)案例教程分享
1、介紹
我的名字叫Franco Pizzani,參與過《使命召喚:無限戰(zhàn)爭》和《使命召喚:第二次世界大戰(zhàn)》等游戲的開發(fā)。大約從那時起,我開始在空閑時練習Houdini,當時只是為了學習一些新東西,但是,在某個時候,我意識到我想進一步深入掌握它。所以就參加了加拿大溫哥華的 Houdini FXTD program 。
2、項目的開始
這是我的Houdini課程中的第三個項目,我們需要創(chuàng)建一個人群系統(tǒng)。前幾講涵蓋了有關(guān)人群及其行為的基本概念。我們進一步了解了Houdini內(nèi)置的人群工具,該工具可以與人群求解器一起自動為您完成所有操作。盡管人群求解器和內(nèi)置工具非常出色,但我確實想嘗試使用VEX可以做一些不同的事情,所以我認為交通系統(tǒng)將是獨一無二的。在我看來,交通系統(tǒng)是如此機械,它將使我有機會控制和設(shè)置使交通系統(tǒng)運行的所有必要屬性,例如矢量和力。同時,模擬交通系統(tǒng)似乎并不是典型的Houdini項目,因此我將其視為一舉兩得的事。
3、項目的基本情況
該項目的核心是一個solver求解器和一堆pointwaranger節(jié)點(您可以在其中寫VEX的節(jié)點),通過vex讀取和設(shè)置屬性。然后,這些屬性用于基于不同條件來定義屬性狀態(tài)。在此項目的每個幀上都會計算出90多個屬性,這些屬性的范圍從我所謂的“初始屬性”開始,這些屬性是原始數(shù)據(jù),由方向矢量,距離和模擬中產(chǎn)生的其他信息組成。然后分析這些初始屬性以設(shè)置“狀態(tài)屬性”。這些狀態(tài)屬性用于定義車輛的狀態(tài),這些狀態(tài)是“加速”,“開始”,“停止”或“以最高速度行駛”。
例如我前面有一輛與我在同一車道上的車輛,那么它的方向與我的方向相同,并且到前面的車輛的距離小于預(yù)定的制動距離,這時“在前方車輛制動”屬性將為true,從而觸發(fā)“開始”狀態(tài)。當觸發(fā)此狀態(tài)時,有一個制動節(jié)點負責根據(jù)距離減小施加到我的車輛上的力,從而減小我的速度和與前方車輛的距離,以防止其發(fā)生碰撞。如果我的車輛處于“制動”狀態(tài)并且我的速度等于0,則表示我已停止,因此將觸發(fā)“停止”狀態(tài)。如果車輛正在制動或停止的狀態(tài)屬性改變,它將變?yōu)椤凹铀佟睜顟B(tài),再次施加力。
這些狀態(tài)屬性的傳遞都是通過pcopen和neighbor等點云系列函數(shù)實現(xiàn)的。下圖中是我的節(jié)點圖,盡可能的保證節(jié)點圖的組織化和模塊化。solver求解器將在每一幀中從左到右以及從上到下執(zhí)行這些節(jié)點。
4、道路與交通結(jié)構(gòu)
具體的道路系統(tǒng)是以現(xiàn)實生活為參照,仔細觀察,提煉規(guī)則。我非常喜歡現(xiàn)實生活的交通路網(wǎng),通過觀察學習我了解了車輛行駛,交通信號燈,停車標志,避開行人的規(guī)則。我花了一段時間才正確設(shè)置交通信號燈模式。
當我剛開始該項目時,我先進行了原型制作,使車輛沿著道路(在單車道上)行駛并互相制動/停車。后來,當我將其擴展到每條道路有1條以上車道時,我看到車輛似乎無緣無故地剎車和停止,但它們前面沒有其他車輛。經(jīng)過一些調(diào)試后,我發(fā)現(xiàn)它們的停止是因為我沒有執(zhí)行任何判斷來檢查前面的車輛是在當前車道中還是在相鄰車道中,因此很多工作確實按照現(xiàn)實生活的邏輯進行修改。在檢查設(shè)置狀態(tài)的條件時,重要的是要檢查正在發(fā)生的事件及其優(yōu)先級。車輛可能正在剎車減速以在紅燈處停車,但是如果在到達紅燈之前有停止的車輛,則必須先停車。
在項目中我采用樣條線來引導車輛。每個樣條都有一個“道路名稱”,并且知道與之相連的樣條是什么。當車輛在道路上行駛時,它會從樣條曲線讀取這些屬性,從而可以知道下一條街道在哪里以及它們可以走到哪里。如果選項為2或更多,則每輛車將隨機選擇下一步。這是我最不滿意的項目部分,因為設(shè)置這些樣條線需要一些手動工作去放置,并設(shè)置道路屬性。
5、管理車輛
我在項目中使用速度屬性來移動點:以米/秒為單位進行計算,如果車輛的速度為25,則意味著它以每小時90公里的速度行駛。由于每個車輛都知道它們的位置和所要行駛的道路,因此可以計算從車輛的位置到所要行駛的道路的方向向量,然后在該向量的方向上施加力。一旦我們在道路上,將沿道路的行駛方向施加力,這樣,車輛就可以沿著道路正常行駛。
項目中也運用了一些其他的數(shù)學概念(例如點積和叉積)。使用點積,我們可以輕松確定車輛之間的前后關(guān)系。如果我的方向向量和到另一輛車的方向向量的點積大于0,則意味著另一輛車在我前面。如果小于0的結(jié)果表示另一輛車在我后面。
6、speedmax屬性
在生成車輛時,我立即為它們分配一個隨機的“ speedmax”屬性。車輛的speedmax屬性在每秒11.1至17.7米之間,相當于每小時40至64公里的速度。無論施加多大的力,都不允許速度超過指定值。
同時,道路具有真實的比例大小,并且車輛以每小時64公里的最大速度行駛,這意味著車輛在道路上行駛一些時間后會離開模擬。因此,我正在準備模擬一個14000幀,這相當于大約10分鐘的解算,大約需要5分鐘來模擬。
另一個重要方面是通過隨機變化。每輛車都會獲得隨機值,例如它們開始停車時與紅燈之間的距離,停在前方車輛后方的距離或者停車后重新啟動的時間等隨機值,所有的這些值的隨機變化都會使解算更加逼真。
產(chǎn)生制動和停止距離的隨機值
車輛始終可以獲取需要剎車或停車的屬性狀態(tài),并且當距離低于上面屬性中定義的值時,它們會通過減小承受的力來減慢速度,剩下的就是求解器通過降低其速度。車輛源的幾何形狀經(jīng)過仔細設(shè)置,以1米長為標準,這樣我就可以根據(jù)實際單位為每輛車輛分配pscale屬性(大?。?。由于每個車輛都知道它們的尺寸(pscale)和必須制動的車輛的尺寸,因此我可以準確地計算出它們從前保險杠到后保險杠的距離。
7、紅綠燈與行人
我認為添加行人會使其看起來更加生動復(fù)雜。并且我在之前的制作過程中已經(jīng)做好了添加行人系統(tǒng)所需要的屬性,以及檢測其他車輛并為行人工作而剎車/停車的邏輯。這是Houdini的優(yōu)點之一:進行一項設(shè)置,并通過針對不同的事物進行一些調(diào)整來重復(fù)利用。行人需要做更多的工作,因為現(xiàn)在他們的行為有些漫無目的,他們只是盲目地穿過馬路,理想情況下,我會執(zhí)行一些邏輯以使行人在過馬路之前停下來觀察車輛的往來疏密,直到有安全的空隙或紅綠燈變?yōu)榫G色時再穿過馬路。
交通信號燈是設(shè)置的重要組成部分,如果沒有交通信號燈,在交通流量大的情況下,這個十字路口可能會很混亂。
我將交通信號燈視為具有通過或不通過狀態(tài)的實體。將這些插入解算中,每輛車可以一直獲取當前狀態(tài)以及與會影響它們的最近紅綠燈的距離?,F(xiàn)在已經(jīng)預(yù)定義了交通信號燈狀態(tài)模式,但是我正在探索使它們根據(jù)車輛流量自動更改紅綠信號的方法。
8、車輛生成
我為車輛定義了不同的生成源,每個源都有特定的生成頻率,生成數(shù)量和生成種子,以提供更多的變化。我現(xiàn)在設(shè)置的值是在交通流量與我的參考鏡頭相匹配的最佳值。
在下圖中,您可以看到當我同時生成四倍的車輛時會發(fā)生什么。交通堵塞模擬器!
9、后記
我不能保證何時能夠與人們分享更多的細節(jié),因為在學校的時間非常緊張,我必須將自己的時間用于下一個項目。最重要的是,該系統(tǒng)仍然是一個半成品,有很多地方需要調(diào)整和修復(fù)。不僅如此,就像我之前說過的那樣,目前還有一部分內(nèi)容需要手工完成,因此,我會考慮一種解決方案,以使其變得更加程序化,更直接易用。
3D藝術(shù)家:Franco Pizzani
訪談 :Kirill Tokarev
直線網(wǎng)公眾號,第一時間學習最新教程,看最新行業(yè)動態(tài)??!
0
喜歡他,就推薦他上首頁吧^_^
0371-86068866
4008887269
cndesign@163.com
CND設(shè)計網(wǎng)(CNDESIGN)會員所發(fā)布展示的 “原創(chuàng)作品/文章” 版權(quán)歸原作者所有,任何商業(yè)用途均需聯(lián)系作者。如未經(jīng)授權(quán)用作他處,作者將保留追究侵權(quán)者法律責任的權(quán)利。
Copyright ©2006-2019 CND設(shè)計網(wǎng)