2023-12-13

【機能別サンプル解説】Splineまとめ【UE5】

UE5の機能別サンプルより「Blueprint_Splines」の要点を解説。

Article Image
使用ソフトウェアバージョン備考
Unreal Engine5.3.1

はじめに

Unreal Engineの機能別サンプルは学習に重要な要素がぎゅっと詰まった素晴らしいサンプル。

しかしながらプロジェクトの解説がほとんど無いため初心者にはわかりにくい。

このシリーズではマップ(レベル)を一つずつ読み解いていく。

しかしながら、すべて解説していると記事が長くなりすぎるため要点に留めている。

今回のマップ「Blueprint_Splines」

UEのスプラインの使い方。

スプラインというのは画像のように点と点を柔らかい線で結んでくれるもの。

スプラインのサンプル

この線の上にコンポーネントを配置したり、メッシュを曲げたりと様々な使い方が可能。

1.1:スプラインコンポーネント

まず1.1のBPの中身を見るとSplineコンポーネントがはいっているシンプルなもの。

1-1のBP

そして、ここでは直線になっているが、実際にレベルに配置されているインスタンスを見てみると

なぜか変形しているスプライン

スプラインが変形している。これはどうなっているのか?

レベルに配置した「後」に自由に変形できる

実はSplineコンポーネントはレベルに配置した後に自由に変形してやることができる。

まずはBPをレベルに配置して、Splineを右クリック => Add Spline Pint Here

ポイントの追加

新しいポイントが追加されるので、それを移動/回転することによりスプラインの形状を「あとから変化」させることが可能。

頂点の移動

1.2:スプラインに沿って配置

1.2ではスプライン上に三角形が配置されている。

それだけでなく、スプラインの方向に矢印が向いているように見える。

矢印がスプラインに沿って配置

ブループリントを見てみるとこの三角形の矢印はメッシュコンポーネントではない。

BP上では三角形はどうなっている?

このメッシュはConstruction ScriptからAdd Static Mesh Componentを使ってプログラム的に読み込まれている。

Add Static Mesh Component

このノードをクリックすれば、右のDetailsパネルで読み込むStatic Meshが設定されている。

読み込むメッシュ設定

なぜBPの中からノードでメッシュを読んでいるのか?

なぜこんな面倒なことをするのだろうか。

実はこのブループリントにはNumbers of meshesという変数があり、この変数で三角形の数を変化させるためこのような形式になっている。

変数

ビューポート上でインスタンスをクリックして直接数を設定できる。

数を設定する箇所

数を増減させるノードの組み方はこの記事の趣旨から外れるため省略。

初心者の場合は、次の目玉マークをオンにしておくことで上のようにビューポートに配置したインスタンスに数値を入れられるようになることを覚えておく。

目玉マーク

スプラインに沿ってメッシュを配置する方法

次はこの三角形をスプライン上に配置している仕組み。

Get Spline Length

Get Spline Lengthを使うとスプラインの長さが取得できる。

これはスプラインを1本のヒモとして考えたときにまっすぐにしたときの長さ。

ヒモの長さを取る

そして次にGet Location at Distance Along Splineというノードを使うと

Get Location at Distance Along Spline

例えば「スプラインの始点から1.2mのところの座標を取ってきて!」といったような動きをする。

1.2m例

つまりこれをつかってスプライン上の座標を取得し、そこに矢印をおいている。

上はあくまで例なので実際の数値は違う。

また、こちらも先程のNumber of meshesを使って、三角の数に応じて取得するポイント数を変化させているが、こちらは省略

配置には座標の変換が必要

次のノードを見る。

ノード一覧

一番ややこしい箇所がAdd Static Mesh Componentで「どこに」矢印を生み出すかという入力が相対座標になっていることだ。

relative transformになっている

上の画像Get Location at Distance Along SplineWorldが指定されているのでワールド座標が出力されてしまっており、ここに直接つなぐと矢印の座標がおかしくなってしまう。

では、どうすればよいのかというと「ワールド座標を相対座標に変換する」Inverse Transform Locationというのを使っている。

変換

このようにTにはいっている座標から見てLocationは相対的にReturn Valueの座標になるよ、というのがこのノードだがいかんせんわかりにくい。

というかそもそもこの場合は相対座標≒ローカル座標なので

ノード例

このようにLocalにして直接繋いでも動作する。

ではなぜこの方法になっていないかというと、BP上でスプラインが原点からスタートしていない場合

BP上でズラした

次のようにレベル上でズレが発生するからだと思われる。こんなパターンのためにInverse Transform Locationが使われていると思われる。

ズレ

スプラインと同じ方向にメッシュを向かせる

最後に矢印をスプラインと同じ方向に向かせる方法は非常に簡単で

矢印の方向を合わせるノードたち

Get Rotation at Distance Along Splineというノードを使えば、今度はスプラインの特定の位置のローテーションを取得できるので

Add Static Mesh Componentで生み出されたメッシュをReturn Valueを使って取得、これをSet World Rotationに繋いで完成。

1.3:Spline Mesh Component

Spline Meshサンプル

既にこの画像をみて想像はつくと思うが、特定のメッシュをスプラインにそって変形するコンポーネント。

まっすぐなパイプ

BP上ではSpline Meshというコンポーネントで追加できる。

BP上での追加方法

しかしながら、これは単発で使える代物ではない点だけ注意しておきたいのでここで解説する。

簡単に変形できない!?

このサンプルレベル上では上のパイプの両端にコントローラーのようなものがついており、それを移動すれば簡単に変形できる。

変形用コントローラ

しかし実はこれはこのBP内でわざわざプログラムで生成したコントローラである。

ノード郡

つまり、ただ配置しただけでは通常は変形出来ない。

変形できない

実はこのコンポーネント、手動で追加する用途は恐らくほとんど想定されておらず、多くの場合ノードでAdd Spline Mesh Componentを使って動的に増やしていく前提だと思われる。

つまりどういうこと?

このコンポーネントは通常のSplineコンポーネントを配置し、その上にメッシュを添わせるために使われることが多い。

言い換えればプログラム上で呼び出してプログラム上で配置/変形するためのものと覚えておいたほうが良いだろう。

さて、肝心の使い方だが...これはこれで一つの記事がかけてしまうので最もわかりやすいヒストリアさんの記事へのリンクを貼っておくので参照してみてほしい。

[UE4]スプラインでお手軽に道を作る|株式会社ヒストリア

2.1:パスの上を移動する仕組み

2.1サンプル画像

サンプルではパスの上をパーティクルが移動する例になっている。

このパーティクル自体はUE5以降はナイアガラに置き換えられる古いシステムなので覚えなくてもよい。

どうやって移動するか

BP上でTimelineノードを利用すると時間に応じてカーブの数値を出すことができ、コレを利用してスプラインの位置をなぞる。

Particle movementと書いてあるが、これはユーザー側で名前を書き換えれるもの。

Timelineノード

このノードをダブルクリックするとカーブを調整できるので見てみる。

カーブ編集

このようにカーブが編集でき、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(鋭い角で動きを遅くする)という別のノードが組まれている。

ここではゼロベクトルとの内積という特殊な演算をしており、私にはこの目的が理解できないため省略する。

このノード郡を外しても動きは変わらないので、作りかけなのだろうか???

2.2:SplineをBPでアニメーションする

実はこのサンプル、壁に書いてある解説ではSimulationの文字があるが、一切シミュレーションは使われていない。

実行すると、紐で繋がれたような提灯たちが前後にゆらゆらするサンプルである。

2.2のスクリーンショット

恐らくこのサンプルで言いたいことはBPの中でリアルタイムにスプラインの形状を変えらるということだと思われる。

スプラインの点の位置を直接設定する

Set Spline Pointsというノードにスプラインと座標の配列を入れてやると、その位置に点が打たれてスプラインがつながる。

Set Spline Points

逆を言えば、結びたい点の位置がはじめから明らかである場合はこのノードに入れてやるだけで順番に線で繋いでくれるようなイメージ。

スプラインをアニメーションする

黄色のTimelineノードを使ってスプラインを動かしたい座標のアニメを生成。

このときここからでてるのは「ローカル座標の移動量」(Sway Animationピン)

Set Location at Spline Point

Sway Animationピンからでたローカル座標移動をワールドに変換する。

まずはGet Actor Transformでこのアクタのワールド座標を取得しTransform Locationを使うことで座標の加算のようなことができる。

Point Indexに指定されているインデックス番号のポイントをこのLocationに移動することでアニメーションが完成。

私も細かく理解できていないのだが、これは単純にベクトルの足し算でも同じ動作をする。

なぜTransform Locationを使う必要があるかは要調査

ADDノード

ここより右に記載されている複雑なノードはスプラインに合わせて提灯の動きをプログラムするものであり、複雑かつ目的から少しずれるので省略する

おまけ:Transform LocationとInverse Transform Location

この記事ではTransform LocationとそれにInverseがついたものの2種類でてきている。

これが混乱するので簡易解説。

Transform LocationとInverse Transform Location

Inverseありの方

Inverse Transform LocationTから見た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)が表示される

ノード例

Inverseなしの方

Transform Locationは単純にTにLocationを加算したものと考えて良い。

これは言い換えればTを原点にしてローカル座標(Location)はワールド座標に変換したらどこになるか...ということになるがこれは逆に混乱しそうだ。

したがって上と同じようなつなぎ方をするとT=(1,1,1), Location=(3,3,3)は加算されて(4,4,4)が出力される。

ノード例

2.3:Spline Meshをアニメーションする

サンプルでは実行するとスプラインに沿って植物が生えてくるような動きをする。

草が生えてくる

このBPのコンポーネントは次で構成されている。

  • Spline path:通常のスプラインコンポーネント
  • Vine Mesh:植物のスプラインメッシュコンポーネント

BPのコンポーネント

このBPのノードをみると、はじめがすごい複雑そうなことをやっているが紐解いていくとスプラインを始点から終点までなぞっているだけ。

まず重要なのは次のSet Start and Endノード

Set Start and Endノード外観

これはスプラインメッシュコンポーネント専用のノード。

それぞれ スタートの位置/スタートの方向/エンドの位置/エンドの方向 を指定できる。

上では次のノードも出てきたが、これらはスプラインコンポーネント専用ノード。違いに注意。

  • Set Spline Points
  • Set Location at Spline Point

つまりこれより前の処理はスプラインメッシュ(植物)の始点と終点を元のスプラインに沿って移動しているだけだ。

スプラインメッシュの太さ/角度

スプラインメッシュの始点と終点の位置を設定した後は、スプラインメッシュを変形する処理が入っている。

Set End/start Scale

Set End(Start) Scaleを使うとスプラインメッシュの始点/終点の太さを変更できる。こちらもスプラインメッシュ専用ノード。

つまりこれにより植物の先端が細く、根本が太い演出を行っている。

Set End(Start) Roll Radiansを使ってスプラインの「ねじり」を作っている。こちらもスプラインメッシュ専用ノード。

Set End/Start Roll Radians

このようにスプラインメッシュは変形させるノードもあるので覚えておきたい。

2.4:操作キャラのアニメーション

2.4のスクショ

このサンプルでは画像の黄色い魚の前に移動すると、この魚を自キャラとしてコントロールできる。

コントロールしている魚

スイッチを踏んだらキャラに乗り込むという仕組みはレベルブループリントButton Pressed (BP_Button_2.4)のイベントを参照する。

ここではPosessというノードを覚える良いサンプルになると思うが、この記事の趣旨と外れるのでここまで。

ほとんどここに書くことではない

実はこのサンプルに限ってはノードの殆どがキャラクターをコントロールするための処理なので、スプラインを学ぶという目的から大きくはずれてしまっている。

このBPの中でスプラインを動かす方法としては上で出てきたSet Start and EndSet Start Roll Radiansの2つでスプラインメッシュ(魚)をコントロールしているだけなのでこの部分に関しても語ることはほぼ無い。

キャラクターを動かしている原理をここで知りたい場合に読み込むのが良いかと思う。

おまけ:Interp系ノード

VInterp外観

ここではInterp Toと書いてあるノードが多様されている。このノードはCurrentの数値からTargetに入力された数値へゆったりとカーブを描くように補完するノード。

※これはスプラインとは関係ない通常のノード

このノードを使って魚がゆったり泳ぐ感じを作っている。

頭文字はVがVector, FがFloatなど各種の型と対応している。

このノードは単発のキー入力のようなイベントではなくTickのような走り続けている処理に挟まないといけないので少し学習が必要そう。

これだけで1枚記事がかけそうなノードなので気になればぜひ調べてみてほしい。

さいごに

スプラインだけであれば恐らく覚えることはそれほどないように思う。

とても便利な概念なのでぜひ覚えておきたい。

一応シリーズとして開始したが、需要がありそうなら続く。



この記事をシェア


謎の技術研究部 (謎技研)