ベクトルを正規化しよう
ベクトルの正規化とは向きをそのままで長さが 1 になるような矢印にする事です。ベクトルの正規化を図に表すと下のようになります。
プログラムで計算するには、Vec2dNormalize( v ); 関数を使います。
第一引数にベクトルを代入すると戻り値として正規化されたベクトルが返ってきます。
例) ベクトルの正規化例
|
var vec1 = _root.Vec2dCreate(2, 5);
var vec2 = _root.Vec2dNormalize(vec1);
|
長さが 1 になるということは、この後スケーリング変換をかけると好きな長さに変換する事ができます。
例えば 2.5 という長さにしたいときは、適当なベクトルを正規化してから、2.5 倍にすると求まります。
目的地まで一定の速度で進むベクトルを調べよう
さてキャラクターを目的地まで移動させたいと思います。自分の立っている座標をAとします。目的地の座標をBとします。
まずAからBに向かって矢印を引くようなベクトルを調べる事にしましょう。
図のように位置ベクトルBから位置ベクトルAを減算し、そのベクトルを正規化します。その後に好きな値でスケーリング変換をかけると
その長さのベクトルが求まります。
例) AからBの方向を向いた長さが2のベクトル
|
var pos_a = _root.Vec2dCreate(100, 20);
var pos_b = _root.Vec2dCreate(10, 100);
var vec = _root.Vec2dSub( pos_b , pos_a );
vec = _root.Vec2dNormalize( vec );
vec = _root.Vec2dScale( vec , 2 );
|
サンプル - vector_02_fla5.zip(5kバイト)
これでベクトルを好きな長さに変換する方法がわかりました。
さらに別の使い方を見てみましょう。
最高速度を設定しよう
実際にベクトルを使った操作を考えてみましょう。まず自分の座標を表す位置ベクトルと、自分の移動量を表す移動ベクトルを作りましょう。
例) 位置ベクトルと移動ベクトルを作る
|
onClipEvent (load) {
var pos = _root.Vec2dCreate(200, 150);
var spd = _root.Vec2dCreate(0, 0);
}
|
毎フレーム、移動ベクトルを位置ベクトルに加算する処理を実行します。
例) 移動ベクトルを位置ベクトルに加算する
|
onClipEvent (enterFrame) {
var pos = _root.Vec2dAdd(pos, spd);
}
|
位置ベクトルからパラメータを取り出して座標に反映します。
例) 位置ベクトルを座標に反映する
|
_x = pos.x;
_y = pos.y;
|
キーボードの入力から方向データを抽出します。成分 (0, 0) のベクトルを作り押された方向によって ±1 加算します。
例) キー入力からベクトルを作る
|
// 押した方向によってベクトル成分を加算
var vec = _root.Vec2dCreate(0 , 0);
if(Key.isDown(Key.UP)) vec.y -= 1;
if(Key.isDown(Key.DOWN)) vec.y += 1;
if(Key.isDown(Key.LEFT)) vec.x -= 1;
if(Key.isDown(Key.RIGHT)) vec.x += 1;
|
一度正規化して方向成分だけにします。
例) 正規化して長さを一定にする
|
vec = _root.Vec2dNormalize( vec );
|
さらに好きな値でスケーリングします。このベクトルを加速ベクトルとします。
例) スケーリングして加速量を設定する
|
vec = _root.Vec2dScale( vec , 0.5);
|
加速ベクトルを移動ベクトルに加算します。
例) 加速量を移動量に加算する
|
spd = _root.Vec2dAdd(spd , vec);
|
ここが本題です。このまま実行すると、いくらでも移動量が増えてしまいます。そこで移動量に制限をつけることにしましょう。
移動量が5以上のときは 5 に戻すようにします。まず、現在の移動量の長さを調べます。
ベクトルの長さを調べるには、Vec2dLength( v ); 関数を使います。
第一引数にベクトルを代入すると戻り値として長さが返ってきます。
例) ベクトルの長さを調べる
|
var vec = _root.Vec2dCreate(50, 10);
var length = _root.Vec2dLength( vec );
|
では、プログラムを見てみましょう。
まず移動量の長さが 5 より大きいか調べます。
例) 最高移動量を超えていないかを調べる
|
if(_root.Vec2dLength(spd) > 5){
}
|
5 より大きい場合、移動量を正規化して長さが 5 になるようにします。
例) 移動量制限を付ける
|
spd = _root.Vec2dNormalize( spd );
spd = _root.Vec2dScale( spd , 5 );
|
最後に移動時の摩擦として速度に( 0 ~ 1.0) の値でスケーリングし続けます。
例) 摩擦
|
spd = _root.Vec2dScale(spd , 0.9);
|
ベクトルの移動の使い方は以上です。
3Dベクトルの移動計算は、さらにZ軸が増えるだけです。基本的な使い方は同じです。
|