SSブログ

ポリゴンレンダラ - その1 [プログラミング]

こないだの光線追跡をObjective-Cに移植する作業はそれなりに進んでいる。Mathematicaが元々持っているいろんな機能、例えばベクトル演算や方程式の数値解を求めたり、といったものをObjective-Cで実装しないといけないのがやっぱりかなりの手間。でもそれはこう言う数値計算をやるアプリを作るときは避けて通れないので地道にやるだけ。それにそういったところはこれまでにもいろいろ作ってきたので0からやる、という必要はない。

なんだけど、またちょっと思いついたことがあって違うものを始める。

何かというと、なるべく効率よく3次元のポリゴンを2次元に落としてウィンドウ内に描画する、いうもの。当然Cocoa/Objective-Cを使ってMacで動作するものを作る。

そんなの、OpenGLを使えばいいじゃん、と言われるだろうけど、ピクセル単位のレンダリングではなく、PDFベースの描画でそれをやりたい。なんでそんなことをするのか、というと3次元データの可視化が目的。ようするにフォトリアリスティックなレンダリングではなくてぱっとみて3次元の形がわかるようなものを作りたい。それを実際になにに使うか、はできあがってから説明する。アイデアをパクられると困る、なんてね。

どういうのを目標にするか、というと
  1. 3次元のモデリングデータを、与えられた視点からの透視投影で2次元に変換する
  2. それをベクタイメージとして描画する(解像度に依存しない)
  3. 面の色や照明は考慮する(ただし簡単に)
  4. 半透明のポリゴンを許す
  5. フラットシェーディングを使うことにして補間しない
  6. 表面テクスチャのマッピングはしない
  7. 輪郭線を入れられる
というようなもの。とくに7番目が最大の特徴。つまり形状がわかる、というのがもっとも重要で、現実をもっともらしく再現するというのが目的ではない。ざっくりと言えばMathematicaのGraphics3Dの機能の一部を取り出したようなものを作りたい(MathematicaのGraphics3Dに輪郭線を入れる機能はないけど)。

なら、Mathematicaを使えばいいじゃん、と言われるだろうけど、ええい、もういちいちうるさいんだよ。いいんだよ、作りたいんだから、それでいいじゃん。それに最終的な目標であるこれを使ってなにをやりたいか、というのをMathematicaでは実現するのは不可能ではないにしても、かなり面倒で、独立したアプリにするほうがずっと簡単のはず。まあ、最終的な目標なんて大袈裟なことを言うけど、僕の作るものは何かの役に立つ、とか言うのではなくて所詮お遊びのおもちゃではあるんだけど。

ということで、あまり高機能なものを目指さずに、目的が達成できるレベルのものをさくっ、と実装したい。

2  座標系

まず、おおまかなところをまとめておく。最初に座標系。

3次元の座標系は右手系をとる。別にどっちでもいいんだけどOpenGLと同じにしよう。これが普通だし。モデリングデータはこの座標系で書かれていると考える。

ここに図-1のように、視点位置(viewPoint)と視野中心(viewCenter)を考える。これはviewPointの位置に目があって、viewCenterを視野の中心にして眺めている、ということにする。これを基準に3次元のモデルをどう2次元に射影するか、を決める。

0307fig01.png
射影のパラメータとして、画角単位(unitViewAngle)と縦方向ベクトル(viewVertical)を考える。unitViewAngleは視線に垂直な方向の角度が2次元のどのくらいの長さに対応するか、を表す。普通は画角(viewAngle)が使われるんだろうけど、その場合例えば2次元の表示領域の大きさを変えるとそれに比例して3次元のモデルの大きさが変わってしまう。今回の場合、表示領域の大きさを変えると、見える範囲が変わるようにしたい。ということで、unitViewAngleの値をパラメータとして考えることにする。

また、viewVerticalは3次元のどの方向を2次元の上方向に対応させるか、というのを指定する。このベクトルが視線の方向(viewPointからviewCenterへの方向)と一致しないかぎり、このベクトルの2次元への投影が表示の上方向になるようにする。

このあたりはMathematicaのGraphics3Dの概念を多く借用させてもらった。MathematicaやOpenGLのような、中間的な座標系は使わないことにする。モデルを表示の領域いっぱいに描画する、といった親切が中間座標を使えばできるが、今回はそれはやめにする。したがってはじめからモデルデータは表示のことを考えて作られている必要がある。
nice!(0)  コメント(2)  トラックバック(0) 

nice! 0

コメント 2

jun hirabayashi

 ゴールは(何の根拠も無く予想するなら)「不可能物体・錯視物体作成エディタ」あたりでしょうか?…それにつけても、面白そうですね。
by jun hirabayashi (2013-03-17 20:10) 

decafish

コメントありがとうございます。
おほほほほほほ、最終的な目的は内緒です。楽しみしていて下さい。できあがったものを見てがっかりされると困りますが。

でも、ご指摘いただいた「不可能物体・錯視物体作成エディタ」全然考えていませんでしたが、そう言うのができると面白いです。汎用のエディタはかなり難しそうですが、そのアイデアいただきっ、ということで。
by decafish (2013-03-17 21:14) 

コメントを書く

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

トラックバック 0

献立03/14献立03/15 ブログトップ

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