| 使用ソフトウェア | バージョン | 備考 |
|---|---|---|
| Unreal Engine | 5.3.1 |
Unreal Engineの機能別サンプルは学習に重要な要素がぎゅっと詰まった素晴らしいサンプル。
しかしながらプロジェクトの解説がほとんど無いため初心者にはわかりにくい。
このシリーズではマップ(レベル)を一つずつ読み解いていく。
しかしながら、すべて解説していると記事が長くなりすぎるため要点に留めている。
UEのスプラインの使い方。
スプラインというのは画像のように点と点を柔らかい線で結んでくれるもの。
この線の上にコンポーネントを配置したり、メッシュを曲げたりと様々な使い方が可能。
まず1.1のBPの中身を見るとSplineコンポーネントがはいっているシンプルなもの。
そして、ここでは直線になっているが、実際にレベルに配置されているインスタンスを見てみると
スプラインが変形している。これはどうなっているのか?
実はSplineコンポーネントはレベルに配置した後に自由に変形してやることができる。
まずはBPをレベルに配置して、Splineを右クリック => Add Spline Pint Here
新しいポイントが追加されるので、それを移動/回転することによりスプラインの形状を「あとから変化」させることが可能。
1.2ではスプライン上に三角形が配置されている。
それだけでなく、スプラインの方向に矢印が向いているように見える。
ブループリントを見てみるとこの三角形の矢印はメッシュコンポーネントではない。
このメッシュはConstruction ScriptからAdd Static Mesh Componentを使ってプログラム的に読み込まれている。
このノードをクリックすれば、右のDetailsパネルで読み込むStatic Meshが設定されている。
なぜこんな面倒なことをするのだろうか。
実はこのブループリントにはNumbers of meshesという変数があり、この変数で三角形の数を変化させるためこのような形式になっている。
ビューポート上でインスタンスをクリックして直接数を設定できる。
数を増減させるノードの組み方はこの記事の趣旨から外れるため省略。
初心者の場合は、次の目玉マークをオンにしておくことで上のようにビューポートに配置したインスタンスに数値を入れられるようになることを覚えておく。
次はこの三角形をスプライン上に配置している仕組み。
Get Spline Lengthを使うとスプラインの長さが取得できる。
これはスプラインを1本のヒモとして考えたときにまっすぐにしたときの長さ。
そして次にGet Location at Distance Along Splineというノードを使うと
例えば「スプラインの始点から1.2mのところの座標を取ってきて!」といったような動きをする。
つまりこれをつかってスプライン上の座標を取得し、そこに矢印をおいている。
上はあくまで例なので実際の数値は違う。
また、こちらも先程のNumber of meshesを使って、三角の数に応じて取得するポイント数を変化させているが、こちらは省略
次のノードを見る。
一番ややこしい箇所がAdd Static Mesh Componentで「どこに」矢印を生み出すかという入力が相対座標になっていることだ。
上の画像Get Location at Distance Along SplineでWorldが指定されているのでワールド座標が出力されてしまっており、ここに直接つなぐと矢印の座標がおかしくなってしまう。
では、どうすればよいのかというと「ワールド座標を相対座標に変換する」Inverse Transform Locationというのを使っている。
このようにTにはいっている座標から見てLocationは相対的にReturn Valueの座標になるよ、というのがこのノードだがいかんせんわかりにくい。
というかそもそもこの場合は相対座標≒ローカル座標なので
このようにLocalにして直接繋いでも動作する。
ではなぜこの方法になっていないかというと、BP上でスプラインが原点からスタートしていない場合
次のようにレベル上でズレが発生するからだと思われる。こんなパターンのためにInverse Transform Locationが使われていると思われる。
最後に矢印をスプラインと同じ方向に向かせる方法は非常に簡単で
Get Rotation at Distance Along Splineというノードを使えば、今度はスプラインの特定の位置のローテーションを取得できるので
Add Static Mesh Componentで生み出されたメッシュをReturn Valueを使って取得、これをSet World Rotationに繋いで完成。
既にこの画像をみて想像はつくと思うが、特定のメッシュをスプラインにそって変形するコンポーネント。
BP上ではSpline Meshというコンポーネントで追加できる。
しかしながら、これは単発で使える代物ではない点だけ注意しておきたいのでここで解説する。
このサンプルレベル上では上のパイプの両端にコントローラーのようなものがついており、それを移動すれば簡単に変形できる。
しかし実はこれはこのBP内でわざわざプログラムで生成したコントローラである。
つまり、ただ配置しただけでは通常は変形出来ない。
実はこのコンポーネント、手動で追加する用途は恐らくほとんど想定されておらず、多くの場合ノードでAdd Spline Mesh Componentを使って動的に増やしていく前提だと思われる。
このコンポーネントは通常のSplineコンポーネントを配置し、その上にメッシュを添わせるために使われることが多い。
言い換えればプログラム上で呼び出してプログラム上で配置/変形するためのものと覚えておいたほうが良いだろう。
さて、肝心の使い方だが...これはこれで一つの記事がかけてしまうので最もわかりやすいヒストリアさんの記事へのリンクを貼っておくので参照してみてほしい。
サンプルではパスの上をパーティクルが移動する例になっている。
このパーティクル自体はUE5以降はナイアガラに置き換えられる古いシステムなので覚えなくてもよい。
BP上でTimelineノードを利用すると時間に応じてカーブの数値を出すことができ、コレを利用してスプラインの位置をなぞる。
Particle movementと書いてあるが、これはユーザー側で名前を書き換えれるもの。
このノードをダブルクリックするとカーブを調整できるので見てみる。
このようにカーブが編集でき、3秒で0から1に変化する値を出力している。
また、左上のDistanceはユーザーがつけた変数名で、この名前と同じピンとして値が出力される。
Timelineで時間に応じて変化する0-1の値を係数として、スプラインの本来の長さにかけてやることでスプラインを始点から終点までなぞっていく。
このなぞっている箇所の座標を取得するためのものがGet Location at Distance Along Spline
最後にパーティクルの位置をSet World Locationでこの値に移動してやるだけだ。
このノードの右下に Slow down play rate at sharp corners in the spline(鋭い角で動きを遅くする)という別のノードが組まれている。
ここではゼロベクトルとの内積という特殊な演算をしており、私にはこの目的が理解できないため省略する。
このノード郡を外しても動きは変わらないので、作りかけなのだろうか???
実はこのサンプル、壁に書いてある解説ではSimulationの文字があるが、一切シミュレーションは使われていない。
実行すると、紐で繋がれたような提灯たちが前後にゆらゆらするサンプルである。
恐らくこのサンプルで言いたいことはBPの中でリアルタイムにスプラインの形状を変えらるということだと思われる。
Set Spline Pointsというノードにスプラインと座標の配列を入れてやると、その位置に点が打たれてスプラインがつながる。
逆を言えば、結びたい点の位置がはじめから明らかである場合はこのノードに入れてやるだけで順番に線で繋いでくれるようなイメージ。
黄色のTimelineノードを使ってスプラインを動かしたい座標のアニメを生成。
このときここからでてるのは「ローカル座標の移動量」(Sway Animationピン)
Sway Animationピンからでたローカル座標移動をワールドに変換する。
まずはGet Actor Transformでこのアクタのワールド座標を取得しTransform Locationを使うことで座標の加算のようなことができる。
Point Indexに指定されているインデックス番号のポイントをこのLocationに移動することでアニメーションが完成。
ここより右に記載されている複雑なノードはスプラインに合わせて提灯の動きをプログラムするものであり、複雑かつ目的から少しずれるので省略する
この記事ではTransform LocationとそれにInverseがついたものの2種類でてきている。
これが混乱するので簡易解説。
Inverse Transform LocationはTから見たLocationをローカル座標に変換したもの。
したがって両者ワールド座標を入れることが多いと思う。
例えばT=(1,1,1)、Location=(3,3,3)を入れると(1,1,1)から見た(3,3,3)は相対的に(2,2,2)になる。
※厳密にはTはTransformなのでScaleやRotationも含まれるが
したがって次のようなノードを組むと(2,2,2)が表示される
Transform Locationは単純にTにLocationを加算したものと考えて良い。
これは言い換えればTを原点にしてローカル座標(Location)はワールド座標に変換したらどこになるか...ということになるがこれは逆に混乱しそうだ。
したがって上と同じようなつなぎ方をするとT=(1,1,1), Location=(3,3,3)は加算されて(4,4,4)が出力される。
サンプルでは実行するとスプラインに沿って植物が生えてくるような動きをする。
このBPのコンポーネントは次で構成されている。
このBPのノードをみると、はじめがすごい複雑そうなことをやっているが紐解いていくとスプラインを始点から終点までなぞっているだけ。
まず重要なのは次のSet Start and Endノード
これはスプラインメッシュコンポーネント専用のノード。
それぞれ スタートの位置/スタートの方向/エンドの位置/エンドの方向 を指定できる。
上では次のノードも出てきたが、これらはスプラインコンポーネント専用ノード。違いに注意。
つまりこれより前の処理はスプラインメッシュ(植物)の始点と終点を元のスプラインに沿って移動しているだけだ。
スプラインメッシュの始点と終点の位置を設定した後は、スプラインメッシュを変形する処理が入っている。
Set End(Start) Scaleを使うとスプラインメッシュの始点/終点の太さを変更できる。こちらもスプラインメッシュ専用ノード。
つまりこれにより植物の先端が細く、根本が太い演出を行っている。
Set End(Start) Roll Radiansを使ってスプラインの「ねじり」を作っている。こちらもスプラインメッシュ専用ノード。
このようにスプラインメッシュは変形させるノードもあるので覚えておきたい。
このサンプルでは画像の黄色い魚の前に移動すると、この魚を自キャラとしてコントロールできる。
スイッチを踏んだらキャラに乗り込むという仕組みはレベルブループリントButton Pressed (BP_Button_2.4)のイベントを参照する。
ここではPosessというノードを覚える良いサンプルになると思うが、この記事の趣旨と外れるのでここまで。
実はこのサンプルに限ってはノードの殆どがキャラクターをコントロールするための処理なので、スプラインを学ぶという目的から大きくはずれてしまっている。
このBPの中でスプラインを動かす方法としては上で出てきたSet Start and EndとSet Start Roll Radiansの2つでスプラインメッシュ(魚)をコントロールしているだけなのでこの部分に関しても語ることはほぼ無い。
キャラクターを動かしている原理をここで知りたい場合に読み込むのが良いかと思う。
ここではInterp Toと書いてあるノードが多様されている。このノードはCurrentの数値からTargetに入力された数値へゆったりとカーブを描くように補完するノード。
※これはスプラインとは関係ない通常のノード
このノードを使って魚がゆったり泳ぐ感じを作っている。
頭文字はVがVector, FがFloatなど各種の型と対応している。
このノードは単発のキー入力のようなイベントではなくTickのような走り続けている処理に挟まないといけないので少し学習が必要そう。
これだけで1枚記事がかけそうなノードなので気になればぜひ調べてみてほしい。
スプラインだけであれば恐らく覚えることはそれほどないように思う。
とても便利な概念なのでぜひ覚えておきたい。
一応シリーズとして開始したが、需要がありそうなら続く。
