three.jsでglFrustum

three.jsでは、射影行列(ProjectionMatrix)がTHREE.Cameraとして抽象化されており、透視投影であるTHREE.PerspectiveCameraと、平行投影であるTHREE.OrthographicCameraの2つが標準で用意されています。一方、OpenGL*1には透視投影の射影行列APIとしてglFrustumとgluPerspectiveが用意されています。

PerspectiveCameraはユーザにとって直感的なので通常こちらを使えばよいのですが、今回glFrustumなインターフェースを使いたかったので、どうやれば実現できるのか調べました。

結論から言えば、THREE.MatrixクラスにmakeFrustumというメソッドがあるので直接これを叩くことで実現できます。

camera = new THREE.Camera();
camera.projectionMatrix.makeFrustum(left, right, bottom, top, near, far);

しょうがないので、FrustumCameraクラスを作るかと思い、PerspectiveCameraを参考にして書いていたら、makeFrustumを呼び出している部分を見つけて、それを使えば簡単に対処できることが判明した次第です。

*1:3.xからは行列関係のAPIは全てdeprecated