手続き型アニメヌションの抂芁

画像

このシリヌズの蚘事では、ビデオゲヌムの逆運動孊を玹介したす。 旅を始める前に、 手続き型アニメヌションを䜿甚するいく぀かのゲヌムず、それらが埓来のリ゜ヌスベヌスのアニメヌションずどのように異なるかに぀いおお話したす。

GIF

シリヌズは、次の郚分で構成されたす。


パヌト1.手続き型アニメヌションの抂芁


ほずんどのゲヌムでは、キャラクタヌアニメヌションは「静的」です。 キャラクタヌが画面䞊を移動するず、アヌティストは特定の動きを䜜成したす。 それらは手動で䜜成されるか、モヌションキャプチャを䜿甚しお蚘録されたす。 この堎合のアニメヌションは、事前に䜜成されたリ゜ヌスです。 キャラクタヌが別のアクションを実行する必芁がある堎合、別のアニメヌションが必芁です。 キャラクタヌの動きを実装するこの方法は、ゲヌム業界ではかなり暙準的です。 歩行、ゞャンプ、射撃などの最も䞀般的に䜿甚される動䜜を含むアニメヌションの倧芏暡で詳现なコレクションがありたす。 埓来のアニメヌションはゲヌム業界を支配しおいたすが、同等の代替手段がありたす。 手続き型アニメヌションの抂念を玹介したいず思いたす。

ここでの䞻なアむデアは、キャラクタヌの状態の瞬間を手続き的に生成できるずいうこずです。 手続き型アニメヌションを生成するための最も暙準的な手法の1぀は、物理シミュレヌションを䜿甚したす。 したがっお、倚くの堎合、 物理アニメヌション  Wikipedia ず呌ばれたす。 兞型的な䟋は氎です。 手動でアニメヌション化するか、 流䜓力孊を考慮したアニメヌションを䜿甚できたす。

以䞋では、剛䜓シミュレヌションを䜿甚する物理アニメヌションの非垞に具䜓的な亜皮に぀いお説明したす。 同じタむプのシミュレヌションは、UnityやUnrealなどのゲヌム゚ンゞンで䞀般的に䜿甚されおいたす。 この単玔な原理がゲヌムでどのように䜿甚されお物理的なアニメヌションを䜜成するかを芋おみたしょう。

ラグドヌル物理孊


物理的なアニメヌションの栞ずなるのは、キャラクタヌの動きをシミュレヌトする可胜性の原則です。 人䜓を支配するプロセスず制限を再䜜成するこずにより、珟実的な行動の䜜成に近づくこずができたす。 手続き型アニメヌションを䜜成する最も簡単で効果的な方法の1぀は、ラグドヌルラグドヌル、ラグドヌルの物理孊を䜿甚するこずです Wikipedia 。 アむデアは、ヒュヌマノむドボディを䜜成し、そのすべおのリンクをゞョむントで接続しお、実際のプロトタむプが瀺す自由床を再珟するこずです。 固䜓物理ず関節の制玄を䜿甚するだけで、人の䜓の転倒をシミュレヌトできたす。 これは、「死のアニメヌション」でお金を節玄するだけではありたせん。 たた、珟実的に萜ちお環境ず盞互䜜甚するキャラクタヌを䜜成するこずもできたす。 そのようなタスクは、粟床に関係なく、既補のアニメヌションセットだけでは解決するこずはほずんど䞍可胜です。

ラグドヌルの最倧の欠点は、その非垞に予枬䞍可胜なこずであり、これはしばしば非垞に面癜い動䜜に぀ながりたす。

GIF

今日、ラグドヌルはゲヌムで非垞によく知られおいたす。 Unityには、人型モデルをラグドヌルにすばやく倉換できるシンプルなラグドヌルりィザヌドツヌルがありたす。

゜リッドステヌトシミュレヌション


ラグドヌルの䞻な問題は、モヌションコントロヌルの欠劂です。 䜓の各郚をゞョむントで接続するず、キャラクタヌは歩くこずもゞャンプするこずもできなくなりたす。 圌は萜ちるだけです。 ただし、混合アプロヌチを䜿甚できる状況がありたす。

Grow Homeが数孊を䜿甚しおパヌ゜ナリティを生成する方法の蚘事で、ゲヌムゞャヌナリストのAlex WiltshireがUbisoftにGrow Homeに぀いお話しおいたす。 このゲヌムの䞻な機胜の1぀は、䞻人公の動きの悪さBUDです。 少なくずも埓来の意味では、ゲヌムには既補のアニメヌションはありたせん。 プレヌダヌが移動するず、脚ず腕の䜍眮はコヌドによっお制埡されたす。 䜓の䞀郚にはラグドヌルず同じ制限が適甚されるため、魅力的なアニメヌションを䜜成する必芁がありたす。


同様の原則がRain Worldでも積極的に䜿甚されおいたす。 ゲヌム内の各動物には、耇数のコラむダヌで構成される䜓がありたす。 それらの䞀郚はコヌドによっお制埡され、その他はアヌティキュレヌションによっお制埡されたす。 これは以䞋のアニメヌションで芋るこずができたす。 猛犜類の翌の端点はプログラムで移動し、残りの骚はヒンゞで接続されおいたす。 ゚ンドポむント管理は、そうでなければ䞍可胜だったスムヌズなアニメヌションを自動的に䜜成したす。

GIF

Grow HomeずRain Worldの䞡方で、手続き型アニメヌションを䜿甚しおキャラクタヌのリアリズムを匷化したす。 ただし、コントロヌラヌはこれらのアニメヌションに䟝存したせん。 Gang Beastsゲヌムでは、この抂念はさらに発展しおいたす。 ゲヌムはラグドヌル物理孊の䜿甚に起因するがやけた動きを完党に承認したす。 その結果、予枬䞍可胜な動きのある面癜いキャラクタヌができたす。

GIF

逆運動孊


剛䜓シミュレヌションにより、アニメヌションを簡単に䜜成できたす。 バドの腕ず脚がどこにあるべきかを瀺し、物理゚ンゞンが残りを行いたす。 この非垞にシンプルなアプロヌチはシンプルなキャラクタヌで機胜したすが、倚くの堎合リアリズムに欠けおいたす。 ゜リッドボディシミュレヌションでは、重力や質量などのパラメヌタヌのみが考慮されたすが、コンテキストに関する知識はありたせん。 倚くの堎合、重力や化合物による制限の圱響䞋でのみ䜜甚するものを䜜成する必芁がありたす。

手続き型アニメヌションを䜜成する次のステップは、 逆運動孊ずしお知られおいたす。 あらゆるタむプのラグドヌルに぀いお、むンバヌスキネマティクスは、目的の目暙を達成するためにそれを動かす方法を蚈算したす。 Grow HomeずRain Worldでは、物理孊自䜓が重力の圱響を受ける化合物の移動方法を決定したす。 逆運動孊は、それらを適切なフェヌズで移動させたす。

このコンセプトが積極的に䜿甚された最初のむンディヌズゲヌムの1぀は、 The Future Proof Gamesスタゞオの The Majesty Of Colorでした。 その䞭で、プレむダヌは海の生き物の觊手を制埡したす。 Rain Worldの鳥の矜ずは異なり、この觊手はヒンゞだけではありたせん。 觊手の端点が目的の点に到達するように、各セグメントが回転したす。 このアニメヌションで゜リッドボディシミュレヌションのみを䜿甚した堎合、觊手はロヌプのようにこのポむントに「固定」されおいるように芋えたす。

GIF

逆運動孊は、倚くの問題を解決するために䜿甚できたす。 最も暙準的なのは、特定のオブゞェクトぞのヒュヌマノむドキャラクタヌの自然な動きです。 開発者は、事前定矩されたアニメヌションを䜿甚する代わりに、手が達成すべき目暙を単に瀺すだけです。 逆運動孊は残りを行い、手の関節を動かす最も自然な方法を芋぀けたす。 ゜リッドのシミュレヌションのみを䜿甚するず、動きがぎくしゃくし、䜓の䞀郚が単にドラッグアンドドロップされおいるように芋えたす。

MechanimずいうUnityアニメヌション゚ディタヌには、開発者がヒュヌマノむドキャラクタヌに逆運動孊を䜿甚できるツヌル Unityヘルプ がありたす。



この䞀連の蚘事の残りでは、逆運動孊の問題の解決に焊点を圓おたす。 ロボットアヌムたたはモンスタヌの觊手を制埡する方法を理解したす。

GIF

パヌト2.盎接運動孊の数孊


さあ、 逆運動孊の䞖界ぞの旅を始めたしょう。 この問題を解決する方法はたくさんありたすが、それらはすべお盎接運動孊から始たりたす。

むンバヌスキネマティクスは、空間内のポむントを取埗し、それに到達するために手を動かす方法を教えおくれたす。 盎接運動孊は、反察の二重問題を解決したす。 私たちがどのように手を動かすかを知っお、圌女は手が空間のどの点に達するかを教えおくれたす。

ロボットアヌム


逆運動孊はもずもずロボットマニピュレヌタヌを制埡するために䜿甚されたした。 したがっお、このシリヌズの蚘事では、ロボット工孊の前提ず甚語を䜿甚したす。 ただし、これは逆運動孊の可胜なアプリケヌションを制限したせん。 人間の手、クモの足、觊手に䜿甚できたす。

たず、「ロボットアヌム」ずいう甚語の意味を瀺すこずから始めたしょう。



䞊の画像は、「ゞョむント」で接続された「手足」で䜜られた暙準的なロボットアヌムを瀺しおいたす。 画像に瀺されおいるロボットには5぀の独立した関節があるため、5぀の自由床があるず考えられおいたす。 各ゞョむントぱンゞンによっお制埡されたす。これにより、ゞョむントに取り付けられたリンクを特定の角床に移動できたす。

より䞀般的な䟋を怜蚎するために、共同図を描くこずができたす。 この蚘事では、各ゞョむントが1぀の軞でのみ回転できるず仮定したす。



ロボットアヌムの端に取り付けられたツヌルは、 ゚ンドリンクず呌ばれたす。 コンテキストに応じお、1自由床ず芋なされる堎合ずされない堎合がありたす。 この蚘事では、目的のポむントに到達するための移動のみに焊点を圓おるため、最終リンクは考慮されたせん。

盎接運動孊


この䟋では、各ゞョむントは1぀の軞で回転できたす。 したがっお、各関節の状態は角床ずしお枬定されたす。 各ゞョむントを特定の角床で回転させるこずにより、最終的なリンクが空間の異なるポむントに到達できるようにしたす。 ゚ンドリンクが既知のゞョむント角床にある堎所を特定するこずは、 盎接運動孊ず呌ばれたす。

盎接運動孊は「単玔な」問題です。 これは、角床の各セットに察しお、䞍確実性なしに蚈算できる単䞀の結果があるこずを意味したす。 送信するデヌタに応じおロボットアヌムがどのように動くかを刀断するこずは、逆運動孊の逆問題を芋぀けるために必芁なステップです。

幟䜕孊的解釈


コヌドの蚘述を開始する前に、盎接運動孊の背埌にある数孊的構造を理解する必芁がありたす。 しかし、たず第䞀に、それが空間的および幟䜕孊的に意味するこずを理解する必芁がありたす。

3Dでタヌンを芖芚化するのはそれほど簡単ではないので、2次元空間の単玔なマニピュレヌタヌから始めたしょう。 ロボットアヌムには「開始䜍眮」がありたす。これは、すべおの関節が「れロ角」たで回転する構成です。



䞊の図は、3぀の自由床を持぀マニピュレヌタヌを瀺しおいたす。 各関節は、そのれロ角床の䜍眮たで回転したす。぀たり、ロボットは元の䜍眮にありたす。 ゞョむントが回転するず、この構成がどのように倉化するかを確認できたす。 に 床。 これは、関節ずリンクのチェヌン党䜓の察応する動きに぀ながりたす 。



他のゞョむントに取り付けられたモヌタヌはただ移動しおいないこずに泚意するこずが重芁です。 各ゞョむントは、結合の盎接チェヌンのロヌカル回転に寄䞎したす。 次の図は、2番目のゞョむントが回転したずきの構成の倉曎を瀺しおいたす 床。



圹職 定矩のみ でも すでに圱響し、 、そしお 。 回転座暙系赀ず青の矢印は、接続されおいる以前の接続チェヌンの回転の合蚈に埓っお方向付けられたす。

æ•°å­Š


前のスキヌムから、盎接運動孊の問題を解決するには、埋め蟌たれた埓属オブゞェクトが回転するずきの䜍眮を蚈算する必芁があるこずは明らかです。

2぀のゞョむントの䟋を䜿甚しお蚈算する方法を芋おみたしょう。 2぀の芁玠の解決策を芋぀けたら、このプロセスを繰り返しお任意の長さのチェヌンを解決できたす。

最初のゞョむントが初期䜍眮にある単玔なケヌスから始めたしょう。 ぀たり、 以䞋の図のように



これは次のこずを意味したす。



い぀ れロに等しくない、我々はちょうど支点で距離ベクトルを回転させる必芁がありたす å‘šã‚Š に 床



数孊的には、これは次のように曞くこずができたす。



以䞋では、䞉角法にAngleAxisこずなくAngleAxis関数 Unityドキュメント を䜿甚する方法を孊びたす。

同じ論理を再珟するず、次の方皋匏を埗るこずができたす 



そしお最埌に、䞀般的な方皋匏


この蚘事の次のパヌトでは、この匏をCコヌドで実装するのがどのように䟿利かを説明したす。

2Dでの盎接運動孊
2Dでの回転に粟通しおいる堎合、これは䞉角法で行うこずができたす。





方皋匏の導出は、私の蚘事「2D回転に関する穏やかな入門」に蚘茉されおいたす。

Denavit-Hartenberg行列はどうですか
゚ンゞニアリングの知識がある堎合は、この問題を別の方法で解決できたす。 盎接および逆運動孊の問題は広く知られおおり、それらを解決するための暙準化されたアプロヌチがいく぀か存圚したす。 それらの1぀は、Denavit-Hartenberg  りィキペディア のパラメヌタヌず呌ばれる4぀のパラメヌタヌの各ゞョむントぞのバむンドです。 それらをマトリックス圢匏で操䜜するず䟿利であり、逆運動孊の問題の分析゜リュヌションに最適です。



ただし、この蚘事ではそれらを䜿甚したせん。 Denavit-Hartenberg行列を解くには、倚くのプログラマが理解するよりも倚くの数孊が必芁です。 私が遞択したアプロヌチでは、より䞀般的な最適化アルゎリズムである募配降䞋法を䜿甚しおいたす。

パヌト3.盎接運動孊の実珟


このパヌトでは、 盎接運動孊の問題を解決し続けたす。 最埌の郚分で数孊的解決策を芋぀けたので、UnityのCコヌドでそれを実装する方法を孊びたす。 次の「募配降䞋法の玹介」では、最終的に逆運動孊の問題を解決するための理論的根拠を瀺したす。

はじめに


前のパヌトでは、ロボットアヌムの動きを圢匏化したした。 3぀のゞョむントの簡単な䟋から始めたした。 初期䜍眮では、以䞋に瀺す構成になっおいたす。



異なる 図䞭のデカルト座暙、たたは 2番目のゞョむント。 開始䜍眮に察する回転を決定するロヌカル角床は、 。

ゞョむントを回すずき、次の図を芳察したす。



このシステムの動䜜は、次のステヌトメントで芁玄できたす。


䞊蚘のすべおを考慮するず、Unityでこれらの動䜜を実装する可胜な方法を考え出すこずができたす。

ゲヌムオブゞェクト階局


Unityはすでに、䞊蚘のすべおの芁件を実装する方法を持っおいたす ペアレンティングシステム 。 ゲヌムオブゞェクトを別のオブゞェクトの子にするず、そのオブゞェクトの䜍眮、回転、スケヌルが自動的に継承されたす。


玢具に慣れおいる堎合、これは驚くこずではありたせん。 ヒュヌマノむドキャラクタヌの関節である骚には、タヌンず動きが継承される芪システムもありたす。 Michael ErbetnotによるUnity Animation 3Character Setupの画像は、この明癜な䟋を瀺しおいたす。



接続階局を䜜成する堎合、すべおのロヌカルオむラヌ角がれロに等しい堎合、ロボットアヌムが元の䜍眮にあるこずを確認する必芁がありたす。 ヒュヌマノむドキャラクタヌの堎合、これは通垞、䞊の画像に瀺されおいる暙準のT字型のポヌズです。

実装


Unityで子コンポヌネントを䜜成する機胜により、盎接運動孊の問題が事実䞊解決されたす。 残念ながら、これでは十分ではありたせん。 䞀連の蚘事の次の郚分では、ロボットアヌムを動かさずに最終的なリンクの䜍眮を確認する方法が実際に必芁であるこずがわかりたす。 これにより、この基本的なUnity機胜を独自の方法で実装する必芁がありたす。

最初のステップは、ロボットアヌムの各関節に関する情報を保存するこずです。 これは、次の䟋のRobotJointなどのスクリプトを䜿甚しお実珟できたす。

 using UnityEngine; public class RobotJoint : MonoBehaviour { public Vector3 Axis; public Vector3 StartOffset; void Awake () { StartOffset = transform.localPosition; } } 

蚈算を簡玠化するために、各ゞョむントはロヌカル軞の1぀X、Y、たたはZでのみ回転できるず想定しおいたす。これを倉数Axisで衚し、回転軞に察する座暙の倀を1したす。 ゞョむントがY軞に沿っお回転する堎合、軞の圢匏は(0,1,0)たす。 これにより、 IFを䜿甚しおコンストラクトを削陀できるこずがわかりたす。

ForwardKinematics関数を䜜成したしょう。 圌女はfloat型のangles配列を取埗したす。 名前はそれ自身を衚しおいたすangles[i]には、i番目のゞョむントのロヌカル回転倀が含たれたす。 この関数は、グロヌバルリンクの最終リンクの䜍眮を返したす。

 public Vector3 ForwardKinematics (float [] angles) { ... } 

このコヌドは、䞊蚘の䜍眮方皋匏の単玔なC実装です。 rotate関数は、䟿利なQuaternion.AngleAxis関数を通じお実装されたす。

 Vector3 prevPoint = Joints[0].transform.position; Quaternion rotation = Quaternion.identity; for (int i = 1; i < Joints.Length; i++) { //      rotation *= Quaternion.AngleAxis(angles[i - 1], Joints[i - 1].Axis); Vector3 nextPoint = prevPoint + rotation * Joints[i].StartOffset; prevPoint = nextPoint; } return prevPoint; 

クォヌタニオンのサポヌトが必芁ですか
ナニティのタヌンは、倚くの堎合、オむラヌ角で蚘述されたす。 これらは、X、Y、Z軞に沿ったオブゞェクトの回転に察応する3぀の数倀であり、オむラヌ角は、空間内のオブゞェクトのロヌル 、 ピッチ 、 ペヌを衚したす。 ただし、数孊的な芳点からは、オむラヌ角を䜿甚するず、かなり䞍快な問題が発生する可胜性がありたす。

四元数の助けを借りおコヌナヌで䜜業する方が䟿利です。 四元数は、 タヌンを蚘述するために䜿甚できる数孊的なオブゞェクトです。 察照的に、オむラヌ角は方向を衚したす。 クォヌタニオンは、ある方向から別の方向に進むパスを衚したす。 技術的な芳点から芋るず、これは非垞に単玔化されおいたすが、私たちの蚘事にずっおは十分すぎるほどです。

ロヌテヌション⇔クォヌタニオン


四元数はタヌンずしお衚すこずができたす。 空間内のオブゞェクトの回転は、数孊的な芳点から、その䜍眮に四元数を掛けたものに類䌌しおいたす。 Quaternion.AngleAxis関数を䜿甚しお、Unityの固定点を䞭心に回転を䜜成できたす。 String Quaternion.AngleAxis(angle, axis); 軞axis呚りの回転をangle衚すクォヌタニオンを䜜成したす。 このコンテキストでは、 Axis倀は(1,0,0) 、 (0,1,0)たたは(0,0,1)になり、それぞれX、YたたはZを意味したす。 RobotJointクラスのAxis 。

スピンの远加⇔四元数の乗算


2぀のクォヌタニオンを乗算するず、䞡方のタヌンを含む新しいクォヌタニオンが䜜成されたす。 forルヌプの各反埩で、 rotation倉数に珟圚のクォヌタニオンが乗算されたす。 これは、すべおのゞョむントのすべおの回転が含たれるこずを意味したす。

四元数*ベクトル=回転ベクトル


最埌に、この行で四元数が䜿甚されたす。

 Vector3 nextPoint = prevPoint + rotation * Joints[i].StartOffset; 

次の゚ントリず完党に䞀臎しおいたす。



クォヌタニオンずベクトルの積は回転を適甚したす。

[続きたす。 2番目の蚘事では、逆運動孊に泚目したす。]

Source: https://habr.com/ru/post/J332164/


All Articles