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