読者です 読者をやめる 読者になる 読者になる

#memo

不正確な内容です、UE4についてが多い

Spline Meshについて

Blueprint Splines Content Examples | Unreal Engine

Spline Meshよくわかっていない、日本語のドキュメントない
Content ExamplesにSpline Meshのマップがある、見よう

まずUE4に用意されているSplineと名がつくのは、ComponentのSplineとSpline Meshの2つ、あと別ジャンルで、ランドスケープツールの方にもある(はず)。今回はComponentの2つの方の使い方を見る

まずSpline、これはBP内でしか使えない(レベルに直接配置とかは出来ない)もので、BPで作成した後ワールドに配置すると2つの点がある状態で現れる
https://i.gyazo.com/185215fe3c99c3c35c2096fe6ad872f4.png

選択されているのが始点で、もう一つは終点、クリックすることで点を選択できる

https://i.gyazo.com/28835e5ef75ed9368f329bcf55ee5a34.png

点を選択した状態で、Altを押しながらギズモを動かすと新たに点が生まれる、追加される位置は始点から見て、選択した点の次なので、始点より前の位置には追加できない

https://i.gyazo.com/3dceeaacd1063346922285541d355301.gif

さらに点を選択すると、制御点が表示され、それをさらに選択することで制御点の位置が変更できる、これで曲がり具合を調節する

このSplineは現時点ではただの情報でしかないので、BPでどうにか解釈する必要がある
Splineから取れる情報は結構あるので、想像できそうなことは大抵できそうだけどとりあえずContent Examplesを追ってみる


基本っぽいスプラインに沿ってStaticMeshを配置する

https://i.gyazo.com/ec6c358013c91be5d9a7c2537bcac3f2.png

配置数を指定させる変数を用意して、その回数分だけLoopでAddStaticMeshComponentを実行する、その時にSplineMeshに沿った座標を渡せればいい
SplineからGetSplineLengthという関数でスプラインの長さが取れる、これを配置数で割るとメッシュの配置間隔が出る。GetLocationatDistanceAlongSplineって関数に距離と座標系を投げればスプラインの始点からの位置の座標が帰ってくる、AddStaticMeshComponentの座標系と統一する、これはどっちもLocal(Relative)

https://i.gyazo.com/d14336ce3c517d080f3ee3345a642f9c.gif

Rotationも同じ感じで設定できる、ただWorld座標にしたほうが調整しやすいような気がしたのだけど、気のせいかもしれないです

https://i.gyazo.com/36e7034fb704c234f85ce0acf01d3148.png

GetLocationatTimeみたいなのもあって、これは時間に応じた位置を返してくれる、時間ってなんだと思ったら SplineのDetailsにDurationってのがあって、始点が0で、Durationで設定した秒かけて終点まで移動するみたいなことをやっているらしい、動く床とか、導火線とかそういう演出ができる


次はSplineMesh、Splineと違ってこっちはメッシュを指定して、それを変形させる
Spline Meshのところにいっぱいあるパラメーターを変更すれば変形できるのだけれど、このままでは使いにくいのでロケーターを自分で追加する

Transform型の変数を2つ作成して、EditableとShow3DWidgetにチェックを入れる
https://i.gyazo.com/369f44b5453cf1d45a7f9d99dcef3547.png

Show3DWidgetはレベル側でつまみが表示されるようになり、配置がしやすくなる
https://i.gyazo.com/24a8253cf3c5b9d09778c404604daa8c.png

TransFormのDefault値は、多分指定したメッシュに依るので、微調整する

次にこの値をSplineMeshに渡す、と言ってもそのままの関数があるのでこれだけでいい
https://i.gyazo.com/6ac6032e878f9f233f5672157f0108f7.png

このままだと回転が反映されないので、法線に変換する
https://i.gyazo.com/387aa11cc5ea1353bc852fa345c88952.png

できた
https://i.gyazo.com/5483dc94fab801f2d207dcd24a9ad0e6.png

指定メッシュの分割数が低いと、こんなかんじで酷いことになるので多めに取るといい、サンプルだと20分割程度

ShowDownの道にも使われていたのを思い出したので見る、ちなみに14分割
https://i.gyazo.com/e07c2223273719566f0a30235ce223d6.jpg

こっちだと法線の制御もロケーターでできるようになっていて、ひねりも設定できる、こちらのほうが使いやすそうなので改良する
Tangent用のVector3の変数を2つ作って場所を設定する
https://i.gyazo.com/9e9b1975ef28773690edfa367ad608a1.png
ノードをこんなかんじにする、StartとEndも、サイズ変更とかしないならVector型に変えてしまってもいいかも
https://i.gyazo.com/325c10f12a9c41154168051ea426aec2.png

これで新しいロケーターで制御できるようになった、つぎはひねりだけど、set rollって関数が用意されていてそこに数値を投げ込めばいい

https://i.gyazo.com/124081f492785d7ce91ac3bfb42b5431.png

単位が謎だけど、-3~3くらいに範囲指定したfloatを繋げればいい感じになる気がする

https://i.gyazo.com/613d381cb3d038b74029082f1f25c90e.png



基本はこれだけなので、応用っぽいアニメとかは今度


あまり関係ない話とメモ
・トランスフォームについて
Location, Rotation, Scale 3つをまとめた構造体

・座標系について


・座標系の変換について