どうもたくあんです。
作品審査や面接練習はいかがですか?
せっかくの機会ですので受けたほうがいいですよ。
ところで以前何かのゲーム雑誌でこんなことが書いてました。
以下その本文。
最近の就活生は大量に会社を受けているので、面接慣れしている。
そのため、いざ採用すると中身が伴わっておらず、面接であれだけ言っていたのに
何もできない人が多いので・・・・
なんてものでした。
8月くらいの記事で面接は慣れる事も重要だと私はいいましたが、それだけではダメだと言うことですね。
中身が伴わってないなんて言われないように中身もガンガン鍛えて行きましょう!
って事で今日はベクトルについて色々。
[2回]
斜方投射の記事でベクトルを使いましたが、
そもそもわからないなんて人は、3Dゲームを作れない。
まぁある程度は2年で習うかもしれないがもったいない。
現状2Dでゲームを作る時、当たり判定、キャラの挙動はどのようにおこなっているでしょうか?
授業でならうのは、sin,cosでの計算、円、四角での当たり判定といったところかな。
しかし、ベクトルを身につけるだけでかなり幅が広がる。
なので、今日はいくつか紹介してみようかと思う。
・そもそも「ベクトル」とは?
これは説明するのも如何なものかと思うけど、力と方向を表す量を言います。
ちなみにただ力、値のみ表すのはスカラーと言います。
・内積
正直いちいち説明してられないので参考サイトはまるぺけでw
http://marupeke296.com/COL_Basic_No1_InnerAndOuterProduct.html
最低限覚えておくなら
2つのベクトルの角度が90度以下のときは正、
90度より大きいときは負の値になります。
2つのベクトルの角度が直角の時は内積は0です。
ベクトルA(ax ,ay)とベクトルB(bx ,by) の内積
(ax * bx) + (ay * by);
で求められます。
んでゲームで使うなら・・・
2つのベクトルが直交するか
2つのベクトルが平行か
2つのベクトルの向き(鋭角、鈍角かどうか)判定
2つのベクトルの角度
てな感じで、角度や内積の値から色々判定出来るのがわかると思います。
・外積
こちらもまずは上のサイトをみてから読むこと推奨。
まるぺけにも書いているが2つのベクトルで外積を求めると高さが出ている。
そのままジャンプ計算にもできると書いているが、その他に有用なものがあります。
それは当たり判定です。
具体的なモノは昔、サイトを参考にして組んだものをはります。
たぶんうまく行くと思います。
昔のなので、コードとか色々ひどいですけどねw
戻り値、宣言方法は少しだけC言語用に変更しました。
//------------------------------------------------------------//
// 線分同士が交差しているか(カベとの判定用) //
//------------------------------------------------------------//
// 二つの線分の両端の座標から外積を算出し
// それを乗算することでそれぞれの線分の左右に
// もうひとつの線分の座標があるか調べている
//------------------------------------------------------------//
int CrossHitCheck(float a1_x, float a1_y, float a2_x, float a2_y,
float b1_x, float b1_y, float b2_x, float b2_y)
{
// 外積で交差判定
float v1 = (a2_x - a1_x) * (b1_y - a1_y) - (a2_y - a1_y) * (b1_x - a1_x);
float v2 = (a2_x - a1_x) * (b2_y - a1_y) - (a2_y - a1_y) * (b2_x - a1_x);
float m1 = (b2_x - b1_x) * (a1_y - b1_y) - (b2_y - b1_y) * (a1_x - b1_x);
float m2 = (b2_x - b1_x) * (a2_y - b1_y) - (b2_y - b1_y) * (a2_x - b1_x);
//+-, -+なら-値になる
if( (v1 * v2 <=0) && (m1 * m2 <=0))
{
return 1; // 交差しているならtrueを返す・・・・当たってると言うことです
}else{
return 0; // false
}
}
使い方は座標で直線を指定して、それが交差しているかだけを見て判定しています。
ただこのやり方だとあくまで直線同士でしかできないので、不便もおおいかと。
私の場合は決まった斜線の壁と判定したいだけだったので、このコードを使いましたが。
弾が目標に当たるかを見るだけなら十分かもね。
使いやすくするには、
もう少し改良がいるでしょう。
外積は応用次第で様々な判定が可能なのでオススメです。
余談ですが、3Dでは外積は重要な要因です。
2Dで今のうちにしっかり身に付けて置いてください。
例えば・・・
2つのベクトルに垂直なベクトルを求める。
ポリゴンの向き(法線ベクトル)を求める。
以上!!
当たり判定しだいで皆さんが作りたいゲームの幅も広がると思います。
ついでに様々な当たり判定も紹介しているサイトをペタリしておこう。
http://1st.geocities.jp/shift486909/program/collision.html
コードはC++だが判定部分や理屈をみるだけなら問題ないはずです。
PR
COMMENT