座標計算の手引

Last-modified: 2018-12-12 (水) 19:06:05

スクリプトでは座標や角度を導く計算をよくします。
三角関数などの基本知識があるという前提で記述します。

仕様

座標計算にまつわる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

ベクトル

単位ベクトルの作り方を参照して下さい。