出張。帰着。ふぅ。
帰りに寄った本屋で「OpenGL プログラミングガイド」いわゆる
「赤本」をゲットできました。パラパラと眺めた感じでは、
基本的な事から細かく書かれているようなので、つまんで読んで
も良いという感じ。値段が高いというのだけが痛いところ
なのですが(^^; 因みに、我が家では「ヘネパタ」「GAME PROGRAMING Gems」
が一番高価な本なのですが、それと同列で今回の赤本が並ぶと
いう感じ。前者ニ冊は本棚の肥やしと化していますが(^^;;;;
何気にHairMakerでのPOV出力はベジェ曲線を直線近似してcylinder文で
オブジェクトを表現しているのですが、cylinderだとだんだん細くなる
というような表現ができません。そこで他にプリミティブが無いかと
探してみたら、 sphere_sweepなるプリミティブがある事を発見しました。
どうやら、制御点を球で指定してそれを直線や曲線で繋ぐ事ができる
らしいです。ベジェ曲線指定は無さそうで代わりに
cubic_splineというのがそれになりそう。イマイチ、ベジェとcubic_spline
の関係がよくわかっていないのですが、記述がシンプルになるので、
パース時間の短縮が図れるのは確実。あとはレンダリング時間も
軽くなれば採用って感じかも。
そんな感じでPOV出力を書き換えてみたのですが、期待した結果と
違ったものになりました。POV-Rayの日本語訳のマニュアルを眺めてみると、
cubic_splineは始点と終点の方向を制御できるというような事が
書かれていたので、それってベジェ曲線と同じ事?と思ったのですが、
どうも ベジェ曲線とcubic_splineは別物なんじゃ?と思い、Webを検索して、
このような参考ページで理解してみたり。むぅ、
cubic_splineって微妙。
因みに、ベジェ曲線の直線近似をそのまま
linear_spline(直線なんだか曲線なんだか意味不明なパラメータ
だなぁと思ったのは私だけ?(^^;)を使って直線で繋いでみたのですが、
レンダリングが激重で使い物になりそうにないという結論に達しました。
結果的にはcylinderの接続点に球を置くのと同じ結果になるのですが、
世の中うまくいかないものです。
因みに、sphere_sweepプリミティブはVersion 3.5で追加されたもの
らしいという事も判りました。POVの参考書で球を大量に使って
スプリングを表現するという例があったので、そういう事を
しないと曲線を表現する事はできないのだと思い込んでいました。
そんな感じで、更にぐるぐるしていると、POV-Rayのマクロを使用してベジェ曲線を
cylinderを使ったオブジェクト群に展開してを表現するという方法があるというのを
見つけてみたり。cylinder文を直接出している今のHairMakerと
同じ結果になるのですが、マクロを使用する方がファイルサイズ
が小さくて済むというメリットがあるので、このページでのやり方を
参考に、マクロを使ったファイルを出力する方法に変更してみました。
出張。
出張。
出張。
出張。
出張。
昼頃起床。筋肉痛っぽい予感。年かも(-.-;
ふと、「GLUIのメニュー描画はどうやっているのだろう?」と思い、
GLUIのソースを眺めてみました。どうやら、GLUTの2D系描画を
使って実現している様で、考え方の基本は X-Windowシステムのように、
LowレベルライブラリであるXlibを介してツールキットを実現するような
イメージらしいです。従って、GLUTでもってプラットフォーム互換を
実現しているというのが実体という事みたいです。
うーん、本意では無いのですが、ツールキットを作るしかないの
かしら......
GLUIのコードを眺めてみたり。なんとなく掴んだようなそうでないような。
折角GLUTを使って実現しているのなら、3Dを利用した視覚効果を入れるのも
面白いかも.....などと無謀な事を考えてみたり。
そんな感じで明日から出張です。
昼頃起床。すっかり生活習慣が戻ってます(汗;
ナースのお仕事の再放送とか見ながらぐうたら過ごしたり、
先週買った攻殻13を観たり。因みに攻殻の方は先月の発売だったの
ですが、いつも買っているCD屋で、何故か二週に渡って置いていなかった為、
やっと先週買えたという感じだったのです。で、鑑賞。25話のタチコマ
の活躍に思わず泣いてしまいました。最後は綺麗にまとまったという感じ。
そういや、この「攻殻機動隊 STAND ALONE COMPLEX」ですが、地上波でも
放送されているらしいですね。それよりも、新シリーズ2nd GIG の方が
三月からDVD発売になっているようで、そちらの方が楽しみだったり。
懐が痛いところがたまに傷ですが(^^;
HairMakerでPOV出力などの各種色パラメータなどを設定するのに、
3D系ソフトのパレット操作に見られるような、シェーディングされた
球をピクセルマップで貼りたいと思ったのですが、GLUIでそれを実現
する方法が無さそうなので悩んでみたり。
「こんなハズでは」などを見ながら過ごしたり。1600万円のフィギュア
にスゲーとか思ったり。「ギャラリーフェイク」というマンガで
日本のアニメやフィギュアのサブカルがアートになるという物語がありました
が、冗談でなく、実際にそういう展開が広がっているというのに驚きました。
また、現在の小学生だかの「なりたい職業」にフィギュアの原型師というのが
高い位置に入っているのに驚き。
そういや以前、何かのTV番組でアイドルフィギュアとかその手の
ジャンルのフィギュアを、月に三体だか作れば食っていけるというのを
聞いた事がありますが、その話の前に、一体作るのに三週間かかる
という話をしていて、「それぁ結果として食っていけないという意味?」
と思ったりした記憶があります。現在はどうなのか判りませんが。
いつもなら全然余裕の時間なのに、やっぱり眠くて死亡。
出張。帰着。ふぅ。
今回の出張期間中、恐ろしく健康的な生活習慣になっていたので、
眠くて死亡。
出張。
出張。
出張。
出張。帰着。ふぅ。
新横浜駅に降りるとムチャクチャ寒かったです。
バタバタと明日の出張準備をしていると何もできず。
Wings3Dの0.98.19が出たらしい。
そんな感じで明日から再び出張です。
昼頃起床。
先日設置したHairMakerのページを眺めて間違っている所とか微妙に修正して
みたり(^^;。
ちょこーりお出かけ。ゲーセンで「OutRun 2」を眺めてみたり。
ドライブゲームっぽい感じになっているようですが、画面は意外と
地味に感じました。
Cygwinのスナップショット(cygwin-snapshot-20040114-1)をビルドしてみたり。
ユーティリティのビルドでずっこけるのはいつもの事ですがcygwin1.dllは一応できてみたり。
やっとの事で、プロセス終了時に赤○白×が出ない様になってました。
でも、forkとmallocの不具合は相変わらず直っていないので、
forkとmalloc(正確にはmmap)のパッチを当ててビルド終了。
HairMakerの具体的な操作例でスナップショットを取ろうと作業していたら
バグ発覚(T_T)。POV出力がバグってましたのでVer0.01を置きました。
すまそ。
JR東日本のCMでダチョウがスキーをする奴がありますが、あれムチャクチャ
良くできてるなぁと見る度に思ってみたり。
昼過ぎ起床。
「隠し芸大会」の再放送など観ながらぐうたら過ごしてみたり。
毛プログラムいじり。グループを変更できる様にしたり、
辺の毛を生成できるようにしたり。こまごまと直して取りあえず公開
してみることにしました。いつもの怠慢によりソース提供となる上、
図の無い判りにくい説明書しかありませんが、暇な方は遊んでみてください。
因みに、トップページに新たに3DCGのコンテンツを
用意し、そこに毛プログラムは置きました。今までのPOV-Rayのコンテンツは
その下に移動しました。(そんな人は居ないと思いますが)直リンクしていると
切れてしまいます。ごめんなさい。
出張。帰着。ふぅ。
あまりの寒さに何もできずに死亡。
出張。
出張。
出張。
昼前に起床。
何度かテストレンダリングを行ないながらガイドを調節してみました。
見えるところだけで適当にごまかせないかと後ろ頭はガイド無しとか
やってみたのですが、意外と広い範囲で毛が無いと、すぐに不自然に
見えたりするものみたい(^^; という所で以下のような感じ。
一番悩ましかったのは、やっぱりレンダリングの精度でしょうか。
生成画像が小さいと、いくらアンチエリアスをONにしてもガビガビ
になってしまいます。なので、今回の画像は1280*960のサイズで
レンダリングしたものを1/4に縮小しました。最終的に毛のサイズは
0.0005、毛密度は6000で、全部で12000本程度。消費メモリはピーク
で200MBオーバーなのでうちのマシン(PentiumIII-550MHz/256MB)では、
やっぱり厳しい感じ。
プログラムの方について。セーブ/ロードファイルの名前や各種
パラメータがハードコーディングされているとかそういう点は
おいといて(いいのか?)、ガイドのグループというかレイヤーと
いうか、それを分けて編集できる点をもう少し考慮したいところ。
現在は全ガイドが同じグループなので、前髪などがどうしても均等に
揃ってしまいます。
あと、増毛について。現在は三角ポリゴンの全ての頂点にガイドが
存在した場合しか補完していません。これだとマツ毛の様にポリゴン
の辺に生やしたいというのができないので、ここは押さえておきたい
所。
レンダリング途中に本屋に。OpenGLの赤本という奴を探してみた
のですが見当たらず。 しかたなく、
「ゲームボーイ・アドバンス プログラミングバイブル」という
一部で話題の本と、「ゲーム開発のための物理シミュレーション入門」
というのを買ってみました。「GBA」の方を斜め読みしてみたのですが、
これは実際にやってみないとよく判らないという感じ。それよりも、
15bitデプスのピクセルマップVRAMで構成されているという事
に驚いてみたり。
そういや、ゲーセンに寄ったのですが、プリクラに成人式帰りの
女子が大行列。成人式と言えば、ニュースで大暴れ騒動が報道されて
いました。その中でニュースキャスターが「騒動があるのは毎年恒例」
とか言ってましたが、そうなの?ここニ、三年のことかと思ってた
のに?とか思ったり。それにしても、あの騒ぎ方ってなんなのだろうね?
意味あんの?と、むしろ今の若い人の方がそう思うんじゃ....と、
思ってみたりみなかったり。
とそんな感じで明日から出張です。
昼頃起床。
毛プログラムいじり。
生成したガイドを、実際に使える様にする為に、POV形式に
形状を吐き出す方法を考えてみたり。
問題になるのは、OpenGLで描画させているベジェ曲線と同じ
結果を得られる直線近似可能なルーチンが必要という所。
そこでWeb検索をかけて、
このような参考ページを見つけてみたり。
このページにあるベジェ描画ルーチンを三次元に拡張して、
そのルーチンにOpenGLのベジェ曲線描画の入力と全く同じ
データを食わせて、分割ポイントを点で表示し、同じ結果が得られるかどうか
(ベジェルーチンで得られた分割点がOpenGL表示のベジェ曲線描画の上に
載るかどうか)を確認。
イイ感じです(^^)。
区間を切って直線近似で得られた線分を、POV-Rayの
cylinderプリミティブに置き換えて、出力できる様にしてみました。
毛の太さは0.001で指定していますが、やっぱ細過ぎて
かすれた感じになってます。
で、ガイドを元に増毛の方法を考えてみたり。ある三角ポリゴン内に
毛密度に応じた本数分ランダムに点を決定し、面積内の点の位置から
各頂点から生えるガイドの影響を足して増毛分の毛のガイドを生成
させてみるように考えてみました。
まず、ポリゴン内にランダムな点を打つのは以下の様にしてみました。
ベクトルP0→P1を0〜1.0までの乱数を使ってベクトルR1を生成します。
次にR1からP2に向かうベクトルを先ほどと同じ様に0〜1.0までの乱数
を使ってベクトルR2を生成して求まる点を使用しました。
次に各頂点のガイドを、どれだけの割合で使用するかを以下の様な
面積の割合で求めました。
例えばPCがP0に乗ったとすると、面積S2,S1は0となり、S0は全体の面積S
と同じになるので、P0の割合が1になるという感じ。
各三角形の面積は外積を利用して求めました。例えば面積S2の場合、
S2= Length((vec_P0P1 × vec_P0PC))/2
昼頃起床。
毛プログラムいじり。
毛の生える元となるポリゴンモデルの頂点を毛根として、
毛ガイドを生成したり削除したりできるようにしたり。
他、頂点からの生成ができる様になったので、毛とモデルを
別々に読み込んでいたのを、一つの独自形式ファイルとして
毛と形状をセーブ/ロードできる様にしたり。
出張。帰着。ふぅ。
毛プログラムの作りこみ。
取りあえず、表示してちょっといじる事ができるだけだったデータ構造を
増やしたり減らしたりできる様にしてみたり、選択できるようにして
みたり。
他にも、頂点移動の際にカーソル移動量と同じ移動ベクトルを
頂点移動量として加えていたのですが、これだとカーソル移動用
の仮想平面よりも手前にある頂点は大きく動き過ぎ、仮想平面
よりも奥にある頂点は小さく動いてしまいます。ベクトルray
とベクトルQの比を頂点の移動量として補正する必要がありました。
出張。
出張。
出張。
出張。
昼過ぎ頃起床。本日で連休も終了。長かったような短かったような。
制御点のサーチができるようになったので、次は制御点を動かしてみたり。
ここが実は一番簡単で、カーソル位置から3D座標系に変換する術が
すでにありますので、カーソルの移動元と移動先の二点を3D座標変換
して、その移動ベクトルがそのまま制御点の移動ベクトルになると
いう感じ。
判りにくいですが、赤いのが現在編集している毛です。
Wings3Dのtweakモードっぽくしてみました。
で、実際に使ってみると、
すげー使いにくいって
感じです(^^;;
まず、一本一本編集できるとして、実際にやると
ものすごく根気がいります。
いやまぁ、モデリングもそれなりに根気がいるのですが、
髪の毛はテンションがイマイチ上がらないといいますか。
顔や乳に比べると(<そこか....)。
最初の毛の向きがあまりにも思っているのと違う方向を向いていると、
恐ろしく手間がかかりそうです。これにはいくつか考えられる手が
あるとは思いますが、まずは現実的な雛型をどうにかして自動生成し、
気に入らないところを「しかたなく手でいじる」程度にしないと、
とてもじゃないですが、やってられない気がしました。
あと、ベジェ曲線はイマイチ制御の勝手がよろしく無い様に思いました。
恐らく、制御ポイントを通過する曲線ではないので、
線に対応付く制御ポイントがぱっと見ではすぐ判らないという
のが原因の様に思います。スプラインが使えれば置きかえる所
なのですが、OpenGLでの出し方が良く判らないので保留。
GLUTだけだと、流石に色々なメニューを追加するのが難しい気が
してきたので、GLUIを使用してみることにしました。ずっと前
にダウンロードしたGLUIのソース内に含まれるexampleから、
何もしないウインドを出すだけのコードを数行加えたのですが、
全くコンパイルが通らず。以前のソースもコンパイルが通らなく
なっており、謎だったのでWebを検索してみたのですが、どうやら
gcc-3.2以降のgccだと互換の問題でコンパイルやエラーに不具合が
ある模様。仕方無いので、glui-2.2をダウンロードしてライブラリを
ビルドし直してみました。configureの無いライブラリなので、
makefileを適当に書き換えて、exampleのコンパイルまでできたので、
glui.hを構築したばかりの2.2のものをひぱってくる様にして、
再度コンパイルしたのですが、glui.hでエラーしまくり。不思議に
思い、gccでコンパイルしていたのをg++でコンパイルするようにすると
OKとなったので そのまま進めたのですが、今度はリンクがうまくできない。
もしやと思い、全ソースをg++で再コンパイルした所、今度は
gccではエラーしなかった所でエラーしまくり(汗; C++はよく判らない
のですが、とにかくmalloc()にしろ何にしろキャストを明示的に
行なわないとエラーするというのを初めて知りました。
エラーしない様に全部直して どうにかリンクに成功し、
なんとかGLUIが使える様になりました。ふぅ。えーと、何するん
だったけ?と思わず目的を見失ってしまいそうです。
で、GLUIを使ってやりたいと考えているのは、
毛の生成をパラメータ操作できるようにする事。
昼過ぎ頃起床。むぅ。
なんか寒くてぐんにょり過ごす。
曲線の制御点を操作する方法に悩んでみたり。
自由な視点から見た時にマウスカーソルに最も近い点を選択するという
一般的な3Dモデラーで出きる操作を実現したいと思ったのですが、
さて、どうすれば良いのかさっぱり判らず(^^;
まずマウスカーソル位置を3Dのデータ空間に変換する方法がよく判らず。
OpenGLのカメラ設定(gluPerspective())やらカメラ位置設定(gluLookAt())
等の関数の説明書を探して、投影イメージを作図しながら確認してみた所、
次の様にするのが良い感じでした。
図でいう所のeye-point(視点)とcenter-point(注目点)はgluLookAt()関数で
指定するパラメータです。fovyはy軸方向の視野(field of view)角度で、
gluPerspective()で指定します。
実際に描画されるスクリーンの高さscreen-heightとの対応は図の通り
になっていて、このscreen-heightと対応付く三次元の実座標を
eye-point,center-point,fovyから求めるという事になります。
超簡単化の為にeye-pointはZ軸方向のみの移動とし(0,0,viewz)、
center-pointは(0,0,0)の原点を見るとします。表示されるウインド
の幅と高さをそれぞれwindow_w,window_hとした時、マウスカーソル (x,y)
から 三次元座標(X,Y,0)を求めるには、
X = viewz*tan(fovy/2)/(window_h/2) * (x-(window_w/2)) Y =-viewz*tan(fovy/2)/(window_h/2) * (y-(window_h/2))
leng_Q = (vec_P . vec_ray) / leng_ray vec_Q = leng_Q * normal_ray
昼頃起床。そろそろ体内時計を戻し始めないと厳しいな(^^;
OpenGLでbezier曲線を大量表示させてみたり。
曲線を記述した簡単なフォーマットをファイル入力として表示するだけ(^^;
ファイルの生成は先日作った放射状に毛を生成する
perlスクリプトを少し変形して行なってみました。
たぼさんち
の03/12/29の雑記で説明されている(どうもありがとうございます)
曲線の参考資料を読んでいて、先日、謎だったknotsというのが三次曲線に
おける基底行列と呼ばれているものなのでは?と思ったのですが、
AdvancedRenderManのNURBSの説明では「基底行列に似た働きを持つ」と
書かれているので違うものらしい。
そんな感じで頭部モデルと合わせて表示させてみたり。
OpenGLを使用したプログラムが実際に行なっているのは先に書いた
bezier曲線のフォーマットファイルの表示と頭部モデル(3ds形式)の表示のみ。
実際にbezierファイル生成の元になったのは表示に使用している
頭部モデルをPOV形式にして、そこからperlでPOVファイルのパースと
bezierファイルの生成を行なっています。
今回の絵では各頂点の法線をnormal_indices文より取り出して、
各頂点に毛を生成してみました。式としては
「(頂点座標)+(頂点法線)*(スケール)」で、スケールを0,1,2,3
倍した4点をbezierの各制御ポイントにしたという感じ。
式そのままだと真っ直ぐな毛を生成する事になりますので、
スケールが大きくなる、つまり毛の先端方向にいくにつれ、
y座標を適当な係数で引いて重力方向に垂れている様に見せて
います。
で、実際の所、一律に自動生成したのでは思い通りになる事は
まずあり得ません(うまくいく唯一の例はモヒカンくらいのものでしょう)。
bezierを編集できれば良いのですが、そこはまだ未知の領域なので
これから考える必要があります(^^;
所で、各頂点を毛根としたガイドに沿わせて面の毛を補完する
場合、いくつかの細工が必要だと思われます。まずはガイド
のグルーピングができる様にする。例えば七三分けとかにする
場合、七領域と三領域の境界部分は、中間ではなくどちらかに
丸めないと、ぴたっと分けるような髪型の生成が無理なように
思います。次にガイドはグループ内で制御点数をそろえる。
毛根面は頂点補完で密度を定義できると思いますが、毛先の
方は、どの点を補完に使用して毛先座標を決定するかが
重要になると思われます。この時、恐らく毛根面を
なす頂点から生えるガイドがやはり毛先まで有効になると思われる
のですが、ガイドの制御点数が変わるとえらく大変な事に
なりそうな予感がします。と、こんな所でしょうか。
因みに、ポリゴンメッシュをガイドにして面に沿わせる形で
毛を生成するアプローチがあると思いますが、これも三角
分割したポリゴンだと偉く面倒になると思われます。
ガイドに必要な情報としては短冊の短い辺に平行な折り目を
付けた時の、折り目の両端座標と折り目の順番(つまり毛先の方向)
が必要になるのではないかと思います。
ただ、辺の順番を指定するというのはモデラの内部情報に
そのような属性を持っていないと不可能だと思われます
(最悪「辺」のマテリアルを等高線のごとく変えるとかすれば
別かも知れませんが)。
テクスチャマップを使用して髪の毛の表現を行なうのは一つの
手段として確立されており、それと同じノリで テクスチャを作成する様に
簡単にガイドに利用できそうと錯覚してしまいそうですが、
現実には UVマップを作成した時に製作者の脳が毛先の方向を認識しているので、
すぐにできてしまうだけであって、自動生成のガイドに
使うには実際のところ簡単ではないような気がします。
あ、UVマップに対してベクタデータで髪の毛を持ち、それを
マッピングで貼りつけるというのはアリかも知れません。
ども、あけましておめでとうございます。今年もよろしくお願いしますm(_'_)m
という定型挨拶はそこそこに、OpenGLで曲線/曲面を描画する方法を
探ってみたり(正月早々そんなネタですか)。
所がこれが、意外と見つからない。もっとline描画のノリで簡単に描ける
のかと思ったのですが、どうもそんな感じでは無さそう。色々探して、
gluNurbsCurve()や、gluNurbsSurface()といった関数がキーになりそう
なので、取りあえずオンラインマニュアル(OpenGL系関数はCygwinのmanコマンドでちゃんと
見られる様になってます)を眺めてみたり。
あやや大脱出を観ながら、gluNurbsCurve()と格闘。Webで見つけた
gluNurbsSurface()のソースを適当にいじっていたのですが、
何故か描画されず、悩んでみたり。色々いじった結果、
頂点の数や、knotsと呼ばれる制御点?の数とその内容がぴったり
合っていないと線が出ないという事が判りました。うんむぅ。
knotsが何なのかがオンラインマニュアルでもよく判らなくて謎。
このknotsの内容を変えるとBezierになったりB-splineになったり
する模様。
これらを踏まえてAdvancedRenderManを眺めてみると、その説明が
ありました。ノットベクトル(knot vector)が
曲線の特徴付けを行なうためのパラメータである事はなんとなく
判ったのですが、単調増加する数列であるという以上の具体的な
作用というか例は無く、どういう値を入れるとどうなるのかが
イマイチよく判らず。結局、