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

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

游戲動(dòng)態(tài)相機(jī)系統(tǒng)的迭代——gdc session翻譯

2022-06-14 09:50 作者:有木乘舟  | 我要投稿

轉(zhuǎn)載:https://zhuanlan.zhihu.com/p/432965447

https://www.gdcvault.com/play/1014605/Iterating-on-a-Dynamic-Camera

Selection(模式選擇,選擇我們感興趣的相機(jī))

環(huán)境

戰(zhàn)斗

腳本

過濾器

我們通常會(huì)有很多可選的潛在攝像機(jī),一個(gè)經(jīng)典的場(chǎng)景可能有五十個(gè)左右的相機(jī),很多都被設(shè)計(jì)成同時(shí)生效。

他們由三個(gè)系統(tǒng)來(lái)確定,環(huán)境中的區(qū)域設(shè)置,戰(zhàn)斗中動(dòng)作的觸發(fā),和對(duì)象腳本。


環(huán)境中的可尋路區(qū)域,每個(gè)區(qū)域關(guān)聯(lián)了一個(gè)或多個(gè)相機(jī),當(dāng)我們的角色進(jìn)入?yún)^(qū)域,相關(guān)的攝像機(jī)也會(huì)被選中

相機(jī)也會(huì)被戰(zhàn)斗系統(tǒng)所確定,比如奎托斯抓住了一只怪,會(huì)進(jìn)入斬殺動(dòng)畫,會(huì)有對(duì)應(yīng)的鏡頭動(dòng)畫來(lái)做表現(xiàn)

我們還有腳本化sequence,當(dāng)玩家觸發(fā)了某些事情,腳本系統(tǒng)會(huì)告訴相機(jī)系統(tǒng)開始和結(jié)束一段固定的相機(jī)動(dòng)畫來(lái)highlight游戲中的事件。

當(dāng)我們有一系列被選中的相機(jī)時(shí),我們需要過濾掉不關(guān)注的相機(jī)。

每個(gè)相機(jī)都有一個(gè)列表來(lái)標(biāo)記到其他相機(jī)是否可以轉(zhuǎn)換。

我們還根據(jù)玩家狀態(tài)來(lái)選擇,比如有一個(gè)相機(jī)被標(biāo)記為只有玩家墜落時(shí)才可以使用

最后我們通過優(yōu)先級(jí)篩選掉優(yōu)先級(jí)低的相機(jī),然后我們就得到了最后剩下的可用相機(jī)列表

Blending(混合到一個(gè)相機(jī)中)

混合樹

權(quán)重

模式

參數(shù)(集)

這個(gè)系統(tǒng)有一個(gè)混合樹,這個(gè)樹結(jié)構(gòu)的確定取決于相機(jī)優(yōu)先級(jí),相機(jī)被設(shè)定為如何混合,還有相機(jī)在這一幀是否真的被使用到。

失效的相機(jī)會(huì)被移出,有用的相機(jī)會(huì)被插入到樹中合適的位置上。

*每一個(gè)相機(jī)都有一個(gè)權(quán)重和混合模式,來(lái)決定如何使用它的參數(shù)輸入來(lái)計(jì)算出對(duì)應(yīng)的輸出。

權(quán)重混合由定時(shí)器來(lái)生成,計(jì)時(shí)器并非線性的,而是由一個(gè)埃米特曲線驅(qū)動(dòng)來(lái)做緩動(dòng)效果。

Hermite 曲線

  已知曲線的兩個(gè)端點(diǎn)坐標(biāo)P0、P1,和端點(diǎn)處的切線R0、R1,確定的一條曲線。

就是兩個(gè)端點(diǎn)可以調(diào)切線的曲線

通常情況下定時(shí)器是正向推進(jìn)的,比如在新舊相機(jī)交替的時(shí)候,但是有的時(shí)候比如戰(zhàn)斗相機(jī)序列結(jié)束的時(shí)候,我們會(huì)反向推進(jìn)定時(shí)器。

權(quán)重可以由角色在區(qū)域中的位置來(lái)驅(qū)動(dòng)。由碰撞系統(tǒng)來(lái)計(jì)算。最有效的權(quán)重是區(qū)域的部分有一個(gè)方向向量,讓我們可以在穿越某個(gè)區(qū)域的時(shí)候在相機(jī)間淡入淡出。

當(dāng)然我們也可以通過相機(jī)自身來(lái)計(jì)算權(quán)重,我們有一個(gè)實(shí)驗(yàn)性的相機(jī),它基于朝向和軌跡方向來(lái)控制自身的權(quán)重。

這個(gè)模式?jīng)Q定了子節(jié)點(diǎn)如何混合。

淡入淡出模式把第二個(gè)節(jié)點(diǎn)混入了第一個(gè)節(jié)點(diǎn),混入權(quán)重在0-1之間,這種混合方式被使用于計(jì)時(shí)器和自我計(jì)算權(quán)重的節(jié)點(diǎn)。

平均模式把所有輸入節(jié)點(diǎn)的權(quán)重平均后計(jì)算結(jié)果,這種模式用于計(jì)算基于區(qū)域位置的混合。

操作部分

當(dāng)我們有了混合樹,所有的權(quán)重也被確定下來(lái),我們把混合樹分解為一系列二進(jìn)制操作,用累加器存儲(chǔ)中間值。

相機(jī)被分解位多個(gè)參數(shù),他們被獨(dú)立的插值計(jì)算,包括相機(jī)朝向,目標(biāo)世界空間坐標(biāo),目標(biāo)相機(jī)空間坐標(biāo),以此來(lái)生產(chǎn)一段美觀的相機(jī)運(yùn)動(dòng)。

相機(jī)位置xyz,半球坐標(biāo)系便宜(方位角,仰角,距離),歐拉角朝向(Yaw,Pitch,Roll)

相機(jī)是和目標(biāo)關(guān)聯(lián)的,所以相機(jī)也會(huì)圍繞目標(biāo)補(bǔ)間而不是穿過目標(biāo)。

相機(jī)空間目標(biāo)位置存儲(chǔ)為 相機(jī)到目標(biāo)方向,和相機(jī)朝向的差值。通過兩個(gè)角度(方位角,仰角/水平旋轉(zhuǎn),垂直旋轉(zhuǎn))和相機(jī)到目標(biāo)距離(球面坐標(biāo)系)

最后相機(jī)朝向存儲(chǔ)為歐拉角,歐拉角對(duì)相機(jī)插值很友好,而不像四元數(shù)插值那么丑(會(huì)有奇怪的滾動(dòng))

當(dāng)然歐拉角對(duì)云臺(tái)鎖鏡頭不友好,而且會(huì)在直上直下查看的時(shí)候發(fā)生奇怪的事情。

解決方案是保持住相機(jī)然后再垂直方向上輕微傾斜。

然后策劃又扔來(lái)了這么一個(gè)東西,垂直向上看的角度。盡管我們可能應(yīng)該這樣做,但我們不僅是將布景放在一邊。

為了解決這個(gè)問題,我們添加了一個(gè)額外的transform,讓我們可以修改云臺(tái)鎖歐拉角方向,我們不常修改這個(gè)值,多數(shù)情況下這是個(gè)明確的旋轉(zhuǎn)值,但是也有例外。

下一個(gè)問題是,方位角,Yaw,Roll都是繞圈轉(zhuǎn)的。每一個(gè)參數(shù)都有兩種方式來(lái)混合,走靠近的方向,或者反向轉(zhuǎn)一圈。方位角幾乎遇不到這個(gè)問題,因?yàn)槟繕?biāo)基本上都在相機(jī)前面,Roll一般都是0。

對(duì)于Yaw來(lái)說(shuō),這是個(gè)問題,整個(gè)系統(tǒng)不是靜態(tài)的,所有東西都在動(dòng),意味著哪一邊最短,會(huì)一直更改,因?yàn)橄鄼C(jī)從角色一邊轉(zhuǎn)到另一邊的時(shí)候會(huì)有很多的計(jì)算推送。

這種傻逼事情很容易發(fā)現(xiàn)處理,但是有時(shí)候他也會(huì)在很長(zhǎng)一條混合步驟的中間步驟出現(xiàn)。

比如設(shè)計(jì)師設(shè)計(jì)了一綹相機(jī),用來(lái)控制相機(jī)從玩家下面運(yùn)動(dòng)過去,但是有兩個(gè)相機(jī)在線上面,他們之間的最短距離是在玩家上面的。就會(huì)導(dǎo)致相機(jī)翻面






這個(gè)問題的解決方法是,把每個(gè)相機(jī)的yaw表達(dá)為一個(gè)2維單位向量,然后我們不再混合角度,而是對(duì)多個(gè)相機(jī)向量做混合,得到一個(gè)二維的點(diǎn),然后再把這個(gè)二維點(diǎn)轉(zhuǎn)換為角度。

比如兩個(gè)相機(jī)朝向的單位向量是(xa,ya)(xb,yb),那么混合結(jié)果就是((xa+xb)/2,(ya+yb)/2)。

這解決了大多數(shù)問題,而且當(dāng)計(jì)算結(jié)果太接近中心值(正反轉(zhuǎn)相差角度很?。┑臅r(shí)候,還會(huì)報(bào)警,讓策劃調(diào)整相機(jī)


最終的混合參數(shù)

  • 目標(biāo)世界坐標(biāo)的向量

  • 相機(jī)球面坐標(biāo)系的目標(biāo)偏移

  • 相機(jī)的pitch,roll

  • 相機(jī)的yaw的2d向量

  • 云臺(tái)相機(jī)的四元數(shù)表示的朝向

  • 視角

Dynamic(描述我們?nèi)绾斡?jì)算一個(gè)相機(jī)的位置和朝向)

  • 動(dòng)畫相機(jī)

  • 動(dòng)態(tài)相機(jī)

  • 戰(zhàn)斗相機(jī)

三種基礎(chǔ)相機(jī),匹配三種不同的相機(jī)匹配方式。

動(dòng)畫相機(jī)用于過場(chǎng)動(dòng)畫或者由腳本驅(qū)動(dòng)。

動(dòng)態(tài)相機(jī)處理環(huán)境和區(qū)域相關(guān)情況。

戰(zhàn)斗相機(jī)處理戰(zhàn)斗動(dòng)作的近攝鏡頭。

動(dòng)畫相機(jī)由動(dòng)畫師設(shè)計(jì),直接應(yīng)用到相機(jī)上,通常用與過場(chǎng)動(dòng)畫,用maya的aim point當(dāng)作他的目標(biāo)點(diǎn)。

動(dòng)畫相機(jī)軌跡我們利用nurbs曲線(由多個(gè)點(diǎn)控制的平滑曲線,區(qū)別于普通的必須穿過點(diǎn)的曲線)我們把動(dòng)畫長(zhǎng)度和軌跡長(zhǎng)度做了映射,計(jì)算曲線上到角色最近的點(diǎn),然后根據(jù)映射設(shè)置動(dòng)畫時(shí)間。

你可以對(duì)動(dòng)態(tài)相機(jī)的大多數(shù)參數(shù)做動(dòng)畫變化,所以你也可以基于玩家位置,通過動(dòng)畫相機(jī)當(dāng)作動(dòng)態(tài)相機(jī)的變化。

動(dòng)態(tài)相機(jī)的模型和我們混合相機(jī)的模型一樣

我們還有其他一些信息要關(guān)注,比如 Dolly,也是一個(gè)空間中的修正點(diǎn),或者nurbs曲線(軌跡)上的點(diǎn)。

還有boom,和相機(jī)朝向向量一致,從Dolly開始,到目標(biāo)平面結(jié)束。我們用boom來(lái)計(jì)算和約束相機(jī)的朝向和距離(相機(jī)到目標(biāo))

我們還將偏移距離轉(zhuǎn)變?yōu)閺南鄼C(jī)到目標(biāo)平面的距離,因而防止偏移約束導(dǎo)致的目標(biāo)在屏幕上大小的變化。

這是一系列的約束。按順序應(yīng)用。

首先我們?cè)O(shè)置framing,用于再相機(jī)空間約束方位角和俯仰角,目標(biāo)的水平垂直位置。

然后我們更新dolly的位置來(lái)約束boom的長(zhǎng)度和朝向

然后我們根據(jù)目標(biāo)平面約束相機(jī)的距離

最后我們約束相機(jī)的朝向。

framing約束是一個(gè)指定的屏幕空間坐標(biāo)范圍,定義了屏幕上的一個(gè)正方形,我們叫safezone

如果奎托斯移出了屏幕,我們也要相應(yīng)的移動(dòng)相機(jī)

第一件事我們通過fov和分辨率把安全區(qū)轉(zhuǎn)換到一個(gè)球面空間的角度范圍,我們每一幀都會(huì)進(jìn)行這種計(jì)算,因?yàn)檫@些約束值也會(huì)由動(dòng)畫控制。顯然球面空間的映射從上到下是扭曲的,既然水平的fov沒那么夸張,我們操作的范圍內(nèi)出的問題很小,可以忽略。


我們清理掉框并放大,首先為更新過的目標(biāo)位置更新便宜角度。

然后我們clamp到左右角度內(nèi),這里我們已經(jīng)在水平約束內(nèi)了,但是需要向下移動(dòng)來(lái)匹配垂直的約束。

我們?cè)谶@個(gè)地方不會(huì)修改朝向和距離,它的效果是垂直方向上跟蹤玩家的方向。

在我們約束距離和朝向之前,我們需要計(jì)算boom,也就相當(dāng)于決定dolly的位置,如果沒有rail,我們就用一個(gè)空間中的修正點(diǎn)。

如果我們有rail,我們需要讓dolly沿著rail移動(dòng)來(lái)滿足約束。

可以是距離約束

可以是角度約束,可以在穿過dolly的修正向量的兩側(cè)對(duì)稱,也可以和在dolly所在rail點(diǎn)的切線相關(guān)

他們可以用來(lái)產(chǎn)生權(quán)重,通過一個(gè)極小化的函數(shù)來(lái)吧dolly移動(dòng)到最適合約束的點(diǎn)。


極小化函數(shù)主要需要一個(gè)計(jì)算權(quán)重函數(shù),和初始化的參數(shù)值。

權(quán)重計(jì)算函數(shù)把參數(shù)把參數(shù)轉(zhuǎn)換為dolly的位置,了解目標(biāo)會(huì)超出約束多少,并把這個(gè)作為返回值。

然后極小化函數(shù)在處置參數(shù)附近的空間搜索來(lái)尋找一個(gè)局部極小值。

為了讓他能平滑,我們還加入了一些簡(jiǎn)單的阻尼

我們現(xiàn)在有boom,我們用它來(lái)計(jì)算距離屬性

在這里我們用boom ratio參數(shù),他是boom上的某個(gè)位置,從0-1,1是dolly的位置,0是目標(biāo)平面的位置。

然后我們對(duì)到dolly的距離生成一個(gè)最大/最小的約束。

然后對(duì)目標(biāo)做一樣的事,我們最后做目標(biāo)距離的約束,來(lái)保證相機(jī)不會(huì)穿過角色導(dǎo)致裁剪。

我們也可以把距離設(shè)置固定值

最后我們計(jì)算朝向的約束,pitch和yaw分開來(lái)處理,roll不會(huì)直接產(chǎn)生,基本是設(shè)為0的。

首先我們從boom的朝向設(shè)置相機(jī)的朝向

然后我們用約束boom同樣的角度來(lái)檢查相機(jī)的朝向約束

如果朝向在約束外,我們通過旋轉(zhuǎn)相機(jī)來(lái)修正。因?yàn)檫@些發(fā)生在相機(jī)上,所以我們需要重新計(jì)算距離和偏移在移動(dòng)中保持住相機(jī)。

當(dāng)然和距離一樣,我們可以把朝向設(shè)置成固定角度。

當(dāng)你應(yīng)用一個(gè)約束的時(shí)候,不可避免地會(huì)影響到另一個(gè)約束。當(dāng)然我們可以通過讓約束只影響?yīng)毩⒌膮?shù)來(lái)最小化這個(gè)影響,當(dāng)然,也不是百分百可以保證。比如我們看旋轉(zhuǎn)的約束,有的時(shí)候你會(huì)影響到整個(gè)模型。通常這些沖突都會(huì)內(nèi)部消化掉,但是有的時(shí)候他們也會(huì)讓鏡頭搖擺導(dǎo)致大問題。

幸運(yùn)的是,通過放寬某些約束我們可以簡(jiǎn)單的解決這個(gè)問題。我的經(jīng)驗(yàn)中主要是朝向約束,放開到0-5度可以讓相機(jī)更平滑。

這些是設(shè)計(jì)師可以控制的約束。我們對(duì)boom和相機(jī)本身進(jìn)行了dolly距離約束和角度約束,保持了約束參數(shù)簡(jiǎn)單。

所有參數(shù)都可以由maya相機(jī)動(dòng)畫化。

兩個(gè)例外是最下面兩個(gè)參數(shù),他們是標(biāo)記位,rail relative決定了角度約束是否由dolly的切線方向決定。move dolly控制了角度約束是否應(yīng)用到dolly上。

生成了約束過的偏移,朝向,距離后,我們有了更新之后的相機(jī)位置和朝向,最后我們把距離轉(zhuǎn)回混合格式,然后就可以把這些參數(shù)送回混合器了。

下面是戰(zhàn)斗相機(jī)。

這是gow的經(jīng)典斬殺動(dòng)畫,發(fā)生時(shí),我們喜歡直接控制相機(jī),來(lái)找到動(dòng)作的最佳機(jī)位。

因?yàn)檫@段動(dòng)畫可能發(fā)生在任何位置,所以我們不可能把鏡頭預(yù)設(shè)在世界中。

相對(duì)的,我們相機(jī)運(yùn)動(dòng)關(guān)聯(lián)到了角色上,顯然屏幕中有三個(gè)對(duì)象,主角,怪物,和rig(牽引器),這三個(gè)對(duì)象都是由一個(gè)joint驅(qū)動(dòng)移動(dòng)來(lái)匹配位置和朝向,我們稱之為synch joint,他們播放的動(dòng)畫也是同步的,在相同的時(shí)鐘內(nèi)播完

combat rig由三個(gè)節(jié)點(diǎn)組成,有一個(gè)synch joint作為根節(jié)點(diǎn),然后有一個(gè)相機(jī)和一個(gè)目標(biāo)點(diǎn)附著在根節(jié)點(diǎn)上。

那么為什么我們需要三個(gè)節(jié)點(diǎn)呢,如果我們?cè)谶@么一個(gè)開放的競(jìng)技場(chǎng)中,我們很自信相機(jī)動(dòng)畫從任何位置播放都不會(huì)穿過環(huán)境,沒什么大問題。

當(dāng)然另外來(lái)說(shuō),大多數(shù)環(huán)境沒有這么好,很大可能相機(jī)跑到柱子或者墻后面。我們決定不在相機(jī)上做任何碰撞檢測(cè),相機(jī)的碰撞很難做好,所以我們有了這些節(jié)點(diǎn)。

在我們對(duì)環(huán)境沒信心的時(shí)候,做法是用環(huán)境相機(jī)的位置然后再混入動(dòng)畫相機(jī)。動(dòng)畫相機(jī)被設(shè)計(jì)為不在意環(huán)境所以我們可以認(rèn)為位置是安全的。

然后我們?nèi)∮胷ig target的位置,讓相機(jī)面向它。

然后我們調(diào)整fov讓我們?cè)谑褂胷ig上的相機(jī)的時(shí)候,目標(biāo)在屏幕上的尺寸不變。

我們可以畫一個(gè)包含了所有感興趣區(qū)域的球體,這個(gè)球體由target point,相機(jī)和fov決定

然后我們通過把區(qū)域相機(jī)旋轉(zhuǎn)到看向這個(gè)球體,來(lái)渲染出這個(gè)球體中的內(nèi)容。

并且把fov帶入來(lái)適應(yīng)這個(gè)球體。

按照上面的說(shuō)法。我們?nèi)』亓艘恍┪恢孟嚓P(guān)的信息,通過沿著向上的軸旋轉(zhuǎn)調(diào)整鎖定相關(guān)的設(shè)置,來(lái)匹配相機(jī)動(dòng)畫

我們會(huì)在一段時(shí)間中緩動(dòng)這個(gè)旋轉(zhuǎn),但是有可能在旋轉(zhuǎn)比較大的角度的時(shí)候看上去奇怪。

所以為了最小化初始旋轉(zhuǎn),我們?cè)诙鄠€(gè)角度尋找相機(jī),然后找一個(gè)最接近的通常會(huì)給四個(gè)相機(jī),東南西北,有的時(shí)候也會(huì)把他們?cè)趧?dòng)畫的控制下合成一個(gè)。

一段視頻演示,30分15秒開始

以上就是戰(zhàn)斗相機(jī),這里是一個(gè)不用rig的簡(jiǎn)化版本,但是我們用了角色的目標(biāo)和觸發(fā)動(dòng)作中的一個(gè)寬度。

同樣的,旋轉(zhuǎn)和位置覆蓋是可選的feature。通常boss都有特殊區(qū)域,如果設(shè)計(jì)師有信心的話,角色周圍總會(huì)有足夠的空間,他們可以把位置覆蓋關(guān)掉,任意的移動(dòng)相機(jī)。有一個(gè)意想不到的作用是,戰(zhàn)神三中我們很多黑幕動(dòng)畫其實(shí)是使用了戰(zhàn)斗相機(jī)來(lái)跟蹤其中一個(gè)主角。


Targeting(確定我們關(guān)注的是什么)

  • 角色

  • 生物

  • 阻尼

  • 權(quán)重

  • 優(yōu)先級(jí)

奎爺?shù)幕拘畔?,邏輯位置在雙腳中間,碰撞膠囊體2.25m,目標(biāo)點(diǎn)在1.5m的位置,角色目標(biāo)指定的時(shí)候沒有阻尼,所有的阻尼來(lái)自玩家自身邏輯。為了相機(jī)能緊跟著角色,相機(jī)不會(huì)延遲或者超前移動(dòng)太多。

奎托斯經(jīng)常到處跳,有的時(shí)候我們不希望他把相機(jī)上下拽,有一個(gè)可選的系統(tǒng)叫做跳躍糾正,它可以在每個(gè)相機(jī)上獨(dú)立開關(guān),讓我們來(lái)忽略跳躍帶來(lái)的影響。

如果落地時(shí)的位置比跳躍時(shí)的位置高了,我們把相機(jī)移上去跟玩家會(huì)和。

如果他落地位置比開始位置高,我們需要重新追蹤垂直方向上的位置

前面就是我們選擇目標(biāo)的主要方式,但是對(duì)于戰(zhàn)斗來(lái)說(shuō),我們還要繼續(xù)努力,首先就是我們要支持多個(gè)目標(biāo),最好每個(gè)關(guān)注的對(duì)象都在目標(biāo)中,通過某種方式讓他們都出現(xiàn)在鏡頭中。

打開了調(diào)試信息。紅色圓圈是主角,小的紅色圓圈是怪,中間的菱形是bloom目標(biāo),用來(lái)從動(dòng)態(tài)相機(jī)計(jì)算boom,白色正方形是安全區(qū)域。

怪物的目標(biāo)是一個(gè)圓圈而不是一個(gè)點(diǎn),包含了權(quán)重和優(yōu)先級(jí)。

它也可以附加到一個(gè)節(jié)點(diǎn)上,意味著我們需要對(duì)他設(shè)置阻尼。對(duì)于主角來(lái)說(shuō)這是沒有的畢竟我們基于玩家的邏輯來(lái)平滑的移動(dòng)膠囊體。動(dòng)畫節(jié)點(diǎn)保證不了這些,只會(huì)讓相機(jī)移動(dòng)被動(dòng)畫師隨意發(fā)揮。只有使用這個(gè)target方式才能為添加到相機(jī)上的非設(shè)計(jì)的移動(dòng)有巨大潛力。

所以我們要過濾掉微小的移動(dòng),因此idle下的怪物就不會(huì)讓相機(jī)震蕩了。當(dāng)然我們也要保證我們能追蹤到大的移動(dòng)并且平滑的過度過去

我們通過兩個(gè)球體間的區(qū)域來(lái)解決這個(gè)問題

內(nèi)球里面是自由移動(dòng)區(qū)域,不會(huì)影響相機(jī)。

兩個(gè)球之間的區(qū)域逐步移動(dòng)讓節(jié)點(diǎn)回到內(nèi)圓內(nèi)。

外球外面不需要阻尼,目標(biāo)會(huì)馬上追上去,保證目標(biāo)不會(huì)脫離。

回到奎托斯。現(xiàn)在他周圍又一圈敵人。讓我們用相機(jī)的視角看一看。

我們現(xiàn)在給每個(gè)怪都有一個(gè)target,最簡(jiǎn)單的方式是我們平均取值來(lái)得到一個(gè)boom的target。

奎托斯基本上都是處于戰(zhàn)斗的中間的額,通常不會(huì)把他移到屏幕外面。

但是并不能保證不會(huì)發(fā)生,如果他遠(yuǎn)離了一個(gè)跑的慢的敵人,很有可能出現(xiàn)他們兩個(gè)都被移出了屏幕的情況。所以我們需要為每個(gè)目標(biāo)添加權(quán)重,通過加權(quán)平均來(lái)取到boom target

現(xiàn)在我們的boom target是加權(quán)平均后的位置了

每個(gè)目標(biāo)的權(quán)重都有三個(gè)部分組成,

Base Weight,表示這個(gè)目標(biāo)有多重要

Distance Weight,表示敵人到主角的距離權(quán)重

Activation Weight讓我們能平滑的加減目標(biāo)數(shù),通常的來(lái)說(shuō)就是敵人出現(xiàn)或者死亡。

但是當(dāng)我們減到一個(gè)敵人的時(shí)候,并不能回到一個(gè)合適的位置

問題來(lái)自于,這個(gè)技術(shù)沒有區(qū)分戰(zhàn)斗的規(guī)模,可能是個(gè)近距離戰(zhàn)斗也有可能是散開來(lái)的戰(zhàn)斗。

這樣就讓設(shè)計(jì)者沒辦法控制戰(zhàn)斗的畫面了。

癥結(jié)在于,加權(quán)平均的過程中,忽略了其他的戰(zhàn)斗目標(biāo)信息。我們想要一個(gè)方案可以把每個(gè)目標(biāo)都考慮進(jìn)來(lái),同時(shí)保證最重要的目標(biāo)永遠(yuǎn)在合適的位置。

因此,下一波處理多目標(biāo)是,我們的目的是保證最高優(yōu)先級(jí)的目標(biāo)能留在框中,然后盡力將低優(yōu)先級(jí)的目標(biāo)放進(jìn)來(lái)。

新的算法是由框和距離約束擴(kuò)展出來(lái)的。相較于clamp單個(gè)點(diǎn),這種方式讓相機(jī)框能追蹤其他的目標(biāo)圓球。

每個(gè)生效的優(yōu)先級(jí)都會(huì)計(jì)算與i便,從最低的開始到最高的結(jié)束。以此保證高優(yōu)先級(jí)目標(biāo)永遠(yuǎn)在框內(nèi)。然后層層計(jì)算后得到繪制所有目標(biāo)的最佳方式。

下面是算法展示,她們都是在我們?cè)瓉?lái)做安全區(qū)約束的球面空間內(nèi)完成的

首先我們把框放在主角中間,當(dāng)然這是可選的,但是這個(gè)方法讓你可以擁有最大的安全區(qū),而不是明明只有奎托斯一個(gè)人的時(shí)候奎托斯還出現(xiàn)在邊上。

然后我們計(jì)算最低優(yōu)先級(jí)的區(qū)域

然后把狂移動(dòng)最小的距離并經(jīng)量覆蓋這個(gè)框。

每一個(gè)優(yōu)先級(jí)都反復(fù)上面的步驟

處理優(yōu)先級(jí)2

處理優(yōu)先級(jí)2,移動(dòng)框

處理優(yōu)先級(jí)1

處理優(yōu)先級(jí)1移動(dòng)框

完成之后,我么有了一個(gè)新的框,我們實(shí)際做的就是統(tǒng)計(jì)框的移動(dòng),并且引用到相機(jī)的方位角仰角參數(shù)上,這決定了boom target的位置。

我們替換了boom的距離約束的縮放。

相應(yīng)的是,我們從boom上計(jì)算相機(jī)初始位置,使用我們以前用過的權(quán)重極小化函數(shù)來(lái)決定dolly在軌道上的位置。

現(xiàn)在我們用目標(biāo)的外框區(qū)域在安全區(qū)外面的部分作為權(quán)重把相機(jī)拉回dolly,同時(shí)我們用boom target的距離當(dāng)作一個(gè)權(quán)重把相機(jī)向前推。

我們嘗試避免距離約束的阻尼是沒用的。因?yàn)檫@是一個(gè)明顯的危害,它干擾了dolly上的阻尼??赡軙?huì)導(dǎo)致不受歡迎的環(huán)形震動(dòng)


視頻展示43:40,可以看到單挑的時(shí)候有了明顯的提升,同時(shí)多目標(biāo)下也沒問題。

還有一些問題, 首先是我們?nèi)绾翁幚砉治锍錾劳??不像加?quán)平均算法,這個(gè)算法沒有可以計(jì)算的權(quán)重。

所以當(dāng)一個(gè)角色出生在屏幕外

我們得到了一個(gè)難看的結(jié)果

解決方法是給這個(gè)系統(tǒng)加上權(quán)重,然后用這個(gè)權(quán)重把目標(biāo)逐漸的移入移出

我們把目標(biāo)的位置在目標(biāo)物理上的位置和主角的位置做補(bǔ)間,我們永遠(yuǎn)不會(huì)移出主角,然后逐漸的讓目標(biāo)移進(jìn)框里,所以我們可以忽視其他在之后出生和死亡的目標(biāo)防止出現(xiàn)相機(jī)亂飛。

視頻演示45:03,注意防止目標(biāo)比奎托斯打太多(取目標(biāo)的位置不一定準(zhǔn)確)

既然我們有給一個(gè)目標(biāo)算權(quán)重的方式,我們可以把這個(gè)方式加入到我們之前的加權(quán)計(jì)算方式了。

第二個(gè)問題是個(gè)小trick。還記得我們是在球面空間操作的么,有一個(gè)不連續(xù)的從180到-180的過程

目標(biāo)穿到了相機(jī)后面,所以相機(jī)一下反過去了

糟糕的是,下一幀相機(jī)又反轉(zhuǎn)了回來(lái)

之前這不是一個(gè)問題。因?yàn)槲覀冇行У乇WC了一個(gè)目標(biāo)的時(shí)候,在約束生效的情況下,不會(huì)跑到我們后面。但是我們打破了這個(gè)承諾,誘惑著我們故意為之,覺得這個(gè)規(guī)定沒意義。


怎么解決這個(gè)問題呢

和我們前面加權(quán)的方案很想

我們修正了目標(biāo)的邏輯位置,讓他永遠(yuǎn)不會(huì)跑到相機(jī)后面去。我們把位置clamp到了相機(jī)平面平行的地方,有目標(biāo)約束的最小距離來(lái)定義??瓷先ズ枚嗔?。


游戲動(dòng)態(tài)相機(jī)系統(tǒng)的迭代——gdc session翻譯的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
遵义市| 广南县| 颍上县| 锡林郭勒盟| 双峰县| 岚皋县| 上栗县| 湖口县| 桓台县| 调兵山市| 旌德县| 十堰市| 乡宁县| 林周县| 怀远县| 浮山县| 伊金霍洛旗| 黑龙江省| 侯马市| 开江县| 水城县| 济阳县| 云浮市| 象山县| 普安县| 隆安县| 永丰县| 廊坊市| 砀山县| 岳普湖县| 原平市| 新田县| 长沙市| 青海省| 甘南县| 临颍县| 天峻县| 彩票| 宜良县| 竹溪县| 乐东|