SSブログ

アスペクト比について考える gluPerspective glFrustum 縦・横 [Androidアプリ開発]

Androidでのアスペクト比

アスペクト比というのは、縦横の比率のこと。ディスプレイ画面でアスペクト比といったら、16:9とか、4:3とかのこと。
1920x1080のHDなら、アスペクト比は1.777くらい。

テレビやPCのディスプレイだと横長の状態で使うことが多いので、アスペクト比が変わることはない。
Android端末だと、ランドスケープ、ポートレイトを切り替えることができる。つまり、端末向きによってアスペクト比が変わってしまう。

ランドスケープなら、1920x1080で1.777...だが、ポートレイトだと1080x1920になり、アスペクト比は、0.5625になる。
アスペクト比は、1.0より大きいと横長になり、1.0より小さいと縦長になる。

5-14 ポートレイトとランドスケープ.png

だから何?

という感じだが、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



サイト内を検索

タグ:OpenGL Android
nice!(1)  コメント(0) 
共通テーマ:携帯コンテンツ

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。



Copyright Atsushi Asai Google+朝井淳
[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)

イラストで理解 SQL はじめて入門

イラストで理解 SQL はじめて入門

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2019/05/16
  • メディア: 単行本(ソフトカバー)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/03/03
  • メディア: 単行本(ソフトカバー)

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/05/25
  • メディア: 大型本

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。