OpenGL・・・ちょっと飽きてしまった。
ライティング、フォグ、テクスチャの貼り付けまで上手くいったのでここらで一旦休憩。
今日は日本語文字コードの自動判断をやってみた。
UTF-8は難しいので今回はパス。
それでも、なかなかエレガントに実装するのは無理っぽい。。
どういう事かというと、そこそこ判断出来るのだが、色々問題はあって
・「JIS」は簡単だけど、「Shift JIS」と「EUC」の文字コードが被っていて判断できない事がある。
・半角かなを使うと完全に文字コードが被る。
という事から、利用済みの文字コードの範囲だけを考えると判断に優先順位をつけてそれなりに判定するほか無い。
結論としては誤判定が起きるのも仕方ないって事ですか。残念ですが。
簡単そうだな〜と思ってたんですが、未熟な故「ポインタのポインタ渡し」でハマったので、半日で作れなかったのは残念なところです。
きっともっと短いコードで書けたんだろうな。
でも、自動判断が実装出来ちゃうと、変換は容易なので、これ以上頑張る必要は無いか。
それにしてもMacOS XのXcodeは使い勝手がイイです。
単なるC言語のソースを書くにしても、一連の「エディタで編集」→「コンパイル」→「デバッガでテスト」という作業は何も考えずにクリック一発だったりします。正直emacs/viで編集→Makefile作ってmakeという作業に戻れないかも。
他のIDEでもこういう事は出来るのですが、タダで使えちゃったりするのがイイ所です。しかもCとかJavaとか、その他ファイルも自由に扱えるせいで、肝心の「Objective-C」を習得する気が全くおきないのはアップルにとっては問題かも知れませんが。
OpenGLのライティング、上手くいきました。
・gluLookAtの後でライティングの設定を行う。
・ライティングの設定自身は視点を意識しない。
という2点でした。
それにしてもOpenGLの資料って多いようで少ないですね。本屋も行ってみたんですが、資料になりそうな本も少ないし、Webで検索しても「とりあえずやってみましょう」的なページが多くて、なかなか先に進めませんでした。
視点変更を考えてみた。
取りあえず、角度a,bを定義する。
角度a
左向き=-90度、右向き=90度
角度b
下向き=-90度、上向き=90度
OpenGLの座標系で考えると
座標x
左=-1、右=1
座標y
上=-1、下=1
座標z
奥=-1、手前=1
となる。その条件で考えると、
gluLookAtで与える座標から見る視点の先は現在座標に(x,y,z)=(sin角度a,0,-cos角度a)を足した座標を与えることで、水平方向に視点を360度回転させることは出来た。(ぐるっと見渡す感じ)
問題は、そこに上下方向への視点変更を追加した場合。上下方向への座標は(x,y,z)=(0,sin角度b,-cos角度b,0)。したがって(x,y,-z)=(sin角度a,1,-cos角度a)(1,sin角度b,cos角度b)で上下左右に自由に視点が変更出来ると、単純にそう思っていたのだが、あくまで天地はひっくり返らないという結果になってしまった。冷静に考えると、自分の存在する座標点から後ろに振り返ったとしても、天地がひっくり返る事は無いわけだから、当たり前なんだが、想像上は天地がひっくり返ると思っていたので、何となく思っていた画と違ってしまった。
自分の勘違いは明白なので、理解は出来るのですが・・・。飛行機(戦闘機)の宙返りとかを表現する場合は、天地方向がひっくり返る処理も必要という事ですね。gluLookAtで上方向の指定(0.0,1.0,0.0)を(0.0,-1.0,0.0)とすれば良いのでしょうけど。。
ま、取りあえずココまでは上手くいったと思う。
angle_xは視点角度(左右)、angle_yは視点角度(上下)、M_PIは定数π=3.14159...。として、以下の計算値で視点は求められる。
/* 視点の元になる座標点を計算 */
x_x = sin(M_PI / 180 * angle_x);
x_z = -cos(M_PI / 180 * angle_x);
y_y = sin(M_PI / 180 * angle_y);
y_z = cos(M_PI / 180 * angle_y);
x = x_x * 1.0;
y = y_y * 1.0;
z = x_z * y_z;
/* 視点変更 */
gluLookAt(look_x, look_y, look_z, look_x + x, look_y + y, look_z + z,
0.0, 1.0, 0.0);
その後、ライティングで難航。。
自分の視点にスポットライトを置いて、ライトの方角を上記の座標(x,y,z)を与えてやることで、自分がライトで照らしながらモノを見ている感じに出来ると思っていたのだが、結果ライトの方向はライティングには反映されない。
色々いじってみたんだけど、どうも上手くいかない。
昨日に引き続きOpenGLで遊んでみる。
光源設定って、滅茶苦茶難しいじゃないですか。
意図した結果になかなかなりません。
そのうえ、PowerBookG4とiBookG3でglNormal3dのベクトルが反対になる・・・。
なんだこれは?
とか言いつつ、OpenGLも勉強してみました。
でも、何年ぶりでしょうか。完全にプログラミングで遊べるのって。
非常に勉強にもなるし、またどこかで役にたつかも知れませんし。
取りあえず「GL_QUADSは、左周りで書け」と。
裏面になったときに右回りになることで、背面であることを判断するラシイので。
全部左回りで書いておくと、背面に存在する部分が右回りで描かれることを利用するという事・・・だ、そうです。確かに。でも書き順で判断するって・・・・。
何の為のZバッファなのかしら?
(ZバッファはZバッファで正常に動作しますが・・・。昔のハードがしょぼかったから、Zバッファを使わずに済ませる方法として、こういう実装になったのでしょうかね?)
・・・本当は今日の成果(ソース)を置きたいのですが、画像ファイルしかアップロード出来ないみたいなので諦めます。
次はテクスチャの貼り付けとか、ミップマップとかですか。
ビットマップ(画像)必要なら、しばらく手は出さないでしょうね。。だって絵、描けないもん。
今日はSDL+GLUT(OpenGL)で遊んでみた。
OpenGLって案外使いにくいです。
とはいえ一日触ってみて、取りあえずは3D表示は出来たみたいです。