【unity實戰】Animator啟用root motion根運動動畫,實現完美的動畫動作匹配

文章目錄

  • 前言
    • 1、動畫分類
    • 2、如何使用根位移動畫?
  • 一、根位移動畫的具體使用
    • 1、導入人形模型
    • 2、導入動畫
    • 3、配置動畫參數
    • 4、配置角色Animator動畫狀態機
    • 5、使用代碼控制人物前進后退
  • 二、問題分析
  • 三、Humanoid動畫中的Root Motion機制及相關配置
    • 1、Humanoid動畫中的Root Motion機制和動畫復用原理
    • 2、Root Motion相關配置
      • 2.1 root transform rotation 根變換旋轉
        • (1)bake into pose 烘培成的動作
        • (2)loop match 循環匹配
        • (3)based upon 依據:根旋轉的基礎
      • 2.2 root transform position 根變換位置
        • (1)bake into pose 烘培成的動作
        • (2)based upon 依據
      • 2.3 Root Transfom Position (XZ) 根變換位置(XZ)
        • (1)bake into pose 烘培成的動作
        • (2)based upon 依據
    • 3、總結:`humanoid`動畫配置最近實踐
  • 四、問題修復
    • 1、角色下沉問題修復
    • 2、走著走著角色走歪了
  • 五、Root Motion動畫位移還受到物體縮放的影響
  • 專欄推薦
  • 完結

前言

1、動畫分類

在游戲開發中,我們常見的動畫文件一般分為兩種:

  • in place原地動畫:也就是不帶位移的動畫
  • root motion根運動動畫:也就是自帶“根位移”的動畫

這種所謂自帶“根位移”的動畫能夠帶來的好處是顯而易見的,它有效地避免了角色動畫和實際位移不同步的現象。比如我們經常可能會出現的滑步問題。
在這里插入圖片描述

2、如何使用根位移動畫?

如果對Animator的知識還不了解,可以先去查看:【unity游戲開發——Animator動畫】

如果在項目中使用自帶位移的動畫,只需要勾選Animaator上的Apply Root Motion選項即可。
在這里插入圖片描述

一、根位移動畫的具體使用

1、導入人形模型

模型可以隨意選擇,這里我使用的是最近很火的:mita米塔模型。
在這里插入圖片描述

2、導入動畫

如果你還不知道如何使用mixamo,可以查看:【游戲資源】獲取免費開源的人物模型,為obj fbx人物模型綁定人形骨骼和人形動畫,并導入到unity中使用——mixamo的使用介紹

我們可以從mixamo下載兩個前進和后退的root motion根運動動畫
在這里插入圖片描述

3、配置動畫參數

配置動畫為人形,且可循環播放
在這里插入圖片描述

4、配置角色Animator動畫狀態機

Animator狀態機配置也非常簡單,兩個bool參數控制動畫切換即可
在這里插入圖片描述

5、使用代碼控制人物前進后退

注意:這里使用的是InputSystem輸入控制,如果你還不了解如何使用。可以先去看看:【unity游戲開發——InputSystem】

使用代碼控制人物前進后退。因為使用了root motion動畫改變位置,所以在這個腳本里,我們完全不需要處理角色的位移。

using UnityEngine;
using UnityEngine.InputSystem;public class PlayerController : MonoBehaviour
{Animator animator;PlayerInput playerInput;Vector2 vector2;void Awake(){playerInput = GetComponent<PlayerInput>();animator = GetComponent<Animator>();}private void OnEnable() {// 輸入觸發事件,任何輸入都會觸發該事件playerInput.onActionTriggered += OnActionTrigger;}void OnDisable() {playerInput.onActionTriggered -= OnActionTrigger;}private void OnActionTrigger(InputAction.CallbackContext context){switch (context.action.name){case "Move":// 獲取輸入的方向值(Vector2類型)vector2 = context.ReadValue<Vector2>();// 如果Y軸方向的值大于0(向前)if (vector2.y > 0f){animator.SetBool("isForward", true);}else{animator.SetBool("isForward", false);}// 如果Y軸方向的值小于0(向后)if (vector2.y < 0f){animator.SetBool("isBackward", true);}else{animator.SetBool("isBackward", false);}break;}}
}

掛載腳本,配置參數
在這里插入圖片描述

效果
在這里插入圖片描述

二、問題分析

  • 角色似乎并沒有走直線,我們只是按了前進和后退,她居然發生了轉向,走著走著走歪了。
  • 而且似乎角色的高度也在下降,待機狀態下發現人物的腳都陷到了地下了。
    在這里插入圖片描述
    這些問題我們后面再一一解決。

三、Humanoid動畫中的Root Motion機制及相關配置

1、Humanoid動畫中的Root Motion機制和動畫復用原理

root motion會把動畫文件中描述的對游戲對象的坐標和角度值轉換為相對位移和相對轉角,并以此來移動游戲對象。

generic泛型動畫中root motion會把動畫文件中描述的根骨骼坐標值和角度值轉換為相對位移和相對轉角,并以此來移動游戲對象。

那么到了humanoid動畫里,由于使用了Avatar系統,動畫文件不再包含對具體骨骼的描述我們自然也就無法通過指定根骨骼來應用roo motion

所以unityhumanoid動畫中通過分析骨骼的結構,計算出模型的重心center of mass,這個重心也可以被稱為body transform,在預覽動畫這里激活下面這個選項,就可以看見它的重心,一般是在人物的中間位置。
在這里插入圖片描述
我們可以把這個unity計算出來的root transform,當做humanoid動畫下代表root motion的根骨骼節點,通過這種方式,我們就可以在不同的骨骼結構上復用同一個root motion動畫
在這里插入圖片描述

2、Root Motion相關配置

unity把root motion劃分成了三個部分
在這里插入圖片描述

2.1 root transform rotation 根變換旋轉

根位置的旋轉相關,要注意一下,root motion的旋轉特指繞y軸的旋轉。

(1)bake into pose 烘培成的動作

勾選表示root motion不使用動畫自帶的旋轉。

(2)loop match 循環匹配

這里的這個紅色標記代表了這個動畫在角度上的吻合度
在這里插入圖片描述
如果這個動畫在播放中的轉角過大,這里就會提示紅色,告訴我們這個動畫如果勾選了bake into pose則會帶來不好的效果,比如如果我們是帶旋轉的動畫。

而對于動畫過程中轉角較小的動畫,比如說行走這里就會提示呈綠色,告訴我們可以勾選。

總結:要不要勾選bake into pose取決于我們需不需要動畫來驅動游戲對象的旋轉,而能不能勾選,則要參考這里loop match的紅色或綠色提示。

(3)based upon 依據:根旋轉的基礎

這里指的是游戲對象在動畫開始時對準的方向是哪里。
在這里插入圖片描述
在這里插入圖片描述

  • Original:保持源文件中的原始旋轉
  • Root Node Rotation:使用根節點的旋轉(僅適用Generic通用動畫類型)
  • Body Orientation:保持上半身朝前(僅適用于Humanoid人形動畫類型)

Generic和humanoid動畫這里的參數有所區別,唯一區別是,Generic動畫里的root motion是基于根骨骼root node的,所以這里可以把根骨骼的朝向當做動畫的朝向。而humanoid的動畫并沒有根骨骼,所以Unity就把計算出來的重心body transform身體方向的方向放在這里供我們選擇。
在這里插入圖片描述
由于humanoid的方向是Unity計算出來的,所以一般情況下也不太準,所以大家如果是使用Mixamo上的動畫的話,這里一般選擇original原始。

2.2 root transform position 根變換位置

沿y軸的位移

(1)bake into pose 烘培成的動作

將垂直根運動烘焙到骨骼移動。禁用此選項將會存儲為根運動。假如移動不勾選根對象可能會上下移動,勾選了根對象不會上下移動,更平穩。一般都是勾選的。

(2)based upon 依據

垂直方向上把模型的哪個位置對齊到游戲對象的原點上。
在這里插入圖片描述

  • Original:保持源文件中的垂直位置。默認是original原始,也就是3D美術設置的動畫原點。
  • Root Node Position:使用垂直根位置(僅適用Generic通用動畫類型)
  • Center Of Mass:保持質心與根位置對其(僅適用Humanoid人形動畫類型)。center of mass質心或重心就是我們前面提到過的,unity計算出的那個body transform,選擇它的話可以看到游戲對象的位置對齊到了重心的位置。
    在這里插入圖片描述
  • Feet:(注意這里英寸是翻譯有問題,翻譯成才對),保持雙腳與根變換位置對齊(僅適用Humanoid人形動畫類型)。Feet就是模型的腳,或者說Avatar系統下的腳。在generic動畫中是沒有腳這個慨念的,它只是處理單純的骨骼。而在humanoid動畫中,借助Avatar我們是可以明確的知道每一塊的骨骼對應人體的結構。我們選擇feet試一下,可以發現它和original的差別并不大。
    在這里插入圖片描述

那么這個feet和original的區別在哪?以及我們應該選擇哪一個呢?

我們可以相信Mixamo中的original,因為這個original就是動畫美術為我們提供的原點。但是那僅限于generic動畫,而在humanoid動畫中,因為動畫的復用會使得動畫發生一系列的變形。

簡單來說,動畫原本是針對A模型制作的,那么這個original或者說原點就是A模型播放動畫時的原點,當我們使用B模型復用這個動畫時,我們沒有辦法保證Avatar轉移后的原點,還能夠保持其原來的準確性。所以當我們選擇original時,如果發現效果不佳,除了調節下面的offset之外還可以考慮這個feet選項。

比如我們當前選擇的這個idle動畫,在選擇original時,角色的腳已經陷到地面以下。
在這里插入圖片描述
我們改成feet試一下,發現好了一點。
在這里插入圖片描述

2.3 Root Transfom Position (XZ) 根變換位置(XZ)

就是root motion在水平平面上x和z軸的位移設置。

(1)bake into pose 烘培成的動作

將水平根運動烘焙到骨骼移動。禁用此選項將會存儲為根運動。可以理解為不勾選根對象會水平運動,勾選了只會播動畫根對象不會水平運動。

如果我們不希望這個動畫控制角色在水平方向上位移,就勾選這里的bake into pose 烘培成的動作,比如待機動畫,原地轉身動畫,原地起跳動畫都可以勾選。
在這里插入圖片描述

(2)based upon 依據

在這里插入圖片描述

  • Original:保持源文件中的水平位置
  • Root Node Position:使用水平根位置(僅適用Generic通用動畫類型)
  • Center Of Mass:保持與根位置對其(僅適用Humanoid人形動畫類型)

這里的center of mass指的就是重心在水平平面的投影位置。
在這里插入圖片描述

3、總結:humanoid動畫配置最近實踐

  • bake into pose烘培成的動作:要不要勾選取決于我們需不需要動畫來驅動游戲對象,而能不能勾選,則要參考這里loop match循環匹配的紅色或綠色提示。
    在這里插入圖片描述

  • root transform rotation 根變換旋轉的based upon 依據body transform身體方向參數是Unity計算出來的,一般情況下不太準,所以這里我們一般選擇original原始
    在這里插入圖片描述

  • root transform position 根變換位置的based upon 依據humanoid動畫中,因為動畫的復用會使得動畫發生一系列的變形。這里最好選擇feet腳。(注意這里英寸是翻譯有問題,翻譯成才對)
    在這里插入圖片描述

四、問題修復

有了前面的介紹,我們現在可以對Root Motion動畫的問題進行修復了。

1、角色下沉問題修復

問題就是不該處理垂直位移的動畫在控制角色對象的垂直位移,把動畫的root transform position Ybake into pose都給勾上。并把based upon 依據修改成feet
在這里插入圖片描述
發現好了很多
在這里插入圖片描述

2、走著走著角色走歪了

這就說明我們不該應用前進和后退動畫的旋轉。那么我們可以把它的root transform rotationbake into pose給勾上,并修改based upon為origina
在這里插入圖片描述
如果切換成original還是有點歪的話,大家可以手動調整一下這里的offset偏移。

效果,我們可以看到現在角色不會走著走著歪了,問題解決
在這里插入圖片描述

五、Root Motion動畫位移還受到物體縮放的影響

還有一點需要注意,那就是Root Motion動畫位移還受到物體縮放的影響。比如除了縮放不一樣,其他條件完全一樣的一大一小兩個角色,它的移動距離是不一樣的。
在這里插入圖片描述
如果大角色的移動速度是1,那么縮放了0.1的小角色移動速度就是0.1。具體可以參考:Unity中Root Motion的核心機制


專欄推薦

地址
【unity游戲開發入門到精通——C#篇】
【unity游戲開發入門到精通——unity通用篇】
【unity游戲開發入門到精通——unity3D篇】
【unity游戲開發入門到精通——unity2D篇】
【unity實戰】
【制作100個Unity游戲】
【推薦100個unity插件】
【實現100個unity特效】
【unity框架/工具集開發】
【unity游戲開發——模型篇】
【unity游戲開發——InputSystem】
【unity游戲開發——Animator動畫】
【unity游戲開發——UGUI】
【unity游戲開發——聯網篇】
【unity游戲開發——優化篇】
【unity游戲開發——shader篇】

完結

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果學習過程中遇到任何問題,也歡迎你評論私信找我。

贈人玫瑰,手有余香!如果文章內容對你有所幫助,請不要吝嗇你的點贊評論和關注,你的每一次支持都是我不斷創作的最大動力。當然如果你發現了文章中存在錯誤或者有更好的解決方法,也歡迎評論私信告訴我哦!
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80104.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80104.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80104.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

中間件--ClickHouse-10--海量數據存儲如何抉擇ClickHouse和ES?

在Mysql數據存儲或性能瓶頸時&#xff0c;采用冷熱數據分離的方式通常是一種選擇。ClickHouse和Elasticsearch&#xff08;ES&#xff09;是兩個常用的組件&#xff0c;但具體使用哪種組件取決于冷數據的存儲目的、查詢模式和業務需求等方面。 1、核心對比 &#xff08;1&…

服務器運維:服務器流量的二八法則是什么意思?

文章目錄 用戶行為角度時間分布角度應用場景角度 服務器流量的二八法則&#xff0c;又稱 80/20 法則&#xff0c;源自意大利經濟學家帕累托提出的帕累托法則&#xff0c;該法則指出在很多情況下&#xff0c;80% 的結果是由 20% 的因素所決定的。在服務器流量領域&#xff0c;二…

springboot對接豆包大模型

文檔地址: 豆包大模型-火山引擎 模型廣場地址: 賬號登錄-火山引擎 首先來到模型廣場&#xff0c;選取你需要的模型,我這邊要做圖片理解的應用&#xff0c;所以選用了Doubao-1.5.vision-pro. 點立即體驗&#xff0c;進入一個新的頁面&#xff0c;可以上傳圖片&#xff0c;然后…

數據通信學習筆記之OSPF其他內容3

對發送的 LSA 進行過濾 當兩臺路由器之間存在多條鏈路時&#xff0c;可以在某些鏈路上通過對發送的 LSA 進行過濾&#xff0c;減少不必要的重傳&#xff0c;節省帶寬資源。 通過對 OSPF 接口出方向的 LSA 進行過濾可以不向鄰居發送無用的 LSA&#xff0c;從而減少鄰居 LSDB 的…

智能安全用電系統預防電氣線路老化、線路或設備絕緣故障

智能安全用電系統預防電氣線路老化、線路或設備絕緣故障 智能安全用電系統&#xff0c;猶如一位忠實而敏銳的衛士&#xff0c;主要針對低壓供電網中一系列潛在的危險狀況進行了全方位且行之有效的預防和保護。 智能安全用電系統在低壓供電網這個復雜的體系中&#xff0c;電氣線…

使用Intel Advisor工具分析程序

使用Intel Advisor工具分析程序 Intel Advisor是一款性能分析工具&#xff0c;主要用于識別代碼中的向量化機會、線程化和內存訪問模式等問題。以下是使用Intel Advisor分析程序的基本步驟&#xff1a; 安裝與準備 從Intel官網下載并安裝Intel Advisor&#xff08;通常作為I…

【UniApp】Vue2 scss 預編譯器默認已由 node-sass 更換為 dart-sass

從 HBuilderX 4.56 &#xff0c;vue2 項目也將默認使用 dart-sass 預編譯器。 vue2開發者sass預處理注意&#xff1a; sass的預處理器&#xff0c;早年使用node-sass&#xff0c;也就是vue2最初默認的編譯器。 sass官方推出了dart-sass來替代。node-sass已經停維很久了。 另…

智慧能源安全新紀元:當能源監測遇上視頻聯網的無限可能

引言&#xff1a;在數字化浪潮席卷全球的今天&#xff0c;能源安全已成為國家安全戰略的重要組成部分。如何構建更加智能、高效的能源安全保障體系&#xff1f;能源安全監測平臺與視頻監控聯網平臺的深度融合&#xff0c;正為我們開啟一扇通向未來能源管理新世界的大門。這種創…

C++游戲服務器開發之⑦redis的使用

目錄 1.當前進度 2.守護進程 3.進程監控 4.玩家姓名添加文件 5.文件刪除玩家姓名 6.redis安裝 7.redis存取命令 8.redis鏈表存取 9.redis程序結構 10.hiredisAPI使用 11.基于redis查找玩家姓名 12.MAKEFILE編寫 13.游戲業務實現總結 1.當前進度 2.守護進程 3.進程監…

db中查詢關于null的sql該怎么寫

正確示例 # 等于null select * from 表名 where 字段名 is NULL; # 不等于null select * from 表名 where 字段名 is not NULL;若需要同時判斷字段不等于某個值且不為null select * from users where age ! 30 and age is not null; select * from users where age ! 30 or a…

從“堆料競賽”到“體驗深耕”,X200 Ultra和X200s打響手機價值升維戰

出品 | 何璽 排版 | 葉媛 vivo雙旗艦來襲&#xff01; 4月21日&#xff0c;vivo X系列春季新品發布會盛大開啟&#xff0c;帶來了一場科技與創新的盛宴。會上&#xff0c;消費者期待已久的X200 Ultra及X200s兩款旗艦新品正式發布。 vivo兩款旗艦新品發布后&#xff0c;其打破…

多模態大語言模型arxiv論文略讀(三十二)

Proximity QA: Unleashing the Power of Multi-Modal Large Language Models for Spatial Proximity Analysis ?? 論文標題&#xff1a;Proximity QA: Unleashing the Power of Multi-Modal Large Language Models for Spatial Proximity Analysis ?? 論文作者&#xff1a…

基于貝葉斯優化的Transformer多輸入單輸出回歸預測模型Bayes-Transformer【MATLAB】

Bayes-Transformer 在機器學習和深度學習領域&#xff0c;Transformer模型已經廣泛應用于自然語言處理、圖像識別、時間序列預測等多個領域。然而&#xff0c;在一些實際應用中&#xff0c;我們面臨著如何高效地優化模型超參數的問題。貝葉斯優化&#xff08;Bayesian Optimiz…

Ruby 正則表達式

Ruby 正則表達式 引言 正則表達式&#xff08;Regular Expression&#xff0c;簡稱Regex&#xff09;是一種強大的文本處理工具&#xff0c;在編程和數據處理中有著廣泛的應用。Ruby 作為一種動態、靈活的編程語言&#xff0c;同樣內置了強大的正則表達式功能。本文將詳細介紹…

kubernetes》》k8s》》刪除命名空間

使用 kubectl delete ns 命名空間 --force --grace-period0 如果還刪除不掉 需要 kubectl get namespace 命名空間 -o json > x.json vim x.json kubectl replace --raw “/api/v1/namespaces/命名空間/finalize” -f ./x.json

玩轉Docker | 使用Docker部署DashMachine個人書簽工具

玩轉Docker | 使用Docker部署DashMachine個人書簽工具 前言一、DashMachine介紹DashMachine簡介DashMachine使用場景二、系統要求環境要求環境檢查Docker版本檢查檢查操作系統版本三、部署DashMachine服務下載鏡像創建容器創建容器檢查容器狀態檢查服務端口安全設置四、訪問Das…

SQL進階知識:一、高級查詢

今天介紹下關于高級查詢的詳細介紹&#xff0c;包括子查詢、連接查詢、分組查詢等&#xff0c;并結合MySQL數據庫提供實際例子。 一、子查詢&#xff08;Subqueries&#xff09; 子查詢是嵌套在另一個查詢中的查詢語句&#xff0c;通常用于提供條件過濾、生成臨時數據集等。子…

【Git】Git Revert 命令詳解

Git Revert 命令詳解 1. Git Revert 的基本概念 Git Revert 是一個用于撤銷特定提交的命令。與 Git Reset 不同&#xff0c;Git Revert 不會更改提交歷史&#xff0c;而是會創建一個新的提交來撤銷指定提交的更改。這意味著&#xff0c;使用 Git Revert 后&#xff0c;項目的…

華為S系列交換機CPU占用率高問題排查與解決方案

問題概述 在華為S系列交換機(V100&V200版本)運行過程中&#xff0c;CPU占用率過高是一個常見問題&#xff0c;可能導致設備性能下降甚至業務中斷。根據華為官方維護寶典&#xff0c;導致CPU占用率高的主要原因可分為四大類&#xff1a;網絡攻擊、網絡震蕩、網絡環路和硬件…

招募隊員問題

#include <bits/stdc.h> using namespace std;int main() {int n;cin >> n; // 輸入隊伍人數&#xff08;行數&#xff09;vector<int> maxx(5, 0); // 用于記錄每個數字&#xff08;1~5&#xff09;出現的最大連續段長度// 定義二維數組 team&#xff0c;n …