忍者ブログ
まったくのプログラミング素人の筆者がC++/HSPを使用してSTG(シューティングゲーム)を作っていく過程を書くブログでしたが最近は脱線気味。プログラミング以外にも、ゲーム関連の記事、日々の戯言など。
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

反射レーザーを作ってみたいと思って以前Unityで反射レーザーを作った事がありました。
【Unity】Vector3.Reflectを使用して3Dな反射レーザーを表示する
この時はUnity側に反射ベクトルを計算してくれる関数があったので問題なかったのですが、プチコンだと自前で実装しなければならなかったので試行錯誤しながら作ってみました。

まず反射ベクトルを使って反射させるためには弾の移動自体をベクトルを使って移動させる必要があります。
ベクトルを使って移動させる場合は目標の座標を指定するようにします。
例えば目標の座標が(ex,ey)、弾の座標が(tx,ty)だとします。

弾の座標と目標の座標の長さvnを三平方の定理を使って求めます。
vx=ex-tx
vy=ey-ty
vn=SQR(vx*vx+vy*vy)

求めた長さvnを使って弾の座標から目標の座標を引いたものvxやvyを割ります(ベクトルの正規化)
弾の速度をdsとして割ったものに弾の速度dsを掛けるとxとyそれぞれの移動量となります。
txv=(vx/vn)*ds
tyv=(vy/yn)*ds

移動は現在の座標に移動量を足してやれば良いので
tx=tx+txv
ty=ty=tyv
とすると目標の座標までベクトルを使って移動させることが出来ます。
(この方法でも自機狙い弾とか作れますね)


これでベクトルを使って弾を移動させる事が出来るようになったので反射ベクトルを使って反射させてみます。
反射ベクトルについて検索してみると

R=F+2aN
という式で求められると書いてあります。
(詳しい内容は検索すると沢山出てくるので省きます)
Fは進行ベクトル(弾の移動量)なのでtxv,tyvとなります。

Nは壁の法線ベクトルです。(法線ベクトルも詳しい内容は検索すると沢山出てくるので省きます)
法線ベクトルは衝突点から垂直方向に移動する弾(ベクトル)と理解するとわかりやすい気がします。
例えば衝突点の座標をhx.hyとするとhx,hy+10(10でなくてもプラス方向ならなんでも良い)方向に移動するベクトルの計算を最初に書いたベクトルの移動と同じように計算します。
vx=hx-hx
vy=hy-(hy+10)
vn=SQR(vx*vx+vy*vy)
計算したものを正規化すれば法線ベクトルがわかります。
hoxv=(vx/vn)
hoyv=(vy/yn)

aは進行ベクトルの逆ベクトルと法線ベクトルとの内積で求めます。
a=−F⋅N
a=-(txv*hoxv+tyv*hoyv)

これでFとNとaのすべての要素が計算出来たので反射ベクトルを計算します。
反射ベクトルをhanx,hanyとすると
hanx=txv+2*a*hoxv
hany=tyv+2*a*hoyv
それに速さを掛けたものが反射ベクトルの移動量となります。
hanx=hanx*ds
hany=hany*ds

txv=hanx
tyv=hany
tx=tx+txv
ty=ty+tyv

*筆者の理解が十分でない所もあり色々と間違っている所もあるかもしれません

下記のページを参考にさせて頂きました。
反射ベクトルを求める
PR
この記事にコメントする
お名前
タイトル
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
Twitter
カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
最新コメント
[04/20 kt.]
[04/19 うぇむ]
[11/24 kt.]
[11/21 NONAME]
[11/24 kt.]
プロフィール
HN:
kt.
性別:
男性
自己紹介:
プログラミング経験は昔ファミリーベーシックでちょっとさわったくらい。
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
ブログ内検索
忍者ブログ [PR]