P5.エアホッケー.17「プレーヤーのマレットでパックを跳ね返す(2/3)」
今回は、後半部分、反射ベクトルを出す。前回も述べたが、反射ベクトルに関しては事前にググっておくことをお勧めする。俺は、ググって一番最初に出て来るページを3回読んでやっと分かった系だからな。
反射ベクトル
パックがマレットに当たって跳ね返る時、求めたいベクトルは反射ベクトル()。下図。
で実は、 は下図のように補助線を引いてやれば、 であると分かる。
つまり、 の大きさが分かれば反射ベクトル()はすでに分かっているベクトルだけの簡単な計算で出ることになる。
はパックの "myDir" だし、 はノーマルつまりパックの "N" だからね。
で、 の大きさを求めるにはベクトルの内積っちゅうのを使うんだが、その前に三角関数。
三角関数
下図の三角形で考えてみると、
だよね。で、ベクトルの内積。
ベクトルの内積(Dot Product)
公式:
公式は、こんならしい。で、「・」があるから、英語では「ドット プロダクト」というのかな? まー名称のことはさておいて、今回ハッキリ分かってるベクトルを使うと、
分かった? つまるところ、 だ。出た。長かったな~。
イベント "HANSYA_P" 後半戦
以上の事を踏まえて、 に を入れると、
これをノードで作ってやればイイ。
❷ 後半部分: ❶で求めた "N" を使って、やっとこ反射ベクトルが求められる・・・
1 "myDir" が なので、ここで を作る。プラマイが逆だとなす角 が違っちゃうから注意。
2 をする。内積の計算。Vector Math
の "Dot Product" を選択だ。内積の結果の値は、ちょっと自信ないけど、ベクトルの成分じゃなくて大きさだと思うので、Value から値を出している。実は別に Vector から出してもいいのかもしれない。
3 に掛ける要素は X と Y に必要なので、それを取り出したものと、 を掛ける。これは内積じゃないからね。同じ成分同士を掛ける普通の掛け算。"Multiply"。
4 ここで2倍にして
5 ここで を足してる。
6 最後に出来たものを "myDir" にセットだ。これが反射ベクトル()。
7 1回反射したら、連続当たりを防ぐフラグを True にセット。
長かった~。まじ、長かった~。 おれ、オツカレ!
テストプレイ
自マレットで跳ね返せるでしょ。(Gifは無し)
でもこれだと自分のマレットでガツンと打ち込んでもパックにスピードがのらないからちょっとおもしろくない。
本日のポイント
〇 次回、打ち込むときのパワーをパックにのせようかな。