ETH官方钱包

創作內容

5 GP

不錯的攝影機效果

作者:thenewguy│2020-07-27 07:32:31│巴幣:10│人氣:222
以前有看過遊戲有這樣的攝影機模式,只是我忘記是那個遊戲了XD
把剛剛參加完的GJ裡面我做的攝影機追蹤程式是魔改一番後,我覺得效果不錯就拿出來給大家看一看:D

總之先看效果
一開始攝影機對準玩家(就是那該死的預設方塊XD)

當玩家加速前進後攝影機會稍微有些延遲地跟上,放開加速後會慢慢地回來

加到全速時攝影機也會全力跟上

那我們來看看是怎麼做的吧
這個程式的靈感來源是CJ CAT大哥做的講物理約束的影片,把不同的物理量綁在一起再操作的想法真的很猛!大家有時間要去看一下(但是我線代很糟後面就....)

我們先來看這個攝影機運動模式的數學表示:
(這是線性增加速度的版本)
其中alpha是係數、r是玩家和攝影機的距離,看到這裡你一定發現了,這竟然是一個該死的微分方程式阿!XD
不過不用擔心,因為在實務中我們知道alpha及r,所以dr/dt=v=a*r就可以確定

之後是改良版本
,
這次就不是線性的速度增減了,我們將r換成sin(delta),其中delta是正規化後的距離,最近到最遠距離的值會被正規化成0到1,然後為了要帶進三角函數裡面算要再乘以pi/2,這樣子就算當玩家一開始移動時攝影機沒有跟上,在達到設定的最遠距離時攝影機也可以跟玩家等速運動,如此就不會跟丟,玩家停下後也會回到玩家位置!

然後是完成此效果的程式(最重要部分):

void move(){
        //distance Calc
        transform.position = new Vector3( transform.position.x,
        playerAttachedPoint.transform.position.y+fixed_yDist,transform.position.z);
        xDis = playerAttachedPoint.transform.position.x - transform.position.x;
        zDis = playerAttachedPoint.transform.position.z - transform.position.z;
        totDis = Mathf.Sqrt(Mathf.Pow(xDis,2)+Mathf.Pow(zDis,2));
        //set camera velocity
        GetComponent<Rigidbody>().velocity = new Vector3
        (  
        Mathf.Clamp(playerController.vectoredim2magnitude(playerController.velocity),maxSpeed,playerController.vectoredim2magnitude(playerController.velocity))
        * Mathf.Abs(xDis/totDis) * Mathf.Sin(Mathf.Clamp(xDis/maxDisplacement/2f*Mathf.PI,-Mathf.PI/2,Mathf.PI/2)) ,
        0f,Mathf.Clamp(playerController.vectoredim2magnitude(playerController.velocity),maxSpeed,playerController.vectoredim2magnitude(playerController.velocity))
         * Mathf.Abs(zDis/totDis) * Mathf.Sin(Mathf.Clamp(zDis/maxDisplacement/2f*Mathf.PI,-Mathf.PI/2,Mathf.PI/2)));
    }

如果有興趣的話不仿也動手做做看喔,我也準備了一些其他類型的函數,如果想試試其他的效果也可以拿來玩玩看!

引用網址:http://www.jamesdambrosio.com/TrackBack.php?sn=4862767
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 6 篇留言

風格A
目前覺得Cinemachine效果很不錯,我就沒有繼續鑽研攝影機的移動了!

感謝分享!

07-27 08:42

thenewguy
我沒用過cinemachane,看起來好像是給三維人物用的?07-27 16:16
KK
這就是數學的魔力~Magic~

07-27 10:33

thenewguy
數學就是魔法XD

07-27 16:02

黎黎貓
只有用過Cinemachine+1,2D3D都可以用

07-27 19:33

thenewguy
難道cinemachine是熱門的東西!?07-27 19:59
黎黎貓
應該是(?
我同學跟老師都有在用

07-28 12:55

thenewguy
原來是這樣,我的同學和老師都沒在用,不過上面那堆算式他們閉著眼睛都寫得出來XDD07-28 13:09
阿葉
幫你改改

void move()
{
//distance Calc
transform.position = new Vector3(transform.position.x,
playerAttachedPoint.transform.position.y + fixed_yDist, transform.position.z);
xDis = playerAttachedPoint.transform.position.x - transform.position.x;
zDis = playerAttachedPoint.transform.position.z - transform.position.z;
totDis = Mathf.Sqrt(Mathf.Pow(xDis, 2) + Mathf.Pow(zDis, 2));
//set camera velocity
if (cameraRigidbody == null)
cameraRigidbody = GetComponent<Rigidbody>();

cameraRigidbody.velocity = new Vector3(MathfStuff(xDis), MathfStuff(zDis));
}
void float MathfStuff (float dis)
{
return Mathf.Clamp(playerController.vectoredim2magnitude(playerController.velocity), maxSpeed, playerController.vectoredim2magnitude(playerController.velocity))
* Mathf.Abs(dis / totDis) * Mathf.Sin(Mathf.Clamp(dis / maxDisplacement / 2f * Mathf.PI, -Mathf.PI / 2, Mathf.PI / 2)),
}

08-02 21:22

thenewguy
把大函式切成一堆小函式的確是看了比較舒服,不然原本真的亂XD08-04 09:58
thenewguy
不過new Vector3(MathfStuff(xDis), MathfStuff(zDis))依我目測會變成x-y軸的移動?08-04 09:59
我要留言提醒:您尚未登入,請先登入再留言

5喜歡★thenewguy 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:使用方便的後處理製作警報... 後一篇:進度報告-大幅改善的畫面...


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情? 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】