UE4角色Location远距离时动画抖动问题(float精度不够)解决方案
生活随笔
收集整理的這篇文章主要介紹了
UE4角色Location远距离时动画抖动问题(float精度不够)解决方案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題:關于UE4引擎當角色Location超過9999.999后,角色動畫更新抖動問題的解決思路。
前提:
1.UE4引擎中距離單位是厘米(cm),也就說我們制作好1.8米的角色在UE4中為180個虛幻單位。這樣做個人愚見是為了提高浮點值(float)后面的精度。
2.UE4中Location的單位是使用的FVector,FVector是由3個float組成X,Y,Z。在DX11渲染模式下使用SSE指令集進行CPU加速計算優化,使用的是__m128(float4)由4個float浮點值組成。見下圖:
3.插槽Socket的更新是在CPU直接通過骨骼(bone)的矩陣直接去乘Component矩陣或者是Actor矩陣或者是Word矩陣得到的結果,所以基本不存在GPU更新CPU更新的問題。
發現問題:
角色在大世界無縫拼接的地圖上移動時或者不定位置進行運行時,相機離角色模型或者插槽(Socket)綁定的模型(Mesh)很近時會發現角色或者綁定在插槽上的模型開始抖動,并且在多次測試中發現抖動幅度并不一致。
透過現象猜本質:(推測)
1. 相機離角色部位或者插槽模型很近時遮蔽大部分骨骼,occ會踢出或降低骨骼在GPU更新頻率。
2. 當角色遠離原點時或者相機只看到綁定點時,骨骼或者動畫會LOD降低末端骨骼更新頻率或者降低計算精度。
3.當角色遠離原點時3個float組成的FVector精度不夠。(推測時認為可能性極低,引擎應該考慮過精度問題,并且當時角色距離原點位置目測不遠)
4. 寫代碼時獲取插槽位置方式不正確,或是Mesh綁定方式不正確。(推測時認為可能性極大... 找問題先從自身出發...)
測試:用~控制臺-命令行DEBUGSHOWANIMATION顯示骨骼和動畫信息,并且更好綁定方式和獲取插槽坐標,并用多種輸出方式和輸出斷點調試輸出位置信息。
最終經過多次測試和代碼調試發現當角色Location超過9999.999后因為float只能保證7位有效數據而導致精度出現問題從而骨骼更新時出現抖動問題,并且小數點前面的位數越多精度越底。
解決思路:
1. 修改float單精度浮點值為雙精度浮點值。 2. 修改本地坐標或者基礎虛幻距離單位。
解決方案:(支持RPC)
使用WorldOrigin世界原點偏移來解決float精度不夠問題。UnrealEngine4.12版本后加入并完善了大世界無縫地圖模塊(WorldTravel)和編輯功能,在Levels編輯器中可以加入子關卡作為流關卡加載(LevelStraming)。可以在主關卡的世界設置里(WorldSeting)中設置啟用WorldComponent并且勾選世界原點偏移WorldOrigin。
1. 在配置文件中添加 p.EnableMultiplayerWorldOriginRebasing=true
2. 當角色將要超過9999.99之前判斷當前角色是否超過自己業務中設定最大偏移值。如果超過請使用voidUGameplayStatics::GetWorldOriginLocation獲得當前原點坐標的世界位置(轉換前的真實位置:比如之前把8800,0,0轉換成了0,0,0)加上角色的當前位置再使用UGameplayStatics::SetWorldOriginLocation來設置角色的當前位置為新的世界坐標的原點,這樣角色在更新動畫時或者進行其他計算時會按照當前設置的位置作為原點(0,0,0)點更新或計算從而減小誤差。
3. 注意這兩個API的入參和返回值都是FIntVector轉換時不要丟掉精度。當客戶端SetWorldOriginLocation時Levels會遍歷所有關卡中的Level.Actor.Component進行WorldOffset修改會比較耗時(尤其是關卡中物體很多時請諸君慎用)最好是做一個坐標管理器系統(CoordSystem)搭配多種策略來進行使用,減少使用頻次。例如:當需要近距離觀察角色或者插槽上掛的Mesh時更新,或者FPS游戲拿出可以開啟瞄準或者開鏡武器時,角色位置每當超過8888時等等。
4.世界原點偏移(WorldOrigin)在RPC模式下只會修改客戶端位置,在移動同步(Movement)根骨骼位移(RootMotion)物理計算模擬(PhysicsSimulate)時在同步時會把角色當前位置和世界原點偏移位置加起來一起發到服務器。服務器接收的真實位置而不是修改世界原點后角色位置。 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
前提:
1.UE4引擎中距離單位是厘米(cm),也就說我們制作好1.8米的角色在UE4中為180個虛幻單位。這樣做個人愚見是為了提高浮點值(float)后面的精度。
2.UE4中Location的單位是使用的FVector,FVector是由3個float組成X,Y,Z。在DX11渲染模式下使用SSE指令集進行CPU加速計算優化,使用的是__m128(float4)由4個float浮點值組成。見下圖:
3.插槽Socket的更新是在CPU直接通過骨骼(bone)的矩陣直接去乘Component矩陣或者是Actor矩陣或者是Word矩陣得到的結果,所以基本不存在GPU更新CPU更新的問題。
發現問題:
角色在大世界無縫拼接的地圖上移動時或者不定位置進行運行時,相機離角色模型或者插槽(Socket)綁定的模型(Mesh)很近時會發現角色或者綁定在插槽上的模型開始抖動,并且在多次測試中發現抖動幅度并不一致。
透過現象猜本質:(推測)
1. 相機離角色部位或者插槽模型很近時遮蔽大部分骨骼,occ會踢出或降低骨骼在GPU更新頻率。
2. 當角色遠離原點時或者相機只看到綁定點時,骨骼或者動畫會LOD降低末端骨骼更新頻率或者降低計算精度。
3.當角色遠離原點時3個float組成的FVector精度不夠。(推測時認為可能性極低,引擎應該考慮過精度問題,并且當時角色距離原點位置目測不遠)
4. 寫代碼時獲取插槽位置方式不正確,或是Mesh綁定方式不正確。(推測時認為可能性極大... 找問題先從自身出發...)
測試:用~控制臺-命令行DEBUGSHOWANIMATION顯示骨骼和動畫信息,并且更好綁定方式和獲取插槽坐標,并用多種輸出方式和輸出斷點調試輸出位置信息。
最終經過多次測試和代碼調試發現當角色Location超過9999.999后因為float只能保證7位有效數據而導致精度出現問題從而骨骼更新時出現抖動問題,并且小數點前面的位數越多精度越底。
解決思路:
1. 修改float單精度浮點值為雙精度浮點值。 2. 修改本地坐標或者基礎虛幻距離單位。
解決方案:(支持RPC)
使用WorldOrigin世界原點偏移來解決float精度不夠問題。UnrealEngine4.12版本后加入并完善了大世界無縫地圖模塊(WorldTravel)和編輯功能,在Levels編輯器中可以加入子關卡作為流關卡加載(LevelStraming)。可以在主關卡的世界設置里(WorldSeting)中設置啟用WorldComponent并且勾選世界原點偏移WorldOrigin。
1. 在配置文件中添加 p.EnableMultiplayerWorldOriginRebasing=true
2. 當角色將要超過9999.99之前判斷當前角色是否超過自己業務中設定最大偏移值。如果超過請使用voidUGameplayStatics::GetWorldOriginLocation獲得當前原點坐標的世界位置(轉換前的真實位置:比如之前把8800,0,0轉換成了0,0,0)加上角色的當前位置再使用UGameplayStatics::SetWorldOriginLocation來設置角色的當前位置為新的世界坐標的原點,這樣角色在更新動畫時或者進行其他計算時會按照當前設置的位置作為原點(0,0,0)點更新或計算從而減小誤差。
3. 注意這兩個API的入參和返回值都是FIntVector轉換時不要丟掉精度。當客戶端SetWorldOriginLocation時Levels會遍歷所有關卡中的Level.Actor.Component進行WorldOffset修改會比較耗時(尤其是關卡中物體很多時請諸君慎用)最好是做一個坐標管理器系統(CoordSystem)搭配多種策略來進行使用,減少使用頻次。例如:當需要近距離觀察角色或者插槽上掛的Mesh時更新,或者FPS游戲拿出可以開啟瞄準或者開鏡武器時,角色位置每當超過8888時等等。
4.世界原點偏移(WorldOrigin)在RPC模式下只會修改客戶端位置,在移動同步(Movement)根骨骼位移(RootMotion)物理計算模擬(PhysicsSimulate)時在同步時會把角色當前位置和世界原點偏移位置加起來一起發到服務器。服務器接收的真實位置而不是修改世界原點后角色位置。 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的UE4角色Location远距离时动画抖动问题(float精度不够)解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《英雄联盟手游》无限乱斗今天上线:超短C
- 下一篇: opendrive匝道