三角関数を使ってオブジェクトを設置する

 

初めに

物体(Object)を設置するとき、GTA:SAは3次元空間ですから、座標X,Y,Zを使用します。今回の設置でZ(高さ)はあんまり意識しなくていいです。分かりやすいように絵を描いておきます。

さて、次に、このXYZ座標の空間にキャラクターを描きましょう。

このキャラクターの前に物体を設置したいとき、どうしますか?キャラクターの向き(Angle)はY軸と平行なので、キャラクター座標を取得して、Y座標をある程度増減すればうまくいきますね。

では、キャラクターがX方向とY方向のちょうど真ん中あたりを向いていたらどうすれば良いでしょうか?

キャラクターの座標からX,Y座標を半分づつ増減してみて・・・・。ではさっきよりYに近いけどY軸とは平行でない微妙な角度を向いていたら・・・。とこの様にキャラクターの目の前にオブジェクトを設置するにはただ単にXYZの座標を増減するだけではできません。

ではどうするのか。ここで三角関数の登場です。

 

三角関数

高校数学で習ったと思われる図形。覚えていますか?

別に1、2、√3といった値を思い出さなくても構いません。そういったものは全てコンピュータがやってくれますからね。

さて、この図の三角形とさっきの説明は何か関係があるの?という疑問が出てくる人がいるかもしれませんが(というかこのページはそこで疑問がでてくる人向けです。)、そもそも三角関数どういうものだったか覚えているでしょうか。

三角形は内面のの合計が必ず180゜となり、直角の角と指定した角に大きさを与えることで、辺同士の比を割り出すことができるものでしたよね。

sinとcosは直角と指定された角度から底辺と高さ(X,Y座標)を割り出すものです。わかり難い上に関係ない説明をしてしまいそうなので上の図を滑り台にしてみましょう。

傾斜が30度で滑り台の長さが1の滑り台を作ったとき、滑り台の高さがsinで滑り台の長さがcosというだけのことです。つまり角度と長さが分かれば滑り台の高さと長さも求まるということです。

ここまで分かれば簡単。

でっかい円を描きましたが、キャラクターが真ん中にいて、キャラクターを上空から見た図だと思ってください。キャラクターが30度の方向を向いていたら、キャラクターの座標から+sin30゜、+cos30゜の座標に物体を出現させれば目の前に設置できますね。

じゃあsinθ、cosθを求める公式は・・?必要ありません。SA:MPには「floatsin、floatcos」というsin cosを求めてくれる関数がありますからね。

 

実際に書いてみる

まずは以前作った動的に車を設置するコードをオブジェクト設置用にいじります。

これはキャラクターのいた座標ににオブジェクトを設置してキャラクターは高さ(z)+3の位置へ移動するとものです。これにsinfloat、cosfloatを追加してみましょう。

デバッグ的な要素で座標などのデータを表示するようにしています。ためしにこれで動作させてみましょう。

コマンドを入力しています(クリックで拡大)。今回はドラム缶でも出しましょうか、ドラム缶のIDは1225です。(オブジェクトのID表はこちら)

あれ?右側にドラム缶が設置されています。キャラクターの目の前にドラムカンを設置するんじゃなかったの??と思った方。そうです、先ほどのコードは足りないものがあります。

下記は先ほど記述したコードの一部。

ここはsin、cosを求め、距離を多少離すために2を掛けています。注目すべきはfloatsin、floatcosの第一引数です。変数aは一体なんだったのでしょうか。

変数aはGetPlayerFacingAngle。指定したプレイヤーのキャラクターの角度でしたね。ここで問題となるのが、キャラクターの角度の開始地点・・。どうやらキャラクターの右側が開始地点となっているようです。つまりこういうことですね。

さて、キャラクターの角度のではなくてキャラクターの目線の方に設置するにはどうすればよいのでしょうか・・・。簡単ですね。90度足してあげればいいだけです。

さて、作り直したところで再度コンパイルして試してみましょう。

さきほどと同じように入力します。

成功です。お疲れ様でした。

 

まだまだ足りない?

実際に設置してみるとわかりますが、この方法で設置したオブジェクトはほとんどが宙に浮いています。ドラム缶などはキャラクターと接触したらその時点で物理法則が働いてか落下するようですが。完全に固定されるようなオブジェクトは中に浮いたままです。

ここらへんは手動でZ座標を調整しないといけないのだろうと思われます。また、今回の方法ではオブジェクトのXYZ軸の回転を行うことができません。出現させたオブジェクトの調整に関しても記述していこうかと思っています。

今回はこの辺で。

 

画像提供

うたかたの月と最後の幻想さんよりアバター画像をお借りしました。

 

このカテゴリのその他の記事