俺に解るように説明する "Armory Engine" 入門+

ゲームエンジン Armory Engine (Armory3D) の使い方を手探りで学んで入門しようって感じかな。

P5.エアホッケー.17「プレーヤーのマレットでパックを跳ね返す(2/3)」

f:id:ore2wakaru:20190529003446p:plain

今回は、後半部分、反射ベクトルを出す。前回も述べたが、反射ベクトルに関しては事前にググっておくことをお勧めする。俺は、ググって一番最初に出て来るページを3回読んでやっと分かった系だからな。

反射ベクトル

パックがマレットに当たって跳ね返る時、求めたいベクトルは反射ベクトル( \vec{R})。下図。

f:id:ore2wakaru:20190528195819p:plain

で実は、 \vec{R} は下図のように補助線を引いてやれば、 \vec{R} = \vec{F} + 2(a\vec{N}) であると分かる。

f:id:ore2wakaru:20190528203359p:plain

つまり、 a の大きさが分かれば反射ベクトル( \vec{R})はすでに分かっているベクトルだけの簡単な計算で出ることになる。

 \vec{F} はパックの "myDir" だし、 \vec{N} はノーマルつまりパックの "N" だからね。

で、 a の大きさを求めるにはベクトルの内積っちゅうのを使うんだが、その前に三角関数

三角関数  \cos\theta

下図の三角形で考えてみると、

f:id:ore2wakaru:20190528222723p:plain

 a = |-\vec{F}|\cos\theta だよね。で、ベクトルの内積

ベクトルの内積(Dot Product)

公式:  \vec{a} \cdot \vec{b} = |\vec{a}| |\vec{b}| \cos\theta

公式は、こんならしい。で、「・」があるから、英語では「ドット プロダクト」というのかな? まー名称のことはさておいて、今回ハッキリ分かってるベクトルを使うと、

f:id:ore2wakaru:20190528230022p:plain

分かった? つまるところ、 a = -\vec{F} \cdot \vec{N} だ。出た。長かったな~。

イベント "HANSYA_P" 後半戦

以上の事を踏まえて、 \vec{R} = \vec{F} + 2(a\vec{N}) a = -\vec{F} \cdot \vec{N} を入れると、

 \vec{R} = \vec{F} + 2((-\vec{F} \cdot \vec{N})\vec{N})

これをノードで作ってやればイイ。

 後半部分: で求めた "N" を使って、やっとこ反射ベクトルが求められる・・・

f:id:ore2wakaru:20190528235846p:plain

1 "myDir" が  \vec{F} なので、ここで  -\vec{F} を作る。プラマイが逆だとなす角  \theta が違っちゃうから注意。

2  -\vec{F} \cdot \vec{N} をする。内積の計算。Vector Mathの "Dot Product" を選択だ。内積の結果の値は、ちょっと自信ないけど、ベクトルの成分じゃなく大きさだと思うので、Value から値を出している。実は別に Vector から出してもいいのかもしれない。

3  \vec{N} に掛ける要素は XY に必要なので、それを取り出したものと、  \vec{N} を掛ける。これは内積じゃないからね。同じ成分同士を掛ける普通の掛け算。"Multiply"。

4 ここで2倍にして

5 ここで  \vec{F} を足してる。

6 最後に出来たものを "myDir" にセットだ。これが反射ベクトル( \vec{R})。

7 1回反射したら、連続当たりを防ぐフラグを True にセット。

長かった~。まじ、長かった~。 おれ、オツカレ

テストプレイ

自マレットで跳ね返せるでしょ。(Gifは無し)

でもこれだと自分のマレットでガツンと打ち込んでもパックにスピードがのらないからちょっとおもしろくない。

本日のポイント
  • 計算メンドイから物理エンジン使え! あーすり抜けるんだったわ・・・)
  • Vector Math、そこは "Dot Product" なの? "Multiply" なの?

 次回、打ち込むときのパワーをパックにのせようかな。