« 流浪日誌 | メイン | 夏の思い出 »

OpenGL ESで…

プラモ3体分のトップコート吹きが1缶で足りなくて、
今朝は中途半端にしか吹けなくてショックな「お」です(挨拶
新しい缶を買ってきて、明日以降に残りを吹かないと…

さて、現在、OpenGL ESで開発しているのですが、
ゲームではよくある、3Dキャラのところに2Dステータスを表示することを実現しようとしたのです。
無印OpenGLだと、gluProjectで、3D座標をスクリーン座標に変換できるのですが、
ESにはそれがありません。そこで、gluProject互換関数を自前で用意しました。
後は、3D座標と、モデルビュー行列と、射影行列と、ビューポート行列を
その関数に渡すだけとなったところで、またまた問題が…
ESでは、glGetFloatやglGetIntegerが実装されてないのです=■●_
仕方が無いので、自前でモデルビュー行列と、射影行列と、ビューポート行列を構築するようにしました…
モデルビュー行列は、gluLookAt互換関数は既に作ってあったので、そこから求めることができました。
ビューポート行列も、glViewportに渡すパラメータと同じものを単にセットしました。
さて、問題は、射影行列です。無印OpenGLなら、glFrustumを実行してから、glGetFloatすればよいのですが…
要は、glFrustumで構築される行列を作ることができればよいわけで、
ネットで調べてみたところ、glFrustumのmanページが複数見つかり、
glFrustumが内部でどんなことをやっているかが載っていました!
ところが…
最初に見つけたmanページに載っていた行列が間違っていたのです…=■●_
(分子の「2 zNear」が「2」になっていたのです…)
結局、別のmanページで、正しい行列を見つけ、無事に射影行列を取得でき、
無事、2D座標を取得することができました!
これは昨日の話です。

さて、実は、昨日実装したgluProject互換関数を使って2D座標を取得した場合、
Y座標が上下反転したり、ビューポート座標の左上が反映されていなかったりと、しっくり来ない部分があり、
そういえば、会社のOpenGLの本で、まだ見ていない本があったなぁと思い出し、
gluProject辺りをちょっと見てみようと思ったのです。
その本は、「OpenGLリファレンスマニュアル」で、ぱらぱらとめくってみますと、
なんか説明のところに、数式や行列が載っているのです…
glFrustumのところをみてみると、
昨日1日かかって手に入れた行列が、そのまま載っていました=■●_
(「OpenGLリファレンスマニュアル」はmanページの和訳っぽいので、当然といえば…)

なんともショックな「お」でした。

15:00 追記:
glViewportに渡すパラメータ自体、ケータイ画面の「左下」基準で指定していましたので、
Y座標が上下反転するのは当たり前でした…
というわけで、gluProject互換関数の処理は、多分あっているかと…

About

2008年08月20日 12:51に投稿されたエントリーのページです。

ひとつ前の投稿は「流浪日誌」です。

次の投稿は「夏の思い出」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。