昔の最近の出来事(2004.01)

2004/01/31

出張。帰着。ふぅ。

帰りに寄った本屋で「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と 同じ結果になるのですが、マクロを使用する方がファイルサイズ が小さくて済むというメリットがあるので、このページでのやり方を 参考に、マクロを使ったファイルを出力する方法に変更してみました。

2004/01/30

出張。

2004/01/29

出張。

2004/01/28

出張。

2004/01/27

出張。

2004/01/26

出張。

2004/01/25

昼頃起床。筋肉痛っぽい予感。年かも(-.-;

ふと、「GLUIのメニュー描画はどうやっているのだろう?」と思い、 GLUIのソースを眺めてみました。どうやら、GLUTの2D系描画を 使って実現している様で、考え方の基本は X-Windowシステムのように、 LowレベルライブラリであるXlibを介してツールキットを実現するような イメージらしいです。従って、GLUTでもってプラットフォーム互換を 実現しているというのが実体という事みたいです。
うーん、本意では無いのですが、ツールキットを作るしかないの かしら......

GLUIのコードを眺めてみたり。なんとなく掴んだようなそうでないような。 折角GLUTを使って実現しているのなら、3Dを利用した視覚効果を入れるのも 面白いかも.....などと無謀な事を考えてみたり。

そんな感じで明日から出張です。

2004/01/24

昼頃起床。すっかり生活習慣が戻ってます(汗;

ナースのお仕事の再放送とか見ながらぐうたら過ごしたり、 先週買った攻殻13を観たり。因みに攻殻の方は先月の発売だったの ですが、いつも買っているCD屋で、何故か二週に渡って置いていなかった為、 やっと先週買えたという感じだったのです。で、鑑賞。25話のタチコマ の活躍に思わず泣いてしまいました。最後は綺麗にまとまったという感じ。
そういや、この「攻殻機動隊 STAND ALONE COMPLEX」ですが、地上波でも 放送されているらしいですね。それよりも、新シリーズ2nd GIG の方が 三月からDVD発売になっているようで、そちらの方が楽しみだったり。 懐が痛いところがたまに傷ですが(^^;

HairMakerでPOV出力などの各種色パラメータなどを設定するのに、 3D系ソフトのパレット操作に見られるような、シェーディングされた 球をピクセルマップで貼りたいと思ったのですが、GLUIでそれを実現 する方法が無さそうなので悩んでみたり。

「こんなハズでは」などを見ながら過ごしたり。1600万円のフィギュア にスゲーとか思ったり。「ギャラリーフェイク」というマンガで 日本のアニメやフィギュアのサブカルがアートになるという物語がありました が、冗談でなく、実際にそういう展開が広がっているというのに驚きました。 また、現在の小学生だかの「なりたい職業」にフィギュアの原型師というのが 高い位置に入っているのに驚き。
そういや以前、何かのTV番組でアイドルフィギュアとかその手の ジャンルのフィギュアを、月に三体だか作れば食っていけるというのを 聞いた事がありますが、その話の前に、一体作るのに三週間かかる という話をしていて、「それぁ結果として食っていけないという意味?」 と思ったりした記憶があります。現在はどうなのか判りませんが。

いつもなら全然余裕の時間なのに、やっぱり眠くて死亡。

2004/01/23

出張。帰着。ふぅ。

今回の出張期間中、恐ろしく健康的な生活習慣になっていたので、 眠くて死亡。

2004/01/22

出張。

2004/01/21

出張。

2004/01/20

出張。

2004/01/19

出張。帰着。ふぅ。

新横浜駅に降りるとムチャクチャ寒かったです。

バタバタと明日の出張準備をしていると何もできず。
Wings3Dの0.98.19が出たらしい。

そんな感じで明日から再び出張です。

2004/01/18

昼頃起床。

先日設置したHairMakerのページを眺めて間違っている所とか微妙に修正して みたり(^^;。

ちょこーりお出かけ。ゲーセンで「OutRun 2」を眺めてみたり。 ドライブゲームっぽい感じになっているようですが、画面は意外と 地味に感じました。

Cygwinのスナップショット(cygwin-snapshot-20040114-1)をビルドしてみたり。 ユーティリティのビルドでずっこけるのはいつもの事ですがcygwin1.dllは一応できてみたり。 やっとの事で、プロセス終了時に赤○白×が出ない様になってました。 でも、forkとmallocの不具合は相変わらず直っていないので、 forkとmalloc(正確にはmmap)のパッチを当ててビルド終了。

HairMakerの具体的な操作例でスナップショットを取ろうと作業していたら バグ発覚(T_T)。POV出力がバグってましたのでVer0.01を置きました。 すまそ。

JR東日本のCMでダチョウがスキーをする奴がありますが、あれムチャクチャ 良くできてるなぁと見る度に思ってみたり。

2004/01/17

昼過ぎ起床。

「隠し芸大会」の再放送など観ながらぐうたら過ごしてみたり。

毛プログラムいじり。グループを変更できる様にしたり、 辺の毛を生成できるようにしたり。こまごまと直して取りあえず公開 してみることにしました。いつもの怠慢によりソース提供となる上、 図の無い判りにくい説明書しかありませんが、暇な方は遊んでみてください。 因みに、トップページに新たに3DCGのコンテンツを 用意し、そこに毛プログラムは置きました。今までのPOV-Rayのコンテンツは その下に移動しました。(そんな人は居ないと思いますが)直リンクしていると 切れてしまいます。ごめんなさい。

2004/01/16

出張。帰着。ふぅ。

あまりの寒さに何もできずに死亡。

2004/01/15

出張。

2004/01/14

出張。

2004/01/13

出張。

2004/01/12

昼前に起床。

何度かテストレンダリングを行ないながらガイドを調節してみました。 見えるところだけで適当にごまかせないかと後ろ頭はガイド無しとか やってみたのですが、意外と広い範囲で毛が無いと、すぐに不自然に 見えたりするものみたい(^^; という所で以下のような感じ。

[元の毛ガイド] [その1] [その2]

一番悩ましかったのは、やっぱりレンダリングの精度でしょうか。 生成画像が小さいと、いくらアンチエリアスをONにしてもガビガビ になってしまいます。なので、今回の画像は1280*960のサイズで レンダリングしたものを1/4に縮小しました。最終的に毛のサイズは 0.0005、毛密度は6000で、全部で12000本程度。消費メモリはピーク で200MBオーバーなのでうちのマシン(PentiumIII-550MHz/256MB)では、 やっぱり厳しい感じ。
プログラムの方について。セーブ/ロードファイルの名前や各種 パラメータがハードコーディングされているとかそういう点は おいといて(いいのか?)、ガイドのグループというかレイヤーと いうか、それを分けて編集できる点をもう少し考慮したいところ。 現在は全ガイドが同じグループなので、前髪などがどうしても均等に 揃ってしまいます。
あと、増毛について。現在は三角ポリゴンの全ての頂点にガイドが 存在した場合しか補完していません。これだとマツ毛の様にポリゴン の辺に生やしたいというのができないので、ここは押さえておきたい 所。

レンダリング途中に本屋に。OpenGLの赤本という奴を探してみた のですが見当たらず。 しかたなく、 「ゲームボーイ・アドバンス プログラミングバイブル」という 一部で話題の本と、「ゲーム開発のための物理シミュレーション入門」 というのを買ってみました。「GBA」の方を斜め読みしてみたのですが、 これは実際にやってみないとよく判らないという感じ。それよりも、 15bitデプスのピクセルマップVRAMで構成されているという事 に驚いてみたり。

そういや、ゲーセンに寄ったのですが、プリクラに成人式帰りの 女子が大行列。成人式と言えば、ニュースで大暴れ騒動が報道されて いました。その中でニュースキャスターが「騒動があるのは毎年恒例」 とか言ってましたが、そうなの?ここニ、三年のことかと思ってた のに?とか思ったり。それにしても、あの騒ぎ方ってなんなのだろうね? 意味あんの?と、むしろ今の若い人の方がそう思うんじゃ....と、 思ってみたりみなかったり。

とそんな感じで明日から出張です。

2004/01/11

昼頃起床。

毛プログラムいじり。
生成したガイドを、実際に使える様にする為に、POV形式に 形状を吐き出す方法を考えてみたり。
問題になるのは、OpenGLで描画させているベジェ曲線と同じ 結果を得られる直線近似可能なルーチンが必要という所。 そこでWeb検索をかけて、 このような参考ページを見つけてみたり。 このページにあるベジェ描画ルーチンを三次元に拡張して、 そのルーチンにOpenGLのベジェ曲線描画の入力と全く同じ データを食わせて、分割ポイントを点で表示し、同じ結果が得られるかどうか (ベジェルーチンで得られた分割点がOpenGL表示のベジェ曲線描画の上に 載るかどうか)を確認。 イイ感じです(^^)。
区間を切って直線近似で得られた線分を、POV-Rayの cylinderプリミティブに置き換えて、出力できる様にしてみました。

[元の毛ガイド] [POVでのレンダリング]

毛の太さは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

外積の長さは各ベクトルで形成される平行四辺形の面積なので、三角形は それを2で割るだけ。
もっと良い求め方があるかも知れませんが、基本的な方法で求めてみました。

単位面積辺りの毛密度を1000にしてPOVファイルを生成し、レンダリング してみました。

[POVでのレンダリングその2]

問題はピークで200MB程度のメモリを使用しているところ。結構厳しいです。 因みに、合計960の三角ポリゴンに対して、全部で12322本の毛を生成して います。レンダリング時間はCygwin上のPOV-Ray3.5cで4m30s程度。 ただし、パースが2m30sでレンダリング時間が約2mなので、レンダリング自体 はまだまだいけるという予感。

そんな感じで実戦投入。頭部モデルを使用して髪の毛を生成するための ガイド生成。選択されたガイドを、ある代表ガイドの変更と同じ様に変更する 機能を付けているのですが、それのおかげで同時に複数本のガイドに対して 同じ変更を加えられるようになったため、一本一本調節するよりは遥かに効率的に 編集できるようになりました。 それでも、頂点の法線方向に真っ直ぐに生成されたガイドを手動で曲げて 編集という形なので、高価なCGソフトの毛プラグのように自動的に衝突判定や シミュレーションによる効率化に比べると、全然へっぽこって感じなのでしょう。 唯一の救いは、それらの高度に自動化の進んだツールを使った事が無い ので、便利さが判らない分、今のレベルでも我慢ができるという点で しょうか(^^;

2004/01/10

昼頃起床。

毛プログラムいじり。
毛の生える元となるポリゴンモデルの頂点を毛根として、 毛ガイドを生成したり削除したりできるようにしたり。 他、頂点からの生成ができる様になったので、毛とモデルを 別々に読み込んでいたのを、一つの独自形式ファイルとして 毛と形状をセーブ/ロードできる様にしたり。

2004/01/09

出張。帰着。ふぅ。

毛プログラムの作りこみ。
取りあえず、表示してちょっといじる事ができるだけだったデータ構造を 増やしたり減らしたりできる様にしてみたり、選択できるようにして みたり。
他にも、頂点移動の際にカーソル移動量と同じ移動ベクトルを 頂点移動量として加えていたのですが、これだとカーソル移動用 の仮想平面よりも手前にある頂点は大きく動き過ぎ、仮想平面 よりも奥にある頂点は小さく動いてしまいます。ベクトルray とベクトルQの比を頂点の移動量として補正する必要がありました。

2004/01/08

出張。

2004/01/07

出張。

2004/01/06

出張。

2004/01/05

出張。

2004/01/04

昼過ぎ頃起床。本日で連休も終了。長かったような短かったような。

制御点のサーチができるようになったので、次は制御点を動かしてみたり。 ここが実は一番簡単で、カーソル位置から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を使ってやりたいと考えているのは、 毛の生成をパラメータ操作できるようにする事。

  1. 毛根を頭部モデルの頂点から選択する
  2. 長さ、方向、曲率などを操作し 生え具合を調節する。ここはリアルタイム 表示でひとつ。
  3. 決定。その後、気に入らない点をいじる。

という感じ。その前に、現在の内部データ構造ではかなり 無理があるので、やりたい事に合わせてちょっと考え直さなくては ならないかも。

とは言いながらも、ガイドから実際にレンダリングに使用する プリミティブを生成する部分を考えていない為、実はそこが一番 難しかったりするんじゃなかろうか.....などとも思い始めて みたりして。

そうは言っても、今日で休みは終りなので終了。 明日から再び出張です。

2004/01/03

昼過ぎ頃起床。むぅ。

なんか寒くてぐんにょり過ごす。

曲線の制御点を操作する方法に悩んでみたり。
自由な視点から見た時にマウスカーソルに最も近い点を選択するという 一般的な3Dモデラーで出きる操作を実現したいと思ったのですが、 さて、どうすれば良いのかさっぱり判らず(^^; まずマウスカーソル位置を3Dのデータ空間に変換する方法がよく判らず。

OpenGLのカメラ設定(gluPerspective())やらカメラ位置設定(gluLookAt()) 等の関数の説明書を探して、投影イメージを作図しながら確認してみた所、 次の様にするのが良い感じでした。

[OpenGLカメラ図]

図でいう所の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))

という感じ。マウスカーソルの座標は画面に向かって下に行くほど増え ますが、OpenGLの三次元空間では逆だとか、ウインド画面の中心 がcenter-pointに対応するので、window_w,window_hを2で割った値を カーソル座標から引く、といった補正が必要です。因みに前述式の中で tan()の引数fovyはradian角として扱って いますが、gluPerspective()で指定するのはdegreeなのに注意。

次はこれまでの2Dスクリーン座標系→3D座標系への変換で求めた 3D点座標と視点(eye-point)とのなす視線ベクトルとの当たり判定 を行ない、曲線の制御点を選択する技と、選択した制御点を希望の 位置に移動する技を開発する必要があります......

何気に実際に3D系プログラムを書いてみると、イメージ的にしか判って いない事が多くて、実際にインプリメントしようとするといきなり 困るあたり、修行が足りないなぁなどと思ってしまいます。 そういや今回の図はtgif on Cygwin/XFree86で描いてみました。 以前このような図を描くのにFlashを使ったのですが、それは単に 図中に日本語が使いたかったからというだけの理由でした(^^; 所が Flashの場合、描いているうちに線がくっついてしまう のが作図をするのに不便だったので、今回はtgifを使ってみたと いうそんな感じ。でも解像度など表示の点ではFlashの方が良いかも と思ったり。

その後、制御ポイントのサーチなどを行なってみたり。 カメラ位置(eye-point)とマウスカーソルから変換した3D座標系の注目点が 得られたので、これらから視線ベクトル(ray)を求めて、この直線と の距離が近い制御点をセレクトするという感じ。
実際に制御点Pと直線rayとの距離は以下の感じで求めてみたり。

[距離を求める図]

ベクトルQを求めるのがキモだと思います。

   leng_Q = (vec_P . vec_ray) / leng_ray
   vec_Q  = leng_Q * normal_ray


ベクトルPとベクトルrayの内積を取り、ベクトルrayの長さを掛けて ベクトルQの長さを求めます (内積の公式vec_P . vec_ray = leng_P*leng_ray*cos(th) より leng_P*cos(th)について解いたというやつ)。 後はベクトルrayを正規化して長さleng_Qを掛ければベクトルQが 求められるという感じ。で、ベクトルQからベクトルPを引いた ものがベクトルdとなるので、それの長さを求めればOK。 もっとエレガントに求める方法があるのかも知れませんが、 基本的な考え方で求めてみました(^^;。
所が、ベクトルを正規化する関数や長さを求める関数を思いっきり タイプミスしてて さっぱり予定通りに動かなかったり、 軸の回転順序が表示とポイントサーチ時とで違っていて、なんだか 見当違いな点がサーチされていたりと、間違いを探すのに えらくてこずってしまったのは秘密(汗;

3Dで遊ぶ様になってからやっと判ってきたという感じなのですが、 ベクトルって道具として考えたとき、とても便利な様に感じ始め ました。内積や外積も「そういうもの」だとして使うと、 これがもう、これ無しだと何も考えられないという感じ。 同じ事をXYZ座標系で考えろと言われると、いきなり三角関数地獄に 陥るという そんな感じ。

2004/01/02

昼頃起床。そろそろ体内時計を戻し始めないと厳しいな(^^;

OpenGLでbezier曲線を大量表示させてみたり。 曲線を記述した簡単なフォーマットをファイル入力として表示するだけ(^^; ファイルの生成は先日作った放射状に毛を生成する perlスクリプトを少し変形して行なってみました。

[bezier view]

たぼさんち の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マップに対してベクタデータで髪の毛を持ち、それを マッピングで貼りつけるというのはアリかも知れません。

2004/01/01

ども、あけましておめでとうございます。今年もよろしくお願いしますm(_'_)m

という定型挨拶はそこそこに、OpenGLで曲線/曲面を描画する方法を 探ってみたり(正月早々そんなネタですか)。 所がこれが、意外と見つからない。もっとline描画のノリで簡単に描ける のかと思ったのですが、どうもそんな感じでは無さそう。色々探して、 gluNurbsCurve()や、gluNurbsSurface()といった関数がキーになりそう なので、取りあえずオンラインマニュアル(OpenGL系関数はCygwinのmanコマンドでちゃんと 見られる様になってます)を眺めてみたり。

あやや大脱出を観ながら、gluNurbsCurve()と格闘。Webで見つけた gluNurbsSurface()のソースを適当にいじっていたのですが、 何故か描画されず、悩んでみたり。色々いじった結果、 頂点の数や、knotsと呼ばれる制御点?の数とその内容がぴったり 合っていないと線が出ないという事が判りました。うんむぅ。 knotsが何なのかがオンラインマニュアルでもよく判らなくて謎。 このknotsの内容を変えるとBezierになったりB-splineになったり する模様。
これらを踏まえてAdvancedRenderManを眺めてみると、その説明が ありました。ノットベクトル(knot vector)が 曲線の特徴付けを行なうためのパラメータである事はなんとなく 判ったのですが、単調増加する数列であるという以上の具体的な 作用というか例は無く、どういう値を入れるとどうなるのかが イマイチよく判らず。結局、

  1. 頂点数は3以上
  2. knots数は頂点数の2倍
  3. knotsの内容はknots数の前半半分は0.0,後半半分は1.0の数列

という事で取りあえずベジェ曲線は描けるというのが判った感じ。

TV観ながら過ごしたり。流石に元旦では店も開いていません。
トリビアの泉の正月スペシャル。お年玉袋にいくら入るかという トリビアの種で、116万円入るという事を確かめたバカバカしさと、 あんなちっこい袋に116万円も入るのかという驚きに、へぇ。

先日の忘年会の模様を 補完しますた。
そういやCG描いていて気づいたのですが、2003年は彩のアップデートは 一度も無かったのだなぁと思ったりしたので書いてみるテスト(ぉぃ


TOP PREV