アスペクト比について考える gluPerspective glFrustum 縦・横 [Androidアプリ開発]
Androidでのアスペクト比
アスペクト比というのは、縦横の比率のこと。ディスプレイ画面でアスペクト比といったら、16:9とか、4:3とかのこと。
1920x1080のHDなら、アスペクト比は1.777くらい。
テレビやPCのディスプレイだと横長の状態で使うことが多いので、アスペクト比が変わることはない。
Android端末だと、ランドスケープ、ポートレイトを切り替えることができる。つまり、端末向きによってアスペクト比が変わってしまう。
ランドスケープなら、1920x1080で1.777...だが、ポートレイトだと1080x1920になり、アスペクト比は、0.5625になる。
アスペクト比は、1.0より大きいと横長になり、1.0より小さいと縦長になる。
だから何?
という感じだが、OpenGLでビューポートを設定するときに困ったことになる。OpenGLでビューポートを決定するのは、glViewportである。ここは問題ない。画面いっぱいに表示するのなら、ランドスケープなら、glViewport(0,0,1920,1080)で、ポートレイトなら、glViewport(0,0,1080,1920)として指定すればOK。
ビューポートを設定したら、フラスタムというのを設定しなければならない。これには、gluPerspectiveを使うと簡単。
gluPerspectiveには、アスペクト比を入れてやる必要がある。アスペクト比は「横の長さ/縦の長さ」で計算できるので、そのままwidth/heightで計算すればOKなのだが...
実際にやってみると、それなりに表示はされる。しかし、なんかおかしい。
どうしてなのか不思議に思っていたが、どうも、gluPerspectiveでは、横長のモニタで使用されることしか頭にないらしい。
gluPerspectiveでは、z-nearの値とカメラアングルからtanを使ってyの大きさを計算している。さらにyの大きさにアスペクト比をかけて、xの大きさを計算している。
ランドスケープなら、これで問題ないが、ポートレイトにすると、なんかおかしい。ポートレイトの場合、アスペクト比が1.0より小さくなる。先に、xの値を先に決めて、yをアスペクト比から決めてやったらイイ感じになった(しかし、画面サイズを変えるとアスペクト比は変わらないものの、カメラの視野角が変わってしまう感じ)。
gluPerspectiveは、ユーティリティであり、一般的なディスプレイのことしか考えてない。なので、ちゃんとglFrustumを使えっていうことなんだな。きっと。
というか、gluPerspectiveの引数をよくみると、次のようになっていた。
gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar)
fovyとなっている。ここにカメラの視野角を入れてやるわけだが、yとなっている。fovyは、Field Of View Yの略っぽい。なので、Y軸方向の視野角を入れなさい。ということか。
ランドスケープとポートレイトで、xとy軸が入れ替わるので、視野角にしたって大きく変わるよなぁ。
そもそも、xとyは画面サイズに合わせる必要があるにしても、透視投影のスクリーンのZ軸方向の位置って、画面サイズが変わってもそのままでOKなんじゃないのか...無理に再設定しなくても...
ちょっと調べたところ、以下のサイトに詳しく書いてあった。
http://www.wakayama-u.ac.jp/~tokoi/opengl/faq.html
ここで、NEARとFOVY、ASPECT、WIDTH、HEIGHTは、変化することが無いパラメータ。WIDTHとHEIGHTそれにASPECTは、ディスプレイのサイズ(ランドスケープの状態)で固定で良いかな。FOVYはカメラの視野角なので、50度くらいでよいでしょう。
NEARとFARは、今まで通りでよいか。NEARの値があまりに小さいと精度的に問題があるかも。
引数のwとhは、表示する画面のサイズ。ポートレイトとランドスケープで変化する。
後で、AREarthroidでやってみることにしよう。
関連記事
Androidアプリ開発 OpenGL 視点を変える gluLookAt
OpenGLの記事を最初から読みたいなら、以下からどうぞ。
Androidアプリ開発 OpenGLを使う GLSurfaceView
サイト内を検索
アスペクト比というのは、縦横の比率のこと。ディスプレイ画面でアスペクト比といったら、16:9とか、4:3とかのこと。
1920x1080のHDなら、アスペクト比は1.777くらい。
テレビやPCのディスプレイだと横長の状態で使うことが多いので、アスペクト比が変わることはない。
Android端末だと、ランドスケープ、ポートレイトを切り替えることができる。つまり、端末向きによってアスペクト比が変わってしまう。
ランドスケープなら、1920x1080で1.777...だが、ポートレイトだと1080x1920になり、アスペクト比は、0.5625になる。
アスペクト比は、1.0より大きいと横長になり、1.0より小さいと縦長になる。
だから何?
という感じだが、OpenGLでビューポートを設定するときに困ったことになる。OpenGLでビューポートを決定するのは、glViewportである。ここは問題ない。画面いっぱいに表示するのなら、ランドスケープなら、glViewport(0,0,1920,1080)で、ポートレイトなら、glViewport(0,0,1080,1920)として指定すればOK。
ビューポートを設定したら、フラスタムというのを設定しなければならない。これには、gluPerspectiveを使うと簡単。
gluPerspectiveには、アスペクト比を入れてやる必要がある。アスペクト比は「横の長さ/縦の長さ」で計算できるので、そのままwidth/heightで計算すればOKなのだが...
実際にやってみると、それなりに表示はされる。しかし、なんかおかしい。
どうしてなのか不思議に思っていたが、どうも、gluPerspectiveでは、横長のモニタで使用されることしか頭にないらしい。
gluPerspectiveでは、z-nearの値とカメラアングルからtanを使ってyの大きさを計算している。さらにyの大きさにアスペクト比をかけて、xの大きさを計算している。
ランドスケープなら、これで問題ないが、ポートレイトにすると、なんかおかしい。ポートレイトの場合、アスペクト比が1.0より小さくなる。先に、xの値を先に決めて、yをアスペクト比から決めてやったらイイ感じになった(しかし、画面サイズを変えるとアスペクト比は変わらないものの、カメラの視野角が変わってしまう感じ)。
gluPerspectiveは、ユーティリティであり、一般的なディスプレイのことしか考えてない。なので、ちゃんとglFrustumを使えっていうことなんだな。きっと。
というか、gluPerspectiveの引数をよくみると、次のようになっていた。
gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar)
fovyとなっている。ここにカメラの視野角を入れてやるわけだが、yとなっている。fovyは、Field Of View Yの略っぽい。なので、Y軸方向の視野角を入れなさい。ということか。
ランドスケープとポートレイトで、xとy軸が入れ替わるので、視野角にしたって大きく変わるよなぁ。
そもそも、xとyは画面サイズに合わせる必要があるにしても、透視投影のスクリーンのZ軸方向の位置って、画面サイズが変わってもそのままでOKなんじゃないのか...無理に再設定しなくても...
ちょっと調べたところ、以下のサイトに詳しく書いてあった。
http://www.wakayama-u.ac.jp/~tokoi/opengl/faq.html
void resize(int w, int h) { double scale = NEAR * tan(toRadians(FOVY * 0.5)); double x = w * scale * ASPECT / WIDTH; double y = h * scale / HEIGHT; glFrustum(-x, x, -y, y, NEAR, FAR); }
ここで、NEARとFOVY、ASPECT、WIDTH、HEIGHTは、変化することが無いパラメータ。WIDTHとHEIGHTそれにASPECTは、ディスプレイのサイズ(ランドスケープの状態)で固定で良いかな。FOVYはカメラの視野角なので、50度くらいでよいでしょう。
NEARとFARは、今まで通りでよいか。NEARの値があまりに小さいと精度的に問題があるかも。
引数のwとhは、表示する画面のサイズ。ポートレイトとランドスケープで変化する。
後で、AREarthroidでやってみることにしよう。
関連記事
Androidアプリ開発 OpenGL 視点を変える gluLookAt
OpenGLの記事を最初から読みたいなら、以下からどうぞ。
Androidアプリ開発 OpenGLを使う GLSurfaceView
サイト内を検索
Copyright Atsushi Asai Google+朝井淳
[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2015/03/03
- メディア: 単行本(ソフトカバー)
Access クエリ 徹底活用ガイド ~仕事の現場で即使える
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2018/05/25
- メディア: 大型本
コメント 0