Normalize とは? (翻訳/要約)

(以下は、英語スレッドの質問を翻訳/要約したものです。)

チュートリアル動画を見ていたのですが、一つだけ分からないことがありました。Normalize (正規化) とは何でしょうか?どのような機能があるのでしょうか?

動画では、Sphere (球体) を プレイヤー キャラクターに移動させます。そのために、ブループリントで、プレイヤーの位置から Sphere の位置を引き、さらにその結果を Normalize しています。

Normalize の目的とはこの場合どのようなことなのでしょうか。なぜそれが必要なのでしょうか?

チュートリアル動画では、3:00 のところで Normalize が出てきます。

よろしくお願いいたします。

–pedrampedr

英文スレッド

(以下は、英語スレッドの回答を翻訳/要約したものです。)

ベクタを他のベクタから引くと、大きさと方向をもつベクタが得られます。また、このベクタを Normalize すると、このベクタの大きさは 1 になります。方向は変わりません。

ベクタにおける Normalize とは、ベクタを変更することによって、方向は同じままで長さが 1 のベクタを作ることです。

チュートリアルでは、Normalize されたベクタ (方向は同じままで長さが 1 のベクタ) を使っています。ベクタが Normalize されない場合は、Tick イベントから出力される差分秒数と Normalize されたベクタを掛け合わせると、値の増加が極端になってしまいます。

–ambhar

訳注:

ドーナッツがキャラクターの方向に移動するブループリントは次のようになります。

これを実行すると、ドーナッツはゆっくりとキャラクターのところまで移動して最後はキャラクターがドーナッツにすっぽりはまり込んだ形になります。

上記の回答を図解してみると、次のようになります。

単純化するために 3D ではなく 2D で考えています。

ドーナッツの位置 (0, 0) からキャラクターの位置 (1000, 1000) までの距離 (青いベクタの長さ) は、ピタゴラスの定理から 1414 と計算できます。

アンリアル ユニットは cm なので、14m14cm です。Normalize をしないと、この分だけ一気に動くことになります。一瞬のうちにドーナッツがキャラクターのところまで移動してしまうことになります (先の画像で考えると、一瞬でキャラクターがドーナッツにすっぽりはまり込んだ状態になります)。

そこで正規化することによって、そのベクタの長さをわざわざ 1cm にしておき、それにいくらか掛けることによって、適切な (ゆっくりとした) スピードにしています。ただし、方向は変えられません。ドーナッツがキャラクターの方に向かわなくなりますので。

なお、キャラクターの位置からドーナッツの位置を引いているのは、ドーナッツの位置を (0, 0) として処理するためです。