ゲーム画面上でキャラクターを違和感なく操作するためには、マップ上で現在カメラが向いている方角を知る必要がある。
たとえばスティックが右に入力されているときは、「カメラが向いている方角」+「時計回りに90°」の向きにキャラクターが動いていれば、
画面上でもキャラクターが右に動いているように見える。
上図のようにマップの北向きを \(x\) 方向、西向きを \(y\) 方向と定義し、カメラの方向ベクトルの水平成分を \((x,y)\) で表すとき、
カメラの方角 \(\phi\) は
\[\phi=\mathrm{atan2}(y,x)\tag{1}\]
で計算できる。
しかしピクミンのゲームにおける特定の場面では、おそらく \(\phi\) の計算が間違っている。
具体的には、カメラの俯角 \(\theta\) がなぜか計算に含まれていて、
\[\phi_\mathrm{w}=\mathrm{atan2}(y\cos\theta,x)\tag{2}\]
という計算式になっているのではないかと思われる。
(式\((1)\)の \(\phi\) と区別するため \(\phi_\mathrm{w}\) とした)
\(\theta\) が0°に近いときは \(\cos\theta\) が1に近いので影響は少ないが、
\(\theta\) が大きくなるにつれ、\(\phi\) と \(\phi_\mathrm{w}\) の間のずれも大きくなっていく。
\(\theta\) は斜め視点のときはズーム段階によって20°、21°、25°と変化し、真上視点のときは60°固定である。
視点 | ズーム | 俯角 \(\theta\) | \(\cos\theta\) |
---|---|---|---|
斜め | 近 | 20° | 0.9397 |
中 | 21° | 0.9336 | |
遠 | 25° | 0.9063 | |
真上 | すべて | 60° | 0.5000 |
真上視点のときは \(\cos\theta=\) 0.5であり、
\(y\) 方向、つまり東西方向成分が半分に縮小されてしまう。
このため、スティック入力時の挙動が、全体的に南北方向に傾いてしまう。
式\((1),(2)\)から \(x,y\) を消去すると、
\[\phi_\mathrm{w}=\mathrm{atan2}(\sin\phi\cos\theta,\cos\phi)\tag{3}\]
となる。よって、スティック入力時にカメラの方角が \(\phi\) であるとき、本来向くべき角度と実際に向く角度の差 \(\Delta\phi\) は、
\[\Delta\phi=\phi-\mathrm{atan2}(\sin\phi\cos\theta,\cos\phi)\tag{4}\]
となる。
\(\phi\) はレーダー画面の方角記号の向きによって確認できる。(要きまぐれなレーダー)