UE4 ActionGame知識點總結3-Camera系統解析

APlayerCameraManager::SetViewtarget的作用就是根據參數設置PendingViewTarget和ViewTarget的信息。PendingViewTarget就是目標位置的Target信息,ViewTarget就是當前的Target信息。如果PendingViewTarget.Target有值,表示當前正在鏡頭切換中。

SetViewtarget就是確定鏡頭應該切換到哪個Actor上,而不是指定具體相機的位置和旋轉,因爲Actor可能會移動,提前指定位置旋轉不能保證相機切換到那裏的時候Actor還在那。因爲Actor身上可以綁定CameraComonent,所以指定Actor的好處是通過Actor可以找到CameraComonent的位置,然後切換到CameraComonent上。如果真的需要切到指定的位置和旋轉,那麼在那個位置生成一個CameraActor然後切換即可。

函數總結: SetViewtarget就是告訴CameraManager相機需要切換到傳入的Target上。這個函數邏輯僅僅設置PendingViewTarget和ViewTarget的Target信息,並沒有進行相機位置的計算。相機位置最終的計算是在下面的DoUpdateCamera中計算的,但是DoUpdateCamera函數需要的PendingViewTarget和ViewTarget是本函數設置的。

APlayerCameraManager::DoUpdateCamera首先判斷當前是否在切換過程中,如果不是,那麼通過UpdateViewtarget傳入Viewtarget可以獲取到當前鏡頭的信息。如果在切換過程中,通過切換時長,已經切換的時長,插值算法,當前Viewtarget的POV信息,目標PendingViewtarget的POV信息計算出當前應該的POV信息。如果切換時間到了,直接將PendingViewtarget賦值給Viewtarget並且置空PendingViewtarget。最後的POV信息通過FillCameraCache緩存起來。記住,實時的鏡頭POV信息是存儲在CameraCache中的,並不是Viewtarget的POV信息,因爲有可能當前在切換過程中

APlayerCameraManager::UpdateViewtarget 的作用是根據PendingViewTarget和ViewTarget的Target信息填充POV相關信息(其中就是相機的位置和旋轉),不會改變Target(Target是SetViewTarget函數負責改變的)。

具體邏輯:

1.  給POV的FOV,Ratio等信息先設置默認值。

2.  判斷Target是否是CameraActor類型

         是: POV信息由CameraComponent的GetCameraView填充。

      不是:先判斷是否是指定的相機類型(命令行camera  ***可以指定),如果是相機特定類型則特殊處理,否則交給PlayerCameraManager::UpdateViewTargetInteral填充。UpdateViewTargetInteral函數先判斷Cameramanager是否有藍圖複寫BlueprintUpdateCamera操作,這個函數提供了外部定製相機的機會。如果沒有復現則調用Target的CalcCamera。CalcCamera先判斷是否搜索綁定的CameraComponent,如果設置了搜索,那麼找到處於Active的CameraComponent,然後調用CameraComponent->GetCameraView,否則調用調用GetActorEyesViewPoint獲得相機位置和旋轉(內部使用的就是Actor本身的位置和旋轉,Pawn複寫了該函數,可以在藍圖中調整BaseEyeHeight);

3.  如果需要,應用相機的Modifiers,包括CameraAnims.

4.  設置PlayerCameraManager的Location和Rotation.參數就是上面綜合得到的位置。

5. 最後UpdateCameraLenEffects.這個函數是更新相機特效的位置,保證特效出現在相機前方。相機位置計算代碼:AEmitterCameraLensEffectBase::GetAttachedEmitterTransform。


舉例:

新建一個第三人稱的模板然後運行,鏡頭對着Player. 晃動鼠標鏡頭也同樣移動,不同的角度對着Player.我們就分析這個流程:

遊戲開始時系統會將Pawn設置爲ViewTarget(通過CameraManager::SetViewTarget)。接着系統Tick調用APlayerCameraManager::DoUpdateCamera,這時候ViewTarget是Pawn,PendingViewTarget沒有值。UpdateViewtarget 函數被調用並且傳入的是ViewTarget.然後調用到PlayerCameraManager::UpdateViewTargetInteral,再往後調用到Pawn身上的cameraComponent->GetCameraView。所以最後鏡頭的POV信息就是從Pawn身上的CameraComponent上獲得的。而我們移動鼠標改變的最終也是Pawn身上的CameraComponent信息。

擴展閱讀推薦:https://blog.csdn.net/u012999985/article/details/68947410

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章