【Godot】normalized() の仕組みを図を用いて簡単に解説!

GDScript
この記事は約4分で読めます。

こんにちは、しゅみぶろぐです。

今回はGDScriptにおけるプレイヤーやオブジェクトの斜め移動の速さを一定にする際に登場した、

(Vector2 / Vector3).normalized()

の仕組みとその使い方を解説していきます。

normalized()とは

文章として表現すると、

与えられたベクトルの大きさを向きを変えずに1にする

もっと簡単に言うと、

与えられたベクトルの向きを抽出する

処理です。

具体的に考える

数学を使って考えると、Vector2/3.normalized()は

Vector2/3の単位ベクトルを返す処理です。(習っていない人は上の図で感覚的に頼む!)

例えば、

var v = Vector2(3, 4) 
var n = v.normalized() #vの単位ベクトルを返す

結果は、

v = (3, 4) #大きさ5
n = (0.6, 0.8) #大きさ1

となります。図で表すと下のようになります。

斜め移動の高速化を防ぐ

代表的な使用例として、Vector2(2D)やVector3(3D)における斜め移動の高速化を防ぐために用いられます。

斜め移動の高速化の問題と原因

例えば、Vector2でのプログラムとして下のスクリプトが実行されるとします。

(velocityを速度の変数として定義しています。)

  if Input.is_action_pressed("move_right"): #右移動 		
    velocity.x += 1
    	
	if Input.is_action_pressed("move_left"): #左移動
		velocity.x += -1
		
	if Input.is_action_pressed("move_up"): #上移動
		velocity.y += -1
		
	if Input.is_action_pressed("move_down"): #下移動
		velocity.y += 1
		

ここで、右移動と上移動が同時に行われた場合どうなるでしょうか。

上の図のように、右移動と上移動を合成した斜め移動の大きさは

12+12=21.414…\sqrt{1^2 + 1^2} = \sqrt{2} \fallingdotseq 1.414…

となり、斜め移動は通常の移動速度の約1.414倍になってしまいます。

斜めに移動すると足が速くなる!!大問題です。

ここでnormalized()の出番です。

if velocity.length() > 0: #速度が0より大きいとき ⇔ 動いているとき
		velocity = velocity.normalized()

というコードを加えることで斜め移動高速化問題は解決します。

実際に計算をしてみる

右移動と上移動を同時に行うとその速度ベクトルは

velocity = (1, -1)

ここに、normalized()の処理を行うと

velocity = (0.707, 0.707) #大きさ1

となり、大きさは

0.7072+0.7072=1\sqrt{0.707^2 + 0.707^2} = 1

斜め移動の速度が、ほかの移動速度と一致しました。高速化は解決できたことがわかります。

まとめ

・normalized()は、対象のベクトルの単位ベクトルを返す処理

・使用例として斜め移動の高速化などを防ぐプログラムがある

今回学んだnormalized()は2D、3Dゲームでこれから何度もお世話になりそうなコードですね。

中身を理解してうまく付き合っていきましょう^^

GDScriptについてまだ基礎がかためきれていない方は、ぜひこちらの記事も参考にしてみてください。

GDscriptを無料で学ぶ!Learn GDScript From Zeroを使ってみた正直な感想。
Learn GDScript From Zero appより

最後まで見ていただきありがとうございました。

コメント

タイトルとURLをコピーしました