ことれいのもり

視錐台のNear/Far面の高さにtanを使って計算する理由を分かりやすく解説

はじめに

OpenSiv3Dなどの3Dエンジンで視錐台を描画するとき、以下のようなコードがあります。


double nearHeight = 2.0 * Math::Tan(fovDegree / 2.0) * nearClip;

この数式は、視錐台のNear面やFar面の「高さ」を計算するために使われます。

しかし、この式の意味をしっかり理解している人は、意外と少ないかもしれません。

この記事では、「なぜtanが使われるのか?」「どの三角形を表しているのか?」を図を使って丁寧に解説します。

Near面・Far面とは?

まずは、Near面・Far面がどこにあるかを確認しましょう。

Near面とは、カメラの見え始める距離のことです。

一方、Far面とは見えなくなる限界の距離のことです。

Near面~Far面の間にあるものをカメラは描画します。


図で見てみましょう。


視錐台のNear面・Far面


手前の赤い面がNear面、青い面がFar面です。

このうち、Near面の高さが今回求めたい「nearHeight」です。

1. 直角三角形を作る

nearHeightを求めるにはどうしたらいいでしょうか?

注目すべきは、直角三角形を作ることです。

カメラの位置、nearHeightの高さの半分(nearHeight/2)、カメラの位置からnear面までの距離(nearClip)で直角三角形が作れます。


Near面の直角三角形


図でいうと、黒い三角形の部分です。

ここで直角三角形ができます。

2. tanの式を作る

この三角形を横からみて考えてみましょう。


tanの式


tanの公式は、


$$ tanθ = \frac{b}{a} $$


で表せます。

同じ式をNear面で作ると、こうなります。


$$ tan(\frac{fovDegree}{2}) = \frac{\frac{nearHeight}{2}}{nearClip} $$


fovDegreeは視野角のことです。

θはちょうど視野角の半分になります。

これをnearHeightについて解いていきます。


$$ \begin{align} tan(\frac{fovDegree}{2}) &= \frac{\frac{nearHeight}{2}}{nearClip} \\ &= \frac{nearHeight}{2 * nearClip} \\ nearHeight &= tan(\frac{fovDegree}{2})*2*nearClip \end{align} $$


この式は、一番最初のコードの式と一致します。


double nearHeight = 2.0 * Math::Tan(fovDegree / 2.0) * nearClip;


これで、nearHeightの式が求まりました!

FarHeightも全く同じ手順で求めることができます。


    // Near・Far面の高さを計算する
    double nearHeight = 2.0 * Math::Tan(fovDegree / 2.0) * nearClip;
    double farHeight = 2.0 * Math::Tan(fovDegree / 2.0) * farClip;

おわりに

今回の記事では、視錐台のNear面やFar面の高さを求める式に、tanを使うのかを図と一緒に解説しました。

直角三角形をみつけることで、シンプルに導けることが分かったと思います。

なんとなく使っていた式の意味が少しでも明確になれば幸いです。