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