UE4 third person第三人稱攝像機設置的原理解釋以及Control Rotation到底是個啥


1.Control Rotation 到底是是個啥:

首先作為游戲開發者,我們就是上帝,於是當我們需要擺布我們的角色的時候我需要知道他在哪(Location),他是什么姿勢(rotation),他被放大了多少倍(Scale),除了姿勢以外其他的信息都直接存在我的上帝之手中的一根指向我的傀儡的指針所指的位置(Pawn,我不需要特別了解,想知道的時候拿過來康康就可以了)。但是我呢,有點不對勁就特別喜歡知道他的姿勢,於是我就自己一開始存了一個姿勢,你可以當成是我的上帝之眼的姿勢吧。我們經常在third person游戲中使用諸如 add playercontroller yaw pitch roll啥的函數,就是在變化我的上帝之眼的姿勢這個姿勢其實也是我們的playercontroller本身actor的rotation。只不過我們的控制器是不變的位置的,因為沒意義。所以我們f8進行調試的時候就能在某個角落發現我們的上帝之眼了ORZ。

   

經過驗證這個control rotation 就和actor rotation 一毛一樣。 而且這個值跟攝像機啥的一毛錢關系都沒有,從源碼上來看只有 playercontroller 的rotation影響攝像機的rotation。而不存在反過來影響,control rotation就是一個很特別的存在。

 

 2.在我們設置camera和spring arm的時候遇到的一些check box的作用機理。

 

 首先是spring arm里面的 Use Pawn contorl Rotation這里就是問你用不用上帝之眼的姿勢。注意這里的使用是Runtime時候使用所以勾選此選項在自己的角色中調整spring arm的rotation啥的都會顯示變化,

剩下的三個選項就會影響你在editor中調整arm的rotation的時候是否會有對應的變化顯示。

在此之前請我們看一下源碼

 

 

 

 

 在spring arm更新自己的rotation的時候就是直接先看有沒有使用上帝之眼用了的話就直接給我,然后再依次檢查有沒有繼承父親的rotation,沒有繼承的話就直接粗暴的給我用自己的relative rotation(這是一個固定值請注意)覆蓋掉。這段代碼的解讀就能理解兩個場景的原因了。

一:Character不適用上帝之眼而我們的spring arm使用,但是我們不繼承任何一個relative rotation 分量此時看代碼就知道,使用上帝之眼被無效化了因為全部被覆蓋了。所以此時我們的第三人稱環繞攝像機就沒得用了。

二:Character使用上帝之眼時:

我們的spring arm 在不繼承rotation選項的時候 spring arm無法呈現跟隨的視角變化其原因就在於 DisiredRot統一被置換為0,0,0 而這個DisiredRot是用來決定springarm的孩子組件相對於armspring的起點的rotation的,所以也就被固定在那了。上帝之眼使用選項就變得沒有意義了。。

當我們選擇了繼承選項的時候我們就不會覆蓋為一個定值,因為我們的spring arm相對於人物旋轉,而desired則會獲得componentRotation這個就是arm相對於它的worldlocation的一個rotation。所以也跟着旋轉。

總結:一般情況不要把這個inherit選項全勾上以免固定式視角了。但實際上靈活的camera還不如直接自己設定relative rotation。需要注意的一點是:這里的disiredRot只是作用於當前的viewtarget的所以當character不轉動時候我們的componentrotation就無法得到更新,此時我們仍然可以使用use pawn rotation來使得desiredRot得到更新

 

Plus:連夜實驗了一下,Desired只是對child有用,比如說我們關閉character的上帝之眼使用選項,輸出arm這個component的world rotation不會有任何變化,但是視角依然在變化,於是我們進到源碼里面尋找答案:

 

 armspring 首先是繼承自scenecomponent,在它的tick函數中只有updateArmLocation這個函數,在此函數中沒有任何改變worldrotation的調用,而能夠改變這個值的只有在其parent節點的函數中進行,這也就解釋了為什么我們的鏡頭一直在轉卻無法更新本身的rotation。因為每次update的時候arm只更新了socket和子節點的transform並不涉及自身的這個值的變更。

 

至於為什么editor里面所看到的arm像是rotation改變了,我們所觀察到的紅線只是攝像機相對於armspring的worldlocation的一個desiredRotation其實就這這么簡單。。。。

 看這張圖就能知道arm本身的位置和旋轉根本就沒變。

 

pluss:arm的worldrotation實際上是相對於父節點的rotation,並不是相對於世界坐標0,0,0的。

打個比方當我們在確定 arm的worldtransform的時候首先將arm的起始位置跟隨character worldtransform一起進行變換然后,輪到變換我的arm的時候,先把已經跟隨character變換過的arm起點移到0,0,0然后再進行rotation變換。實際上這里就是說的directx里面的Transform的計算方法了:先scale后rotaion最后location的變換。。

所以ue4上的worldrotation都是指的是把父節點移到原點再apply的rotation 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM