妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

謎ノード解説『Lerp』『NormalizeToRange』

妹「あとLerpもよくわかんないんだけど。昨日と同じ、ランドスケープマウンテンのサンプルなんだけど……」

f:id:una_unagi:20160908213552p:plain

妹「なにがわからないかというと、まず読み方がわからない」

「読み方……って言われてもこれ略語だから、どうなるんだろ? Linear interpolationを略してLerpなわけだから、ラープかな」

妹「それでそのラープさんというのは、一体何のために存在してるのか」

「昨日のRInterpとすごく似てる。同じようにFloat版とかVector版とかある。Interp系のDeltaTimeを1に固定したバージョンというか。例えばさっきの画像の、A=85・B=110のケースだと、Alphaが0.5の時に97.5になる。50%のとこ」

妹「50%なら50って入れたらいいと思うんだけど……0から100とかでよくない?」

「これはUE4だけじゃなくて他のもそうなってたから、たぶん国際常識とかなのでは」

妹「国際的ならば仕方ないけど……そういえばInterpってのもLerpのと同じ単語から略してるのかな?」

「そうだと思う。Interpolationは補間という意味。AとBの間を補う、みたいな。Interp系ノードも同じように補間用だけど、徐々に変化させるという目的に特化してるから、経過時間のピンが付いてる。もう1つ、0.0~1.0の範囲からはみださないという違いがある」

妹「Lerpは、はみ出すの?」

「はみ出すよ。あくまでAを0、Bを1と考えた場合だから。その先もある。A=85・B=110で、Alphaが2なら戻り値は135。Alphaが-1なら60になる」

妹「なんでそうなるかわかりずらいね」

「AからBに進んだ状態が100%だけど、今回の100%は+25という計算になる。200%だと*50。だから 85+50 で、135。-1は、85-25 だから 60」

妹「ふんふん、ちょっとわかった」

「ただ今回の例を見ると、途中にclamp(float)が挟まってるから、0.0~1.0の範囲内に収まるようになってる。これならはみ出す心配はない」

妹「その前のNormalizeToRangeもちょっと気になるんだよ。同じVelocityが2つの別々のとこにつながってたりして、どういう構造なのかなと」

「NormalizeToRangeは、簡単にいえばLerpの逆。RangeMinがA、RangeMaxがBと考えて、Valueにその中間の数字を入れると、戻り値がAlphaで0.5になってるという感じの」

妹「2つつながってるのは?」

「元が同じ数字でも、範囲が違えば評価はかわってくるよ。例えばテストで20点っていうのが、100点満点なら0.2だけど、20点満点なら1.0になる」

妹「ふんふん」

「ここがどういう意図の計算式かはもっと詳しくプログラムを見ないとわからないけど、現在の進行スピードを、別の範囲で計算してるのは間違いない。下の方はより速いスピードの時を問題にしてる。1200だろうが1500だろうが、そんなのはマイナスだし、Clampされて全部0扱いという処理になってる」

妹「だいぶわかってきた気がする」

「どうしてそういう数字になってるのかわからない時は、いっそ違う数字を入れて試すっていう方法もある。Clampのとこも飛ばしちゃったり。それでもし元に戻せなくなっても、またダウンロードしてくればいいんだから」