PR

【ゲーム数学】いろんなゲームの動きが作れる反射ベクトルを活用しよう

色々なゲームの動きが作れる反射ベクトルを活用しよう ゲーム数学・物理

この度は跳ね返り具合を係数(0~1)にしてオブジェクトごとに跳ね返りのベクトルを向きを変わるようにしたかったのですが、そのAPIが見当たらなかったので自作することにしました。

これを使うことによって柔らかいものにあたったときの跳ね返ったり、逆に跳ね返らずに滑ったりを計算できるので色々オブジェクトに違いを出せるようになります。

反射ベクトルとは

壁の向きを表す法線ベクトルは有名だと思います。

壁の法線ベクトル

この向きとキャラクターの移動ベクトルに「ある計算」をすると
壁にあたった後、どの方向にキャラクターが移動する方向(ベクトル)を計算することができます。

ある程度のベクトルがわかる前提でお話していくのでご了承ください。

もしわからなくても後述の関数をコピペするだけでも使えると思います

 

反射係数とは

Unity標準の反射ベクトルを計算する関数ですが
これには係数を呼ばれる跳ね返り具合を調整するパラメータが指定できません。

例としては

係数 0・・・全く跳ね返らず、壁に沿って滑る
係数 1・・・壁にあたったあとに直角に跳ね返る(ブロック崩しのボールみたいな挙動)

となります。

係数0ではこのように滑りベクトルになります。

そして反射係数が1.0の場合は壁から反対側に反射されるようなベクトルになります。

冒頭にも述べた通り、これを使えば

  • 反射係数を0.5にして柔らかいものにあたったときの跳ね返りの挙動
  • 反射係数を1.0でビリヤードやパチンコのような跳ね返りが強いもの
  • 反射係数を0.0の滑りベクトルで氷の上を滑るようなゲームの動き

なんかも作れたりします。

当たるものによってどのように跳ね返るか
設定できるのは良いですね!

 

反射ベクトルを計算する関数

その時に使う関数はこちら

Vector3 CalcReflectVec(Vector3 vec, Vector3 normal, float reflectParam)
{
    normal.Normalize();
    var dot = -Vector3.Dot(normal, vec);
    var dotPlaneVec = normal * dot;
    return vec + dotPlaneVec + (dotPlaneVec * reflectParam);
}

引数はこのようになっています。

vec・・・速度ベクトル
normal・・・法線ベクトル(面の向き)
reflectParam・・・反射係数(0~1)

そして返り値が反射係数を考慮した反射ベクトルが出力されます。

かんたんですね!

 

活動内容のPR

下記が本サイトでの活動内容となります。

他の開発動画を見る

 

最後に

いかがでしたでしょうか。

反射ベクトルの演算は「どうだったっけ?」と忘れやすいのと反射係数を指定できないことに違和感を感じていたので備忘録として残すことにしました。

これで反射ベクトルの計算は忘れても大丈夫そうです!

本サイトではゲーム開発や日々気になったことを中心に発信しております。
もし興味がありましたら画面左下のベルマークから購読いただけますと幸いです。

では今回はここで終わりたいと思います。
ここまでお読みいただきありがとうございました。

コメント

スポンサーリンク
タイトルとURLをコピーしました