HairMakerで遊ぼう

「遊ぼう」つっても、TANEが自分で作ったプログラムなので、 「プログラムを作る以外の目的で遊べるのか?」という疑問はありますが、 生温かい目で見てあげてください。

目次

  1. HairMakerってなによ?
  2. HairMakerのビルド方法
  3. HairMakerの起動方法
  4. 作業フロー
  5. 操作方法
  6. 操作例
  7. 毛の生成について
  8. その他
  9. 履歴

HairMakerってなによ?

ある日、TANEがWings3Dを使用して ポリゴンねーちゃんを作った時、髪の毛の表現に色々と苦労をしました。 Wings3Dはポリゴンベースモデラではあるのですが、ポリゴンの一枚板を 編集し、うまくレンダリングできるような形で出力する事ができない為、 一般的な手法として使われている、リボン状のポリゴンを髪の毛の束に 見たてて、そのポリゴンにテクスチャマップを施すという方法が うまく適用できませんでした。
更にある日、OpenGLというグラフィック描画ライブラリを使用して、 少し3DCGのイロハを勉強してみることにしました。この過程でWings3D で作成した3Dデータを表示させては嬉しがってみました。
とあるCG雑誌を眺めていると、どうやら世の中は髪の毛の流れを指示する 専用のツールを使って髪の毛を編集するのが一般的になっているらしく、 高価な3DCGツールにはそういったツールがプラグインで提供されていたり 標準添付されていて使えたりするものらしいというのを知りました。 そうは言っても高価なソフトウェアですから、とても手が出る代物では ありません。
そして、OpenGLを使用して、どうにか高級ソフトウェアのような 髪の毛を編集するツールを作れないかと考えてみました。それがこの HairMakerという訳です。
つまり「毛の生成プログラム」です(<説明これだけでいいじゃん)。

[2013/08/24追記]:D言語を使ってリライトしたバージョンは こちら


HairMakerのビルド方法

Mingw版を作成してみました。実行バイナリとソースの両方が含まれています。 実行バイナリを含んでいますので、ビルドは特に必要ありません。

hairmaker-win-005.tar.gz(05/01/18)

Cygwin依存のGLUT版はソースしかありませんので、以下の手順でビルドする必要が あります。

  1. Cygwinをインストールする。 DLLだけとかケチ臭いインストールでは多分うまくいきません(^^; この時 できればg++パッケージもインストールする。
  2. lib3dsをコンパイルし インストールする。本ライブラリは「3d studio max」形式のファイルを 読み込むのに使用しています。configure/makeを実行するとexampleのビルドには 失敗するようですが、ライブラリのインストールができれば取りあえず OKです。
  3. HairMakerのソース hairmaker-003.tar.gz(04/02/22) をダウンロードし適当なディレクトリに展開する。 展開したソースディレクトリに移動しmakeを実行する。うまく いけば実行ファイル hairmaker.exe が生成されます。

<注意点>
コンパイルにはCygwinのライブラリパッケージw32apiのインストールが 必要ですが、バージョン2.5-1ではGL/glu.h内のdefineが足りない為、 コンパイルに失敗します。一つ前のバージョン2.4-1では大丈夫です。

HairMakerの起動方法

Mingw版は実行バイナリをエクスプローラーなどからダブルクリックして起動します。
以降の作業フローや操作方法などは、ファイル指定をコマンドラインからではなくメニュー から行なうという点を除けば、GLUT+Cygwin版と「ほぼ」同じだと思います(^^;


GLUT+Cygwin版はコマンドshell上から起動します。

./hairmaker -i foo.hair -o foo.hair -p foo.inc &

入力ファイル、出力ファイルなどは予めコマンドラインで指定しておく方式です。 これは単にGLUTを使用したのでは、ファイル指定ウインドなどを開く事 が難しいので、妥協策としてこうしました。
./hairmaker -h で簡単なヘルプが出ます。


作業フロー

HairMakerを使用するにあたって、まず毛を生やしたい3Dオブジェクトが 必要です。次のようにデータを渡り歩く感じになります。

  1. Wings3Dを使用してオブジェクトを作成し、Exportプラグインの3DS形式 出力を使用して3DSファイルを生成します。これをfoo.3dsとします。

  2. HairMakerにfoo.3ds形式を読み込ませます。以下のようなオプション指定で 3DSファイルを入力とします。

        ./hairmaker -3 foo.3ds -o foo.hair -p foo.inc
        
  3. 編集を行なった後、'o'キーを押す事で-oオプションで指定したファイル名で HairMaker独自形式ファイル(前述の例ではfoo.hair)に出力します。 'p'キーを押す事で-pオプションで指定したファイル名でPOV形式(例ではfoo.inc)に 出力します(ただし単体では文法的にレンダリングできません)。

  4. 出力されたPOV形式のファイルはWings3Dで出力したPOVファイルに #include文を追加することで結合します。例としてWings3Dでの出力ファイルを foo.povとした時、foo.povの最後に「#include "foo.inc"」を追加します (エディタを使用して追加するか、Cygwinコマンドラインから
        echo '#include "foo.inc"' >> foo.pov
        
    などとすれば良いでしょう)。

  5. 一度終了した後は、以下の様にfoo.hairを入力として起動します。

        ./hairmaker -i foo.hair -o foo.hair -p foo.inc
        
    例ではセーブはfoo.hairに上書きとなります。上書きだと心配な場合は -oでのファイル名を適当に変えてください。
オブジェクトの作成にはWings3Dを使用していますが、他のツールを使用する場合 でも、3DS形式への変換を行なう事ができる場合は、同じ要領で使用できます。


操作方法

Mingw版はメニューがついていますが、GLUT版は気の利いたメニューが全く無い「漢」の ツールとなっています。 基本はマウスで対象を編集したり、アングルを変更したりしますが、 ファイルセーブなどはキーボードに割り当てられたコマンドを、 キーを押す事で実行します。
毛を生やすオブジェクトの頂点を「ヘアルート(毛根の意)」、頂点に 生成したガイドを「ヘアガイド」と呼びます。

アングル変更キーバインドの一覧

Altキー + マウス左ドラッグ
オブジェクトを回転させます。

Altキー + Cntlキー + マウス左ドラッグ
マウスの上下方向移動移動でズームイン/アウトします。

Altキー + Shiftキー + マウス左ドラッグ
マウスの上下左右方向移動移動でオブジェクトを上下左右に移動します。


基本的な選択操作の一覧

「Edit HairGuide」モードでCntlキーを押しながらマウス左ドラッグorクリック
カーソルがヘアガイドのコントロールポイントと重なる時、ヘアガイドが選択状態となります。

「Edit HairGuide」モードでCntlキーを押しながらマウス右ドラッグorクリック
カーソルがヘアガイドのコントロールポイントと重なる時、ヘアガイドが非選択状態となります。

「Select HairRoot」モードでマウス左ドラッグorクリック
カーソルがヘアルートと重なる時、ヘアルートが選択状態となります。

「Select HairRoot」モードでマウス右ドラッグorクリック
カーソルがヘアルートと重なる時、ヘアルートが非選択状態となります。


コマンド系キーバインドの一覧


'r'
表示アングルや拡大率を立ち上げ時の設定に戻します。変に拡大したり、 動かし過ぎて何がどこにあるのか判らなくなったときに使用すれば便利かも。

's'
ヘアガイドのコントロールポイントの表示/非表示を行ないます。

'S'(Shift + 's')
ヘアガイドの描線の表示/非表示を行ないます。

'h'
オブジェクトの表示/非表示を行ないます。

'H'(Shift + 'h')
ヘアルートの表示/非表示を行ないます。

スペースキー
編集モードにより選択されているヘアルートもしくはヘアガイドの選択状態を解除します。

'a'
編集モードによりヘアルートもしくはヘアガイドの全てを選択状態にします。

'A'(Shift + 'a')
現在のGroupIDと同じGroupIDのヘアガイドを選択状態にします。

'1','2','3','4'
各数字−1に対応したGroupIDを現在の編集GroupIDにします。

'!','"','#','$'(Shift+ '1','2','3','4')
各数字−1に対応したGroupIDのヘアガイドの表示/非表示を切り替えます。

'm' :
編集モードを切り替えます。「Edit HairGuide」と「Select HairRoot」の二つの モードがトグルで切り替わります。

'n' :
ヘアガイドの同期編集モードを切り替えます。「Sync=liner」と「Sync=Normal」の二つの モードがトグルで切り替わります。

DELキー
選択状態となっているヘアガイドを削除します。サーフェスを貼っている場合は それも消去されます。

'g'
「Select HairRoot」モードで、選択されているヘアルートから ヘアガイドを生成します。生成されたヘアガイドは選択状態となっています。

'o'
-oオプションで指定されたファイルにHairMaker形式ファイルをセーブします。 オプションが省略されている場合はoutput.hairというファイルにセーブされます。

'p'
-pオプションで指定されたファイルにPOV-Ray形式ファイルをセーブします。 ヘアガイドを元に面補完して、coneプリミティブを使用してベジェ曲線を描きます。 オプションが省略されている場合はoutput.incというファイルにセーブされます。 ガイドの本数によって、セーブファイルが巨大(数百MB)になったり、セーブに 時間がかかる場合があります。

'q'
プログラムを終了します。

'c'
選択状態のヘアガイドを現在指定されているGroupIDに変更します。

'y'
セレクトしたガイド間に曲面サーフェスを貼ります。

'x'
表示されている全ての曲面サーフェスを削除します。



操作例

操作画面1

操作画面1

Wings3Dで作成した球状のオブジェクトを3DS形式に出力し、 それを読み込みました。赤い点はマウスカーソルに追従 します。

操作画面2

操作画面2

'M'キーを押して、「SelectHairRoot」モードにします。 マウスカーソルを白い点で表示されているオブジェクトの頂点「ヘアルート」に 合わせると、赤くハイライティングされます。赤くハイライティング された状態でマウスの左クリックもしくは左ドラッグで頂点を 触る事で、ヘアルートを選択状態にします。図の茶色になっている ヘアルートがセレクトされた状態です。

操作画面3

操作画面3

ヘアルートを選択した状態で'g'キーを押すと「ヘアガイド」が生成されます。 生成されたヘアガイドは選択された状態で生成されます。 生成されるヘアガイドは現在のGroupID(図の場合は0で黄色) で生成されます。

操作画面4

操作画面4

再び'm'キーを押して「EditHairGuide」モードに戻ります。 'スペースキー'を押す事で選択されているヘアガイドを全て 非選択状態にします。
個別に編集したいヘアガイドのコントロールポイント(点で 表示されている所)にマウスカーソルを合わせて左ドラッグ する事でコントロールポイントを移動することができます。 コントロールポイントは「通過点(アンカー)」と「制御点(ハンドル)」 の2種類があり、制御点は曲線の曲がり具合を調節します。 通過点を移動させると、それに関係のある制御点も同時に移動 されます。

操作画面5

操作画面5

選択されているヘアガイドは、ある一つのヘアガイドの編集に同期して 編集されます。「Sync=Liner」では、一つのヘアガイドの通過点および 制御点と同じ'節'となる点を選択されているヘアガイドの同じ'節'を 同じ移動方向に同じ移動量だけ動かします。

操作画面6

操作画面6

'n'キーを押す事で同期編集モードを切り替えます。「Sync=Normal」では y軸とヘアルートの法線を元に編集されているヘアガイドと「同じ形状になる様に」 選択されたヘアガイドは編集されます。
ヘアルートの法線がy軸に平行な場合は編集対象とならない点に注意して下さい。

操作画面7

操作画面7

「EditHairGuide」モードにおいて、Cntlキーを押しながらヘアガイドの 制御点および通過点を左クリックもしくは左ドラッグすると、ヘアガイド を選択状態にできます。この時、内部では選んだヘアガイドの順番を 過去32番目まで覚えています。この順番はヘアガイドの間に曲面サーフェス を貼る為の情報となります。スペースキーにより全選択解除を行なうと 覚えていた順番はリセットされます。

操作画面8

操作画面8

'y'キーを押す事でヘアガイドの選択順番を元に曲面サーフェスを貼ります。 このサーフェスはPOV出力などに出てくるものではありません。 見た目では判りにくいヘアガイド間のねじれや重なりの状況を確認 するのに役立つと思います。

操作画面9

操作画面9

曲面サーフェスを貼ったまま編集した様子。
'x'キーを押すか、delキーを押す事で、貼られた曲面サーフェスは 全て削除されます。


毛の生成について

ポリゴン図1
POV形式に出力する際、編集されたヘアガイドを元にポリゴン面に 毛を生成します。毛の生成パターンには以下の組合わせがあります。

  1. ポリゴンABCの各頂点(ヘアルートに対応します)に同一GroupIDの ヘアガイドを生成している場合。
    ポリゴン面ABCの面積密度に応じた毛をポリゴン面内にランダムに 生成します。

  2. 「1.」の条件を満たさずに、ポリゴンの辺AB,BC,CAの各頂点で 同一GroupIDのヘアガイドを生成している場合。
    各辺AB,BC,CDの面積密度の1/2乗に応じた毛を各辺上にランダムに 生成します。

  3. 「1.」「2.」の条件を満たさずに頂点A,B,Cのいずれかに ヘアガイドを生成している場合。
    ヘアガイドと同じ形状の毛を生成します。



ポリゴン図2
一つのヘアルートには複数のヘアガイドを生成する事ができます。
例えば「ポリゴン図2」の様に頂点A,B,C,D,E,F,G,Hで形成されるポリゴン 面があった時、A,B,G,HをGroupID=0、C,D,E,FをGroupID=3とします。 この時、ポリゴンBCGには辺BG、およびポリゴンCFGには辺CFにのみ 毛が生成されます。もし、ポリゴンBCG内およびポリゴンCFG内に毛を 生成したい場合は、頂点Bと頂点Gに GroupID=3のヘアガイドを追加で生成するか、 頂点Cと頂点Fに GroupID=0のヘアガイドを追加で生成するなどして、 ポリゴン面を同一GroupIDで囲う事で可能となります。
また、ヘアルートには同一GroupIDのヘアガイドを複数 生成する事が できます。しかし、毛の生成時は GroupIDで順に内部データをサーチし、 最初に見つかったヘアガイドを毛生成のデータとして使用します。従って、 同一ヘアルート上に同一GroupIDのヘアガイドを複数生成する事には意味が ありません(これは ヘアガイドのグルーピング作業を後で行なう際、 一時的に同一GroupIDになる場合でも、チェックで はじかない方が 作業効率が良いと判断した為です)。

その他

説明は判りにくいし用途も狭いしで、どうすれって感じかも知れませんが、 そういうものだという事で。


履歴

2004.01.18 : 取りあえず作ってみた
2004.01.19 : バグってたのでVer0.01をアップロードした。
2004.02.22 : Ver0.03に合わせて変更した。
2004.02.23 : 説明文で判りにくい表現を修正した。
2004.03.07 : 使用するw32apiパッケージのバージョンについて注意点を追記した。
2004.07.19 : 何気に日本語が変だというのに今頃気づいたので修正した。
2004.08.01 : Mingw版を置いてみた。
2013.08.24 : HairMakerってなによ?にD言語リライトバージョンについて追記。


PREV TOP