ベクトル反射
以前 斜面へのボールの反射方法を考えるために、ない頭を沸騰させて「斜面への衝突判定と反射」という記事を書きました。
今回その方法よりもスマートな方法で解を導き、反射に必要な各データを得られるメソッドを作成しました。
【 サンプル 】
各青い点はドラッグ&ドロップが可能です。
【 ソース 】
→Equation.reflectLineメソッド
【 使用例 】
//_rootに点を示すムービークリップ mc1, mc2, mc3, mc4, mc5が存在する var pt1:Object = { x:_root.mc1._x, y:_root.mc1._y }; var pt2:Object = { x:_root.mc2._x, y:_root.mc2._y }; var pt3:Object = { x:_root.mc3._x, y:_root.mc3._y }; var pt4:Object = { x:_root.mc4._x, y:_root.mc4._y }; var line1:Object = { pt1:pt1, pt2:pt2 }; var line2:Object = { pt1:pt3, pt2:pt4 }; //二直線交差・反射データ取得 var data:Object = Equation.reflectLine( line1, line2 ); if( data != null ){ //赤点位置 trace( data.cls.x ); trace( data.cls.y ); //緑点位置 trace( data.vr.x+data.cls.x ); trace( data.vr.y+data.cls.y ); //紫点位置 trace( data.vn.x+data.vr.x+data.cls.x ); trace( data.vn.y+data.vr.y+data.cls.y ); }
line1には反射対象の線分データを指定、line2には反射の壁となる線分データを指定します。
Equation.reflectLineメソッドの戻り値はObject型で、そのObject型のプロパティには次のデータが設定されます。
Object.cls.x = line1,line2の交点X座標
Object.cls.y = line2,line2の交点Y座標
Object.vr.x = めりこみ調整用Xベクトル
Object.vr.y = めりこみ調整用Yベクトル
Object.vn.x = 反射後のXベクトル
Object.vn.y = 反射後のYベクトル
サンプルでは、赤点がline1,line2の交点を示し、赤点から緑点がめりこみ調整用ベクトル、緑点から紫点が反射後のベクトルを示しています。
斜面への衝突判定と反射で導いた解は、ネットで片っ端から得た断片的な知識で得たものなので、きっとかしこい方法ではないのだろうなあと感じておりました。なので、プログラミング用数学・物理本のエントリーで書いた「ゲーム開発のための数学・物理学入門」という本を参考に勉強しなおすことに。
この参考書には斜面への衝突判定と反射のどんぴしゃな解答があり、なるほど、このようにベクトルを用いて求めることが可能になるのだなあと納得できました。私のような数学のすの字も忘れてしまった人間にはうってつけの本です。
ちなみにプログラミング用数学・物理本のエントリーで挙げた「プログラミングのための線形代数」という本も購入しましたが、こちらはちょっと初心者には敷居が高いような感じで早くもほこりをかぶっております。もう少し知識を蓄えた後に読もうと思います。
今回のメソッドのソースは本から得た知識を元に作成したものなので、ソースの部分部分の解説は省略させていただきます。
ベクトルに関しては、FlashPlayer8で利用可能なPointクラスを用いると便利かもしれません。しかしFlashPlayer7ベースのFlashLite2.0のことを考え、Pointクラスは使用しないことにしました。
FlashLite2.0の存在のおかげで、FlashPlayer8以降対応のクラスを用いた独自ライブラリは重宝度が下がってしまうのですかなあ。