標籤:根據 使用 節點 變化 角色 無法 運行 需要 問題:
有人的地方就有江湖,遊戲裡也一樣。無論為了什麼目的,遊戲中的人也被無形分出了三六九等,於是各個遊戲角色站位就有了講究。於是乎,就有了今天的問題:當大家都是有身份的人的時候,怎麼移動最能體現這種地位?
其實這個問題是因為最近做的項目而來。遊戲類型算是一種RTS,而且還需要結隊行走,所以這裡就有了需求:整個隊伍按照陣型移動且過程平滑。
今天就用一字長蛇陣來聊聊這個話題吧!
一字長蛇陣就好比開火車,火車頭走自然帶著車廂一起走,而且走的過程當中車廂並不會打亂順序,所以很符合我們的需求模型。不繞圈子,下來就說說幾種實現方式吧。
1.以車頭為原點,計算得出其他車廂的位置。
這種方法應當是比較常見的一種,即在確定了車頭的位置和角度後,沿著反向通過車廂間隔就可以確定每個車廂的目標位置。在確定了位置之後,可以在遊戲中讓車廂瞬移到目標位置並調整方向,也可以讓車廂平滑向目標點移動,並即時更改車廂角度。
好處:計算簡單啊!二維空間下知道一個點和點的方向,計算反向固定間隔的某點簡直易如反掌。而且模型的理解成本低,實現也簡單。
壞處:根本不符合需求啊!有人見過車廂瞬移的嗎?火車是一條直線,車頭一旦發生轉向,整個火車就以車頭為原點進行了旋轉,視覺上就給人一種打死程式的衝動。即便讓車廂平滑移動,也無法保證視覺上車頭車尾的首尾相連,更何況轉彎大點的時候還有可能出現車廂交錯的情況。所以在當前需求下,這種情況被pass。
2.以每一節車廂後向某固定點作為下一節車廂目標點。
這種方法是第一種的變種,為了破解僵硬而存在。具體操作就是讓車頭後固定某點作為車廂1的目標點,然後在得出車廂1的座標與方向後再在其後固定某點作為車廂2的目標點,依此類推。這樣做的好處自然不會讓火車永遠是一條直線,隨著車頭轉彎,車廂1隨即移向目標點且自身產生旋轉,由於旋轉的疊加效應,後續車廂自然使整列火車變成了一個弧形。這種情況下,瞬移也會有很好的效果,相較方案1避免了多數疊加的情況。如果平滑過渡自然表現會更好。
好處:火車終於不再僵硬,因為每一節車廂的旋轉都是依據前一節車廂計算而得,因此這樣得到的結果本身也更為平滑,已經很接近需求。
壞處:計算量加劇,如果車廂多一點,則每一次都需要計算車廂的方向是一個效能消耗點。雖然移動更為平滑,但是在瞬移模式下,由於旋轉由疊加而成,因此旋轉方向一旦發生變化,末端的車廂會發生較大距離的位移,因而產生失真,依舊不適合當前需求。
3.以每一節車廂為後一節車廂的移動方向,根據間隔距離計算目標點。
這種方法以方法2反向而得。具體操作就是車頭移動,然後車廂1向車頭移動,且保證車廂1與車頭的距離等於兩者原本的間隔,然後車廂2向移動後的車廂1移動,且保證二者距離不變,依此類推。這種情況下我們可以計算得出,只要某一方的瞬間旋轉的角度不超過閾值,便可以保證不失真(閾值的計算與間隔、瞬間移動距離和方向有關,即保證A移動後與B的間隔大於A移動前與B的間隔)。
好處:最貼近目前需求。移動不再僵硬,解決了左右旋轉瞬間可能產生的失真,即便使用瞬移也可以使視覺效果順滑。
壞處:與方法2計算量基本一致,如果以火車模型說明問題,則車廂之間串連處還是有錯位的失真,只是這種失真較之前小很多罷了。
小小的總結下吧
目前嘗試了這三種,不排除還有其他的方案,比如逐幀記錄運行軌跡然後複原等。總體而言,以上三種如果說對於火車這種首尾相連要求苛刻的模型,則都會有失真的情況,但如果只是比照火車運行軌跡,則方案3更為平滑符合要求,方案2則由於運行速度、旋轉方向等關係使用條件較為苛刻,方案1則讓扔到垃圾桶裡了。不過要說明一點,方案1作為計算量最少的方案,在一些類似小小兵團這種多人物陣型的遊戲中還是很重要的。只是在人少的情況下,為了視覺的舒適,我們菜肴探索方案2、3這一類方案。
其次,以上三種方案對於漸進模式,都存在失真的可能。一旦旋轉角過大而移動速度不足,則人物移動當中的重疊等就變得不可避免。因而在上述的幾種方案的基礎上,還需要一些其他的設計來保證人物移動的真實感。
那麼我在項目中如何??
現有項目基本採用方案3。但是對於我們的項目而言,方案3也僅僅是第一層。首先需要明確的就是我們的陣型並非單純的一字長蛇陣,而是多種陣型,但是基本目標都是實現主角們按照陣型向前移動並轉向。因此我們套用了方案3作為陣型的基本模型。在方案3之上,我們再嵌套陣型進去。比如我們的“雙縱陣”,便是主角們排成兩列進行移動。這種情況下,我們就按照方案3的思想創造出n/2個節點,然後將陣型當中的每2個點劃歸進1個節點之中。這樣,當節點移動時,每個點就根據所屬節點的位置與角度以及固定位移量,計算出該點的最終位置,然後向最終位置平滑移動。
遊戲中的陣型移動分析