2007年、スティーブ・ジョブズによって
iPhoneが初めて発表されたときの日本語字幕付き動画。
(その1(上記)、その2、その3、その4、その5)
今となっては当たり前になった仕様や操作方法も
当時いかに革新的で興奮を呼んだかが伝わってくる。
プレゼンテーションのお手本とも言われる発表会で、
合わせて50分近くの内容だが、
まったく退屈せずに観れてしまった。
「指の関節の位置はどこか」と聞かれれば
その先端からシワの位置に合わせて
第1関節、第2関節、第3関節と考えるのが自然だろう。
しかし、横から見ながら指を曲げてみるとわかるが、
第3関節に見えたシワの部分は実はまったく曲がらず、
実際の関節は想像よりもずっと下の方にある。
手の甲の方から見ると関節の位置は簡単にわかるのだが、
手のひら側から見るとまったく違う場所に誤解するのが不思議だ。
多くの人が実際とは異なる認識を持つ現象を
「マンデラ効果(マンデラエフェクト)」と呼ぶらしい。
いろいろな事例をかき集めてみたので
まずは自分の認識と一致しているかどうかを確認して欲しい。
実は上記に書いたものはすべて「誤り」なのだが、
自信を持って正しいと感じられる内容、
なんなら頭の中にハッキリと思い浮かべられるものまである。
単なる思い違いだと片づけるのは簡単だが、
「それが現実だった別の並行世界から来た」という説の方が魅力的だ。
つまりピカチュウの尻尾の先端が黒く、アメリカに52州ある世界から
なんらかの理由でこの世界に飛ばされてきたために
以前の記憶と混同してしまっているという理屈だ。
あまりにリアリティを感じる記憶があるため
パラレルワールド(マルチバース)間を移動したと考える方が
つじつまが合うというのが面白い。
他にもマンデラ効果の事例があれば集めていきたい。
ゲーム中に出てくる判定や敵AIの処理では
角度の情報が必要になることが多い。
2Dゲームの場合は回転方向が左右しかないので
タンジェントを利用するだけでなんとかなるが、
3Dゲームの場合は横にも縦にも回転できるので
ベクトルの内積を利用する必要が出てくる。
3Dゲーム開発をする上で内積は避けられないため、
早い段階で理解してしまう方がいい。
内積の計算には必ず2本のベクトルが関係するので、
ここでは3つの座標のうち2つを結ぶベクトルを考える。
点Aと点Bを結ぶベクトルを 、
点Aと点Cを結ぶベクトルを と表現し、
2本のベクトルの向きは46度ズレているとする。
を求めるには座標Bから座標Aを引き算するだけでいい。
「2ヶ所の座標を引き算すると
その2点を結ぶベクトルが手に入る」
というのはベクトル計算の基本だ。
内積というのは2本のベクトルから求めたひとつの値を指し、
と の内積は と表現するが、
この求め方に2種類あるのがミソだ。
ひとつがベクトルの長さとコサインを利用する方法だ。
は の長さを表しているので、
上記の式は「 の長さ」と「 の長さ」と「コサインθ」を
すべて掛け合わせた値を求めていることになる。
ベクトルの長さは三平方の定理で求められるので、この図でいえば
となり、コサイン46度は約0.694なので、
それらを踏まえて計算すると
となる。
もうひとつがベクトルの成分を使う方法だ。
の成分を 、
の成分を と表現すると、
という計算で内積を求めることができる。
ベクトルの成分というのはXYZ方向それぞれの長さであり、
終点から始点を引き算すればいいので、この図でいえば
となるので、これを踏まえて計算すると
となり、もう一方の計算方法で求めた値と同じ結果になる。
さて、内積をうまく利用すると
2本のベクトルの間の角度を求めることができる。
先ほどは角度の値を添えていたが、
実際にはその情報がわからないことが多く、
そこを内積を利用して求めていくのだ。
一旦、内積を求める2つの計算方法を並べてみる。
どちらの計算方法でも同じ値が求まるわけだが、
1つ目の式はベクトルの長さとコサイン値、
2つ目の式はベクトルの成分が必要になる。
ベクトルの成分というのは要するに座標であり、
ゲームプログラムでは必ず保持している情報だ。
つまり、2つ目の式ならいつでも計算できる。
それに対して角度がわからない状況では1つ目の式は使えない。
しかし の計算で求めた内積は
と同じ値なわけだから、角度がわからなくても
「 の長さ」と「 の長さ」と「コサインθ」を
掛け合わせた値を求めることができるということだ。
しかし3つの値を掛け合わせた計算結果から
ひとつの要素だけを取り出すことはできない。
の合計が だと計算するのは簡単だが、
という値から や という値を導き出すのは無理だろう。
つまり の合計がわかっても
そこから角度 を取り出すことはできない。
すべての原因は3つの要素が混ざっているためだ。
そこで と を にすることを考える。
ベクトルの向きを変えずに
長さを1にすることを「正規化(せいきか)」と呼ぶが、
ベクトル成分を長さで割るだけで実現できる。
を正規化したものは と表現する。
内積を求める式は
だったので、 と の内積は
となるはずだが、正規化しているため や は なので、
となる。
つまり、内積を計算する前に2本のベクトルを正規化しておけば
内積=コサイン値になるわけだ。
角度からコサイン値を求める場合はコサイン関数を使うが、
コサイン値から角度を求める場合は
コサインの逆関数であるアークコサインを使う。
これが内積を使って角度を割り出す仕組みだ。
実際のプログラムではベクトルの正規化も内積の計算も
アークコサインも専用の関数が用意されているので、
自分で計算する必要はまずない。
内積を使って角度を求める仕組みさえわかれば
あとは自分が欲しい角度を挟む2本のベクトルを
きちんと見出せるかどうかにかかっている。
敵が攻撃する角度、旋回する方向、画面に表示する方角など
3Dゲームを構成するあらゆる場面で内積が役に立つし、
早めに理解して苦手意識をなくした方が武器になる。
私の中学のバスケットボール部は
ウォーミングアップのランニングのときに
謎の掛け声をする慣習があった。
キャプテンが「イ~チ、ニ~、イチ、ニ、」と呼びかけると
後ろの部員全員が「ワッショイ!!」と両腕を上げて応じるのだ。
最初に見たときは「バスケ部は変なことやってるなー」と思ったが、
走りながら声を出して両腕まで上げるのはかなりキツそうだったので、
トレーニングという意味では一定の効果があったのかもしれない。