Open17

コントロールリグの学習記録

ピン留めされたアイテム
aiiroIndyaiiroIndy

やりたいこと

  • コントロールリグのノードを知る
  • コントロールリグでできることを知る
  • Verseとコントロールリグを組み合わせる
  • Verseとコントロールリグの親和性は?

資料

  1. 公式ドキュメント(UEFN)

https://dev.epicgames.com/documentation/ja-jp/uefn/animation-101-template-in-unreal-editor-for-fortnite

https://dev.epicgames.com/documentation/ja-jp/uefn/sequencer-and-control-rig-in-unreal-editor-for-fortnite

  1. 公式ドキュメント(UE)

https://dev.epicgames.com/documentation/ja-jp/unreal-engine/control-rig-in-unreal-engine

  1. Marketplace

https://www.unrealengine.com/marketplace/ja/product/control-rig-samples-pack?sessionInvalidated=true

aiiroIndyaiiroIndy
aiiroIndyaiiroIndy

♦ 足の位置は、前のフレームの位置と予測した位置をブレンドすることで滑らかな動きにしている
♦ maximumノードやclampノードを使って動きを制限できる
♦コントロールリグのノードをピックアップした公式ドキュメントはなさそう。使いそうなノードはメモしておこう
(講座の進捗率: 53%)

aiiroIndyaiiroIndy

♦Evaluate Curve ノード

Evaluates the provided curve. Values are normalized between 0 and 1
指定された曲線を評価します。値は 0 から 1 の間で正規化されます

カーブを描く動きに使える


♦Remap ノード

Remaps the given value from a source range to a target range.
指定された値をソース範囲からターゲット範囲に再マップします。

Remap ノードのResult をEvaluate Curve ノードのSource やTarget に入力して、動的に範囲を変更できる
(参考) Remap のイメージ
https://qiita.com/ShirakawaMaru/items/14f3743ab8e3568122ed


♦どちらもなんとなく速さと思っていた velocityと speedの違いを理解した
velocity

西に向かって時速50キロメートル・上方向に分速500メートルで上昇のように、方向と速さを合わせたベクトル量

speed

時速60キロメートル・秒速50メートルなどの速さだけを示すスカラー量

https://meaning-difference.com/?p=9824


(講座の進捗率: 57%)

aiiroIndyaiiroIndy

◆Noise ノード
Input: Value, Speed, Frequency, Minimum, Maximum

Generates a float through a noise fluctuation process between a min and a max through speed
最小速度と最大速度の間のノイズ変動プロセスを通じてフロートを生成します


◆FullBodyIK ノード

Based on a Position Based solver at core, this node can solve multi chains within a root using multi effectors
コアの位置ベースのソルバーに基づいて、このノードは複数のエフェクタを使用してルート内の複数のチェーンを解決できます

https://dev.epicgames.com/documentation/ja-jp/unreal-engine/control-rig-full-body-ik-in-unreal-engine?application_version=5.4


◆完成したコントロールリグは、地形や動かす場所を変えてテストするといい。トレースの不具合に気づけたりする。Simulate実行中に、Shiftキー押しながらアクタを動かすとそのカメラも動くと


(講座の進捗率: 60%)

aiiroIndyaiiroIndy

◆Draw Line ノード
Input: A, B, Color, Thickness, WOrld Offset, Enabled

Draws a line in the viewport given a start and end vector
開始ベクトルと終了ベクトルを指定してビューポートに線を描画します

Draw Line ノード のA, B をトレース(Sphere Trace By Trace Channel )の開始・終了地点と同じにすると、トレースの位置が視覚化できる。


◆Sphere Trace By Trace Channel ノード
Input: Start, End, TraceChannel, Radius

Sweeps a sphere against the world and return the first blocking hit using a specific channel. Target objects can have different object types, but they need to have the same trace channel set to "block" in their collision response settings.
You can create custom trace channels in Project Setting - Collision.
球体をワールドに対してスイープし、特定のチャネルを使用して最初のブロッキング ヒットを返します。ターゲット オブジェクトはさまざまなオブジェクト タイプを持つことができますが、衝突応答設定で同じトレース チャネルを「ブロック」に設定する必要があります。
[プロジェクト設定] - [衝突] でカスタム トレース チャネルを作成できます。

トレースを増やすことで動きが改善できたりするけど、シーン内にキャラクターがたくさんいると処理が遅くなる可能性あり。トレースが多すぎないように最適なトレースを、ということだった。
トレースをどう作るか考えるのもプロだなー!

・コントロールリグのSphere Trace By Trace Channel ではないけど、トレースの理解の参考になりそう
https://dev.epicgames.com/documentation/ja-jp/unreal-engine/traces-in-unreal-engine---overview?application_version=5.4


・Control RigにはLine Trace はない。ただ 興味深い
https://zenn.dev/hiehie/books/44a74095222c06/viewer/ee7bb7


◆この講座のように、ロボットの足を動かしている記事
How to Set Up Procedural Turret Animation with Unreal Engine's Control Rig
https://80.lv/articles/how-to-set-up-procedural-turret-animation-with-unreal-engine-s-control-rig/


(講座の進捗率:64%)

aiiroIndyaiiroIndy

◆Spring Interpolate ノード
Input: Target, Strength, Critical Damping, Force, Use Current Input, Current, Target Velocity Amount, Initialize from Target
Output: Result, Velocity

Uses a simple spring model to interpolate a vector from Current to Target.
単純なスプリング モデルを使用して、現在の値からターゲットへのベクトルを補間します。

Target の動きに遅れて、Boneが付いてくる。 滑らかな動きを作るのに役立つ


◆Value Over Time ノード
Input: Value, Seconds Ago, Buffer Size, Time Range

Records a value over time and can access the value from the past
時間の経過に伴う値を記録し、過去の値にアクセスできます

遅延のかかったような動きにできる


◆Basic IK ノード

Solves the two bone IK given two bones. Note: This node operates in world space!
2 つのボーンを指定して 2 つのボーン IK を解決します。注: このノードはワールド空間で動作します。

Pole Vector (極ベクトル)がよくわからない。
↓Pole Vector のUE5のコメント

The polevector to use for the IK solver This can be a location or direction.
IK ソルバーに使用する極ベクトル。これは場所または方向になります。

Pole Vector にはControl をGetTransform したり、ComputPoleVector ノードで計算したりして値を設定できるそう

◆ComputePoleVector ノード

ComputePoleVector (/Control Rig/Standard FunctionLibrary/Standard FunctionLibrary. Standard Function Library)
Compute the pole vector plane given 2 bones (3 joints) to help position the pole vector of a 2 bone IK. Best used in Setup.
Args
::Bone A:: First bone. Represents start of the first vector.
::Bone B:: Second bone. Represents end of the first vector.
::Bone C:: Third bone. Represents end of the second vector.
::Draw Transform:: Draw the output in the viewport.
::initial:: Compute using initial values.
::WorldScale:: Additional world scale multipler (eg: character scale control). ::OffsetFactor:: Amount of offset to apply to the output pole vector position.
ComputePoleVector (/Control Rig/Standard FunctionLibrary/Standard FunctionLibrary。標準関数ライブラリ)
2 つのボーン (3 つのジョイント) を指定して極ベクトル平面を計算し、2 つのボーン IK の極ベクトルを配置します。セットアップで使用するのが最適です。
引数
::Bone A:: 最初のボーン。最初のベクトルの開始を表します。
::Bone B:: 2 番目のボーン。最初のベクトルの終了を表します。
::Bone C:: 3 番目のボーン。2 番目のベクトルの終了を表します。
::Draw Transform:: ビューポートに出力を描画します。
::initial:: 初期値を使用して計算します。
::WorldScale:: 追加のワールド スケール乗数 (例: キャラクター スケール コントロール)。 ::OffsetFactor:: 出力極ベクトルの位置に適用するオフセットの量。


読みたいリスト
https://sites.google.com/site/seikodevmemo/top/UE4AC2019-2-1224-ConrtolRig-Main/BasicIK

https://qiita.com/Mitsunagi/items/a1f08991a459569a4b8c

コントロールリグの再生リスト見つけた☺
https://www.youtube.com/playlist?list=PL2A3wMhmbeArc-d471A4cku1pYA31X-ir

(講座の進捗率: 71%)

aiiroIndyaiiroIndy

◆Aim ノード
Input: Item, Primary, Secondary, Weight

Aligns the rotation of a primary and secondary axis of a bone to a global target. Note: This node operates in global space!
ボーンのプライマリ軸とセカンダリ軸の回転をグローバル ターゲットに合わせます。注: このノードはグローバル空間で動作します。

Itemにはボーンなどの動かしたいものを選択する。そのItemはPrimaryやSecondaryのTargetの方向を向く。
視線の先のポイントを、Draw Transform ノードで描画すると動いていても視覚的にわかる
◆Draw Transform ノード

Given a transform, will draw a point, axis, or a box in the viewport
変換を指定すると、ビューポートに点、軸、またはボックスを描画します



Aim ノードの参考になりそう!
https://sites.google.com/site/seikodevmemo/top/UE4AC2019-2-1224-ConrtolRig-Main/LookAt


◆Scale ノード
Input: Value, Factor
Output: Result

Returns the product of the the vector and the float value
ベクトルと浮動小数点値の積を返します

Multiply ノードに似ているような?

◆Multiply ノード
Input: A, B
Output: Result

Returns the product of the two values
2 つの値の積を返します

違いは、Scale ノードの入力はvector型とfloat型で出力はvector。
Multiply ノードは、試してみると、入力A, Bのいずれかを設定したときに、もう一方のデータ型と出力のデータ型が決まった。
vector型にfloat型で掛け算したいときは、Scale ノードを使うのがいいんだね


◆Accumulated Time ノード
Input: Speed
Output: Time

Simulates a time value - can act as a timeline playing back
時間値をシミュレートします - タイムラインの再生として機能します

Speedの値でシュミレートする速さを調整できる。
Time を Modulo ノードのAに入力して、Bを1.0 にすると、時間に伴って変化する0.0以上1.0未満の値を取得できそう

◆Modulo ノード
Input: A, B
Output: Result

Returns the modulo of the two values
2 つの値のモジュロを返します


あとで読む

  • 「『古代の谷』 に登場するロボットのアニメートとリギング」
    (Accumulated Time ノードを使用している)

https://www.unrealengine.com/ja/tech-blog/animating-and-rigging-the-robot-in-valley-of-the-ancient

(講座の進捗率: 76 %)

aiiroIndyaiiroIndy

◆LookAt する視線の対象をコントロールリグ内のコントロールではなく、レベルに存在するSpotLightなどにすることもできる。
Control Rig: Vector型変数(VectorA)を作って公開する(Instance Editableをオンにする)。コントロールのTransform取得の代わりに、その変数をGetする(&ワールドスペースからリグスペースに変換)
Blueprint(Character): Vector型変数(VectorB)を作る。EventTickでGetAllActorsOfClass(SpotLightを指定)し、取得したアクタの位置(GetActorLocation)を、作成しておいたVectorBにSet。
Animation Blueprint: AnimGraphにControl Rig ノードを追加し、Input でVectorA を使用する設定にする。Asset Browser のアニメーションを選択してドラッグし、Control Rig ノードのSource につなぐことでアニメーションの実行も可能。
Event Graphの設定も行う(略)

SpotLight はStationary のままではシュミレーション中にギズモが表示されず動かせない。Movableにすると動く


◆コントロールリグの関数
コントロールリグ内のFunction に追加し、Access Specifier をPublicにすると、ほかのコントロールリグでその関数を使用できる。
https://dev.epicgames.com/documentation/ja-jp/unreal-engine/control-rig-function-libraries-in-unreal-engine


◆From Euler ノード
Input: Euler, Rotation Order

Makes a quaternion from euler values in degrees
度単位のオイラー値から四元数を作成します

(参考)
https://188hirroom.com/controlrig-multiple-bones-with-ue5/

https://namiton.hatenablog.jp/entry/2024/07/20/130000


あとで読む

  • 「回転ベクトル・回転行列・クォータニオン・オイラー角についてまとめてみた」

https://kamino.hatenablog.com/entry/rotation_expressions

(講座の進捗率: 81 %)

aiiroIndyaiiroIndy

◆Rotate Vector ノード
Input: Transform, Vector
Output: Result

Rotates a given vector by the quaternion
与えられたベクトルを四元数で回転する


◆今日見た動画
コントロールリグのノードで文字列操作できて、ボーンやコントロールの命名規則が決まっていると文字列操作が活かせると!
https://www.youtube.com/watch?v=q0Db4LlLV3A


Copilotに聞いてみた。

Q: クォータニオンの積を求めることで何がわかるの?

A:
クォータニオンの積を求めることで、特に三次元空間における回転や変換に関する情報を得ることができます。具体的には、以下のようなことがわかります:

  1. 回転の合成: クォータニオンの積を使うことで、複数の回転を一つの回転としてまとめることができます。例えば、ある物体を回転させた後にさらに別の回転を加える場合、その合成回転をクォータニオンの積で表現できます。

  2. 回転の順序: クォータニオンの積は非可換(順序が重要)なので、回転の順序が結果に影響を与えることがわかります。つまり、

    q_1 \cdot q_2 \neq q_2 \cdot q_1
    です。

  3. 回転の逆: クォータニオンの逆元を使うことで、回転の逆操作を求めることができます。例えば、ある回転を元に戻すためには、その回転を表すクォータニオンの逆元を掛ければ良いのです。

  4. 回転の軸と角度: クォータニオンを使うことで、回転の軸と角度を簡単に計算することができます。クォータニオンの成分から回転軸と回転角度を導き出すことが可能です。

クォータニオンは、コンピュータグラフィックスやロボティクス、物理シミュレーションなど、さまざまな分野で利用されています。何か特定の応用例について知りたいことがありますか?


Q: 具体例を教えてください

A:
もちろんです!それぞれの具体例をわかりやすく説明しますね。

1. 回転の合成

: ある物体をまず (90^\circ) x軸周りに回転させ、その後 (90^\circ) y軸周りに回転させるとします。

  • 最初の回転を表すクォータニオンを (q_1)、次の回転を (q_2) とします。
  • これらの回転を合成するには、クォータニオンの積 (q = q_2 \cdot q_1) を計算します。
  • 結果として得られるクォータニオン (q) は、物体が最終的にどのように回転したかを表します。

2. 回転の順序

: 先ほどの例で、回転の順序を逆にしてみます。

  • 最初に (90^\circ) y軸周りに回転させ、その後 (90^\circ) x軸周りに回転させるとします。
  • この場合、クォータニオンの積は (q' = q_1 \cdot q_2) となります。
  • (q) と (q') は異なる結果を示し、回転の順序が重要であることがわかります。

3. 回転の逆

: ある物体を (90^\circ) x軸周りに回転させた後、元の位置に戻したいとします。

  • 回転を表すクォータニオンを (q) とします。
  • 元の位置に戻すには、逆回転を表すクォータニオン (q^{-1}) を掛けます。
  • (q \cdot q^{-1} = 1) となり、物体は元の位置に戻ります。

4. 回転の軸と角度

: クォータニオン (q = \cos(\theta/2) + \sin(\theta/2)(xi + yj + zk)) が与えられたとします。

  • ここで、(\theta) は回転角度、(x, y, z) は回転軸の成分です。
  • クォータニオンの成分から、回転軸 ((x, y, z)) と回転角度 (\theta) を計算できます。

これらの具体例が、クォータニオンの積を使った回転の理解に役立つことを願っています。さらに詳しい説明や他の例が必要であれば、教えてくださいね!


(講座の進捗率: 85 %)

aiiroIndyaiiroIndy

◆DeltaFromPrevious ノード
Input: Value
Output: Delta, Previous Value

Computes the difference from the previous value going through the node
ノードを通過する前の値との差を計算します

たぶん
Deltaは、このノードが現在渡されている値と、最後に使用された時に渡された値の差分。
Previous Valueは、最後に使用された時に渡された値。


◆Delta Time ノード

Returns the time gone by from the previous evaluation
前回の評価から経過した時間を返します

前回の評価 = 最後のフレーム?


◆Get Chain ノード

Returns a chain between two items
2 つの項目間のチェーンを返します

Item Chain ノードが UE5.4から Get Chain ノードに置き換わった、というコメントがあった


◆To Euler ノード
Input: Value, Rotation Order
Output: Result

Retrieves the euler angles in degrees
オイラー角を度単位で取得します

関数のInputはQuat型で定義して、
その値を使うときに To Euler→ 計算(角度を加算したり、除算したり)→ From EulerでQuat型に戻してOutputに設定している印象


◆Num ノード
配列の要素数を取得する


◆型を選択できるノードの場合、項目を右クリックして型を指定できる。例えばMultiply


指定した型をクリアにするには「Unresolve Template Node」を選択する


(講座の進捗率: 90 %)

aiiroIndyaiiroIndy

◆Interpolate ノード
Input: A, B, T
Output: Result

Linearly interolates between A and B using the ratio T
Tの比率を使用してAとBの間を線形補間する


◆Absolute ノード
絶対値を求める


プレイしてみると、変わったような、変わっていないようなコントロールリグの微妙な動き。動きの違いがわかれば、ノードも組めるようになりそうだ🐤

(講座の進捗率: 93%)

aiiroIndyaiiroIndy

◆プレイ中にコンソールコマンドを入力するには、「^」キーを押す
https://metatimecg.com/ue5-console-variables-and-commands/

◆コマンド「Slomo (数値)」 1より大きいと速く、1未満だと遅くなる。
https://historia.co.jp/archives/1342/


完走した🌟
色々なノードを知ることができ、コントロールリグの使い方のイメージも付いてきた。
コントロールリグで細やかな動きの調整をするには、まずその理想を思い描けるようになることが必要と感じる🤖

(講座の進捗率: 100%)

aiiroIndyaiiroIndy

UEFN にスコーピオンのコントロールリグを移行して、シーケンサーで動かそうとすると、プッシュするときにUEFN Validation のエラーが出る。

Found disallowed object type /Script/PBIK.PBIKBoneSetting, Referenced by:See below for asset list, Plugin mount point:/Character_Cameras_and_NPCs.
許可されていないオブジェクト タイプ /Script/PBIK.PBIKBoneSetting が見つかりました。参照元: アセット リストについては以下を参照してください。プラグインのマウント ポイント:/Character_Cameras_and_NPCs。

「PBIKBoneSetting」で検索すると、Unreal Python API ドキュメント のページには載っている。Python が関係しているのかわからないけど Full Body IK ノードは使っているから見直してみる..?
https://dev.epicgames.com/documentation/en-us/unreal-engine/python-api/search?q=PBIKBoneSetting&application_version=5.4