スクリプトでは座標や角度を導く計算をよくします。
三角関数などの基本知識があるという前提で記述します。
仕様
座標計算にまつわるGTA:SAの仕様
- 座標
- X軸-西から東へ
- Y軸-南から北へ
- Z軸-下から上へ
- 角度
- X軸-北を0° この状態から上へ向かって+
- Y軸-上を0°
- Z軸-北を0° Classの Actor.Angle で拾えるのはこれ
数学では通常角度の基点が+X軸上にあるのに対し、GTA:SAのZ軸は+Y軸が基点となっています。
ですので、計算する場合はXとY軸を逆転し、Y軸を反転して計算します。
計算
例1 CJの3m前の座標を取得
0172: 0@ = actor $PLAYER_ACTOR Z_angle 02F6: 1@ = sine 0@ // (float) 02F7: 2@ = cosine 0@ // (float) 0013: 1@ *= -3.0 0013: 2@ *= 3.0 00A0: store_actor $PLAYER_ACTOR position_to 3@ 4@ 5@ 005B: 3@ += 1@ // (float) 005B: 4@ += 2@ // (float)
-3sinθと3cosθを計算し、XY座標に足します。
θは0@、Z角度が入ります。
上で説明したようにY軸は反転しているので、sinに負をかけています。
しかしこの命令は
04C4: create_coordinate 3@ 4@ 5@ from_actor $PLAYER_ACTOR offset 0.0 3.0 0.0
と全く同じ動作をします。
行数も消費する変数もこちらの方が少ないので、通常はこちらを使用した方が良いです。
例2 角度の取得
opcodeでは人、物の角度はZ角度しか取得できません。
人の場合はX,Y角度は常に0°となっているので問題ありませんが、オブジェクトを操作する時には必要になります。
そこで、opcode 0400でオブジェクトから見た座標を取得し、それを元に角度を算出します。
角度を座標から算出するため、アークタンジェント、アークサイン、アークコサインのどれかを使用します。
opcodeにはそのような関数は存在しないので、この関数を作成します。
ここでは、Ryosuke氏が作成したアークタンジェントのコードを使用します。
:ATAN 0509: 2@ = distance_between_XY 0@ 1@ and_XY 0.0 0.0 0073: 0@ /= 2@ // (float) 0073: 1@ /= 2@ // (float) 0509: 2@ = distance_between_XY 0@ 1@ and_XY 0.0 1.0 for 3@ = 0 to 15 0017: 2@ /= 2.0 006B: 2@ *= 2@ // (float) 0087: 1@ = 2@ // (float) 0013: 2@ *= -1.0 000B: 2@ += 1.0 01FB: 2@ = square_root 2@ 0013: 2@ *= -1.0 000B: 2@ += 1.0 006B: 2@ *= 2@ // (float) 005B: 2@ += 1@ // (float) 01FB: 2@ = square_root 2@ end 0013: 2@ *= 65536.0 0017: 2@ /= 3.14159265 0013: 2@ *= 180.0 if 0021: 0@ > 0.0 then 0013: 2@ *= -1.0 000B: 2@ += 360.0 end return
ベクトル
単位ベクトルの作り方を参照して下さい。