日前,一位荷蘭學(xué)生Tom Kemna通過Unreal引擎為手指應(yīng)用了基本的反向運(yùn)動(dòng)學(xué),并分享介紹了自己的開發(fā)歷程。以下是映維網(wǎng)的具體整理:
Tom Kemna實(shí)現(xiàn)的效果
1. 背景
簡(jiǎn)單的背景介紹,如果沒有興趣你可以跳過這一段。我是一名學(xué)生,而我們正在用HTC Vive Pro開發(fā)一款VR恐怖游戲。我希望獲得更多與VR交互相關(guān)的經(jīng)驗(yàn),因此我爭(zhēng)取到了玩家角色實(shí)現(xiàn)這一職責(zé)。在開發(fā)過程中,我看到一個(gè)視頻關(guān)于將反向運(yùn)動(dòng)學(xué)用于上樓梯時(shí)雙腳,于是我就問自己:嘿,我是否也能這樣做呢?
2. 介紹
首先,如果你不知道什么是反向運(yùn)動(dòng)學(xué),我推薦你看這個(gè)視頻:
簡(jiǎn)單來說,這是為骨骼網(wǎng)格制作動(dòng)畫的方法。在Unreal引擎中,你可以在動(dòng)畫藍(lán)圖中采用名為“Two Boned IK”節(jié)點(diǎn)的選項(xiàng)來實(shí)現(xiàn)這一點(diǎn)。你提供兩個(gè)位置:一個(gè)“效應(yīng)器”和一個(gè)“關(guān)節(jié)”,而它們將允許允許你操縱骨骼。
2. 實(shí)現(xiàn)
我已經(jīng)開發(fā)了一個(gè)簡(jiǎn)單的系統(tǒng):當(dāng)你抓住對(duì)象時(shí),系統(tǒng)將允許你用手指包裹它們。有很多方法可以實(shí)現(xiàn)反向運(yùn)動(dòng)學(xué),下面我將介紹問題是什么,而我又是如何進(jìn)行解決。然后,我將簡(jiǎn)要說明為什么會(huì)選擇這個(gè)解決方案。
2.1 問題
對(duì)于沉浸感,我們需要雙手的操作盡可能逼真。為此,我們需要用手指包裹對(duì)象并與之交互,這樣我們就不會(huì)出現(xiàn)截?cái)嗷蚍浅lo態(tài)的雙手。
這是一個(gè)問題,我們需要為一堆手指檢測(cè)碰撞,然后它們需要停留在遇到的第一個(gè)對(duì)象上。
2.2 解決方案
最后,我選擇了一個(gè)采用常規(guī)藍(lán)圖邏輯和動(dòng)畫藍(lán)圖邏輯組合的系統(tǒng)。
要實(shí)現(xiàn)反向運(yùn)動(dòng)學(xué),你需要準(zhǔn)備一定的工具:1.正確rigged的骨架網(wǎng)格;2.rig的動(dòng)畫藍(lán)圖。3.利用骨架網(wǎng)格的藍(lán)圖。
首先,我們需要找到手指所在的位置。我決定創(chuàng)建隱藏在游戲中的UE4箭頭組件,并根據(jù)每個(gè)箭頭的變換計(jì)算線條軌跡。
下面是采用默認(rèn)Unreal 4手部網(wǎng)格的藍(lán)圖視圖:
第三則與反向運(yùn)動(dòng)學(xué)有關(guān)。Unreal引擎允許用戶設(shè)置Two-Boned反向運(yùn)動(dòng)學(xué)。如果采用動(dòng)畫藍(lán)圖,你可以將每個(gè)手指設(shè)置為通過兩個(gè)位置將反向運(yùn)動(dòng)應(yīng)用于兩個(gè)骨骼。
最大的障礙是設(shè)置效應(yīng)器位置和關(guān)節(jié)目標(biāo)位置。效應(yīng)器位置是IK嘗試放置骨骼的位置,而關(guān)節(jié)目標(biāo)位置則是說明骨骼應(yīng)如何旋轉(zhuǎn)。關(guān)節(jié)目標(biāo)位置實(shí)際上是一個(gè)誤導(dǎo)性的名稱,因?yàn)樗挥谀阆M趋佬D(zhuǎn)的位置的對(duì)面,我花費(fèi)了一定的時(shí)間才弄明白這一點(diǎn)。
我們使用一個(gè)關(guān)節(jié)來旋轉(zhuǎn)骨骼,并通過一個(gè)目標(biāo)來定向骨骼。我們使用常規(guī)藍(lán)圖中的函數(shù)設(shè)置值來正確設(shè)置所有的值。我在示例項(xiàng)目中創(chuàng)建了三個(gè)函數(shù),按以下順序調(diào)用。
SetAllFingerIK:一個(gè)調(diào)用SetSingleFingerIK()五次的函數(shù)(每個(gè)手指一次)。這意味著將代碼組合成一個(gè)大函數(shù)。SetSingleFingerIK:每個(gè)手指最后都需要調(diào)用3個(gè)跟蹤,所以這是一個(gè)line trace 集合。這將計(jì)算和設(shè)置動(dòng)畫藍(lán)圖中的變量。LineTraceAlongArrow:根據(jù)箭頭的變換返回line trace的擊中結(jié)果。
下圖是食指的效果:
3. 選擇這一解決方案的原因
除了單獨(dú)為所有一切制作動(dòng)畫外,我找不到任何替代方案。當(dāng)然,單獨(dú)為所有一切制作動(dòng)畫是一項(xiàng)非常耗時(shí)的任務(wù)。動(dòng)態(tài)地為手指制作動(dòng)畫是唯一可選的替代性解決方案,而反向運(yùn)動(dòng)學(xué)可以做到這一點(diǎn)。
這很難做到這一點(diǎn)的原因是,關(guān)于這個(gè)具體問題的信息很少,這意味著我必須自己解決這個(gè)問題。最后,我自己開發(fā)了這樣一個(gè)系統(tǒng)。如果你想在Unreal引擎中看看具體的實(shí)現(xiàn),這里是一個(gè)示例項(xiàng)目。
原文鏈接:https://yivian.com/news/55926.html
來源:映維網(wǎng)