ymars
(ymars)
1
(以下は、英語スレッドの質問を翻訳/要約したものです。)
チュートリアル動画を見ていたのですが、一つだけ分からないことがありました。Normalize (正規化) とは何でしょうか?どのような機能があるのでしょうか?
動画では、Sphere (球体) を プレイヤー キャラクターに移動させます。そのために、ブループリントで、プレイヤーの位置から Sphere の位置を引き、さらにその結果を Normalize しています。
Normalize の目的とはこの場合どのようなことなのでしょうか。なぜそれが必要なのでしょうか?
チュートリアル動画では、3:00 のところで Normalize が出てきます。
よろしくお願いいたします。
–pedrampedr
英文スレッド
ymars
(ymars)
2
(以下は、英語スレッドの回答を翻訳/要約したものです。)
ベクタを他のベクタから引くと、大きさと方向をもつベクタが得られます。また、このベクタを Normalize すると、このベクタの大きさは 1 になります。方向は変わりません。
ベクタにおける Normalize とは、ベクタを変更することによって、方向は同じままで長さが 1 のベクタを作ることです。
チュートリアルでは、Normalize されたベクタ (方向は同じままで長さが 1 のベクタ) を使っています。ベクタが Normalize されない場合は、Tick イベントから出力される差分秒数と Normalize されたベクタを掛け合わせると、値の増加が極端になってしまいます。
–ambhar
訳注:
ドーナッツがキャラクターの方向に移動するブループリントは次のようになります。
これを実行すると、ドーナッツはゆっくりとキャラクターのところまで移動して最後はキャラクターがドーナッツにすっぽりはまり込んだ形になります。
上記の回答を図解してみると、次のようになります。
単純化するために 3D ではなく 2D で考えています。
ドーナッツの位置 (0, 0) からキャラクターの位置 (1000, 1000) までの距離 (青いベクタの長さ) は、ピタゴラスの定理から 1414 と計算できます。
アンリアル ユニットは cm なので、14m14cm です。Normalize をしないと、この分だけ一気に動くことになります。一瞬のうちにドーナッツがキャラクターのところまで移動してしまうことになります (先の画像で考えると、一瞬でキャラクターがドーナッツにすっぽりはまり込んだ状態になります)。
そこで正規化することによって、そのベクタの長さをわざわざ 1cm にしておき、それにいくらか掛けることによって、適切な (ゆっくりとした) スピードにしています。ただし、方向は変えられません。ドーナッツがキャラクターの方に向かわなくなりますので。
なお、キャラクターの位置からドーナッツの位置を引いているのは、ドーナッツの位置を (0, 0) として処理するためです。