単位ベクトルの作り方

Last-modified: 2018-12-12 (水) 19:09:26

ベクトル、単位ベクトル

ベクトルは主にオブジェクトの操作などに使用します。
どの方向へどのくらいのスピードで飛ぶか、などを計算する上で重要です。

目的の速度にするには単位ベクトルを使用します。
単位ベクトルというのは、長さが0から1の間の向きを表すベクトルのことです。

050A: 19@ = distance_between_XYZ 23@ 24@ 25@ and_XYZ 20@ 21@ 22@
0063: 20@ -= 23@ // (float)make_vector
0063: 21@ -= 24@ // (float)make_vector
0063: 22@ -= 25@ // (float)make_vector
0073: 20@ /= 19@ // (float)seikika
0073: 21@ /= 19@ // (float)seikika
0073: 22@ /= 19@ // (float)seikika

この作業を正規化といいます。

 

あるオブジェクト0@の座標20@ 21@ 22@から座標23@ 24@ 25@に向かってオブジェクト0@を5m/sで投げる場合

01BB: store_object 0@ position_to 20@ 21@ 22@
050A: 19@ = distance_between_XYZ 23@ 24@ 25@ and_XYZ 20@ 21@ 22@
0017: 19@ /= 5.0
0063: 20@ -= 23@ // (float)make_vector
0063: 21@ -= 24@ // (float)make_vector
0063: 22@ -= 25@ // (float)make_vector
0073: 20@ /= 19@ // (float)seikika
0073: 21@ /= 19@ // (float)seikika
0073: 22@ /= 19@ // (float)seikika
0381: throw_object 0@ velocity_in_direction 20@ 21@ 22@

色々なやり方がありますが、上の例では
(投げる座標 - 投げる目的地への座標) / (双座標の距離 / 速度[m/s]) となっています。
0017がない場合では単位ベクトル、つまり1m/sで投げることになります。
任意の速度で投げたい場合はこの値を調整することで変えることが出来ます。
単位ベクトルを使用することによって、目的の速度を容易に変数で制御することが出来るので非常に効果的です。

人、物、車の向きベクトル

下記のコードで座標を二点取り、先の方の座標からの元の方の座標を引いてやればベクトルが求まります。

04C4: store_coords_to 0@ 1@ 2@ from_actor $PLAYER_ACTOR with_offset 0.0 1.0 0.0
0400: store_coords_to 0@ 1@ 2@ from_object 0@ with_offset 0.0 1.0 0.0
0407: store_coords_to 0@ 1@ 2@ from_car 0@ with_offset 0.0 1.0 0.0