HairMaker
Table of Contents
1 なんすか?これ?
Wings3D でポリゴンねーちゃんを作った時、板ポリゴンを 扱えないWings3Dでどうにもできなかった髪の毛をどうにかできないかと作ったのが、 毛の生成プログラムである旧HairMakerでした。
その後、しばらくしてD言語を使うようになったのですが、試しにC言語で作っていた 旧HairMakerをD言語でリライトしてみました。 旧HairMakerではGUI的にイマイチな感じだったので、その辺がどうにかできるといいなぁ? と思ったのがリライトのきっかけです。
そんな訳で暇つぶしで作ったプログラムです。恐らくほとんどの人には用途不明かも知れません(^^;
2 起動方法
動作確認は Windows7 SP1 64bit で行いました。W系APIを使用していますのでWindows98 とかでは動かないかも。以下の7zファイルを適当なディレクトリに展開します。
7zファイルを展開して、hairmaker.exeを実行するとウインドウが開くと思います。 既にglut32.dllがインストールされているシステムであれば、hairmaker.exeだけで 実行可能です。
3 基本的な作業フロー
HairMakerを使用するにあたって、毛を生やしたい3Dオブジェクトが必要です。
- Wings3Dを使用してオブジェクトを作成し、Exportプラグインので.obj形式に 出力します。この時、TesselationのTriangulationを選らんで、三角ポリゴンで 出力してください。 (ここではfoo.objというファイル名に出力したものとします)
- HairMakerを起動し、「File→Import」 で「1.」で作成したオブジェクトファイル foo.objを読み込みます。
- ヘアガイドを生成/編集します。
- 「File→Export」で .incファイル(POV-Rayのinclude形式) に出力します。 (ここではfoo.incとします)
- Wings3DのExportプラグインで.pov形式にオブジェクトを含むシーンファイルと
して出力します。出力ファイル名をfoo.povとしたとき、「3.」で作成した
ファイルを読み込む為にfoo.povの最後に「#include "foo.inc"」を追加します。
エディタを使用して追加するか、Cygwinのコマンドラインなどから、
echo '#include "foo.inc"' >> foo.pov
などとすれば良いでしょう。
- 「File→Save」や「File→SaveAs」でHairMakerの独自形式(.hair)で保存します。
以上は一例ですが、WavefrontOBJ形式のエクスポートとPOV-Ray形式へのエクスポート の両方が可能である3Dモデラーであれば同じ要領で使用できると思います。
4 操作方法
操作方法について説明します。
4.1 画面
画面や表示の名称を示します。
名称 | 説明 |
---|---|
編集パネル | 各種編集操作を行う為のパネルです。 |
グループ編集パネル | グループ毎の編集や操作を行う為のパネルです。 |
ワークスペース | 実際の編集を行う画面です。 |
オブジェクト | .obj形式をインポートした3Dモデルです。 |
ヘアルート | オブジェクトの1ポリゴンの頂点です。毛を生成させる根元(毛根)になります。 |
ヘアガイド | 毛の形状を決めるガイドです。3頂点のベジェ曲線で表現されます。 |
実際の作業では、ヘアルートを元にヘアガイドを生成した後、ヘアガイドを編集(形状を変える)します。
以降の説明では上記名称を使用します。
4.2 ワークスペースでの操作
ワークスペースでの操作方法について説明します。
キー操作 | 説明 |
---|---|
ALT +マウス左ドラッグ | オブジェクトを回転させる |
ALT+CNTL +マウス左ドラッグ | オブジェクトのズームイン/ズームアウト |
ALT+SHIFT+マウス左ドラッグ | オブジェクトの移動 |
「ALT+マウス左ドラッグ」の例は、マウスカーソルがワークスペース上に乗った 状態で、ALTキーを押しながら マウス左ボタンを押してドラッグします。
- ワークスペースでマウスカーソルを動かすと、選択および編集操作可能なヘアルートもしくはヘアガイドは 赤くハイライトされます。
- 選択状態のヘアガイドに再度選択操作を行うと選択状態が解除されます。
4.3 編集パネル
編集パネルについて説明します。
アイコン | 名称 | 説明 |
---|---|---|
ヘアルート選択 | ヘアルートを選択します。 | |
ヘアガイド生成 | 選択されたヘアルートにヘアガイドを生成します。 | |
ヘアガイド選択 | ヘアガイドを選択します。 | |
ヘアガイド削除 | 選択されたヘアガイドを削除します。 | |
リニア移動 | ヘアガイドの頂点およびハンドルをマウスの移動量通りに変更します。 | |
拡大/縮小 | ヘアガイドの形状を保ったままサイズを拡大および縮小します。 | |
ミラー | YZ平面を対称に鏡面編集します。 | |
Y軸対称 | Y軸を中心に軸対称編集します。 | |
面サーフェス生成 | ヘアガイドの選択順番に従って面サーフェスを生成します。 | |
面サーフェス削除 | 面サーフェスを削除します。 | |
アンドゥ | 直前の操作を元に戻します。最大20回分の操作を戻せます。 | |
リドゥ | アンドゥで元に戻した操作を再度実行します。 |
- 「リニア移動」、「拡大縮小」、「ミラー」、「Y軸対称」では、 「CNTLキー+マウス左ドラッグ」により ヘアガイドを選択する事ができます。
- 「リニア移動」、「ミラー」、「Y軸対称」では、複数のヘアガイドが選択されていると、編集したヘアガイド に同期して選択されているヘアガイドも形状変化します。
4.4 グループ編集パネル
グループ編集パネルについて説明します。
ヘアガイドは4種類のグループのどれかに属します。ピンクでハイライトされているグループは 「カレントグループ」と呼び、ヘアガイド生成などの初期グループとなります。
ボタン/操作 | 説明 |
---|---|
SEL | カレントグループに属するヘアガイドを全選択します。 |
UNSEL | カレントグループに属するヘアガイドを全選択解除します。 |
CHGGRP | 選択されているヘアガイドのグループをカレントグループに変更します。 |
FREE/LOCK | グループ毎に編集可/不可 を切り替えます。 |
SHOW/HIDE | グループ毎に表示/非表示を切り替えます。 |
マウス右クリック | ポップアップメニューが開きます。ChangeColorでワークスペース上の表示色を変更できます。 |
4.5 プルダウンメニュー
プルダウンメニューについて説明します。
メニュー | 説明 |
---|---|
File→Open | .hair(HairMaker独自形式)ファイルを開きます。 |
File→Save | .hair形式でセーブします。 |
File→SaveAs | 名前を付けて.hair形式でセーブします。 |
File→Import | .obj(Wavefront OBJ形式)をインポートします。 |
File→Export | .inc(POV-Ray include形式)にエクスポートします。 |
File→Exit | HairMakerを終了します。 |
Edit→Select All | ヘアルートもしくはヘアガイドを全選択します。 |
Edit→Unselect All | ヘアルートもしくはヘアガイドを全選択解除します。 |
View→Reset | ワークスペースのオブジェクト表示を初期位置に戻します。 |
View→HGcntl | ヘアガイドの制御点の表示(SHOW)/非表示(HIDE)を制御します。 |
View→HairRoot | ヘアルートの表示(SHOW)/非表示(HIDE)を制御します。 |
View→Object | オブジェクトの表示(SHOW)/非表示(HIDE)を制御します。 |
Option→Preference | ワークスペースの表示色を変更します。 |
Help→OperateHelp | ワークスペースやショートカットの説明ダイアログを表示します。 |
Help→VersionInfo | HairMakerのバージョンについてダイアログを表示します。 |
4.6 キーボードショートカット
いくつかの操作はキーボードショートカットとして割り当てられています。
キー | 説明 | 備考 |
---|---|---|
a | ヘアルートもしくはヘアガイドを全選択します | Edit→Select Allと同じ |
g | 選択されたヘアルートにヘアガイドを生成します | 編集パネルのヘアガイド生成と同じ |
h | オブジェクトの表示/非表示を切り替えます | View→Objectと同じ |
H (SHIFT+h) | ヘアガイドの制御点の表示/非表示を切り替えます | View→HGcntlと同じ |
r | ワークスペースのオブジェクト表示を初期位置に戻します | View→Resetと同じ |
x | 面サーフェスを削除します | 編集パネルの面サーフェス削除と同じ |
y | 面サーフェスを生成します | 編集パネルの面サーフェス生成と同じ |
SPACEキー | ヘアルートもしくはヘアガイドを全選択解除します | Edit→Unselect Allと同じ |
Deleteキー | 選択されたヘアガイドを削除します | 編集パネルのヘアガイド削除と同じ |
CNTL+z | アンドゥ | 操作パネルのアンドゥと同じ |
CNTL+SHIFT+z | リドゥ | 操作パネルのリドゥと同じ |
4.7 Exportダイアログ
ヘアガイドとオブジェクトのポリゴン面を元に、ポリゴン面に毛を生成します。 一本の毛は ベジェ曲線に沿った POV-Rayの小さなCylinderプリミティブを繋いだ集まりで 表現されます。
POV-RayへのExportダイアログの各パラメータについて説明します。
パラメータ | 説明 |
---|---|
Density | 毛の生成密度を指定します。値が大きいほど生成する毛の量が多くなります。0を指定するとヘアガイドの本数だけ生成します。 |
BezierStep | 毛のベジェ曲線の分割数を指定します。大きな値にすると急な曲線もスムーズに表現されますが、POV-Rayでレンダリングするのに必要なメモリ量や時間が増加します。 |
Filter | POV-Ray色指定の filterを指定します。 |
Diffuse | 拡散反射率を指定します。 |
Specular | 鏡面ハイライトを指定します。 |
Phong | フォン・ハイライトを指定します。 |
PhongSize | フォン・ハイライトのサイズを指定します。 |
StartRadius | 毛の毛根側半径を指定します。 |
EndRadius | 毛の先端側半径を指定します。 |
Color | ダイアログが開き、色と透明度を指定します。 |
色やハイライトのパラメータについてのより詳細な説明はPOV-Rayのマニュアルを参照願います。
5 POV-Ray Exportについて
POV-RayへのExportでは、オブジェクトの各三角ポリゴンに指定した密度に従って毛を生成します。 ポリゴンの頂点(ヘアルート)が全て同一グループのヘアガイドで囲まれている場合に毛を生成 するポリゴンとなります。
ヘアガイドのグループ分けを行った際、グループの異なるヘアガイドの境界で毛の生成対象とならない ポリゴンが生じる場合があります。この場合、一つのヘアルートに複数のグループの異なるヘアガイド を生成する事で毛の生成対象となります。
6 これは仕様です
現段階での仕様を列記します。
- ファイルのドラッグ&ドロップでの読み込みはできません。
- アンドゥ回数は20回で固定です。
- キーバインドの変更や追加はできません。
- Option→Preferenceで変更した色はどこにも保存されません。
- File→Exportで変更したパラメータ類はどこにも保存されません。
- ポリゴンのエッジ(辺)には明に毛を生成しません。
- Exportパラメータの半径を大きくした場合に「ちゃんと切れていない たくあん」のようになる場合があります。
- 4点以上のベジェ曲線は扱えません。
- オブジェクトの裏側に隠れた ヘアガイドを選択/編集できてしまうのは仕様です。
- グループのFREE/LOCK、SHOW/HIDE、表示色の状態は保存されません。
- 複数のファイルを同時に編集することはできません。
- メニューやメッセージを日本語にするスイッチはありません。
- グループの数は4グループ固定です。追加や削除はできません。
- 三角ポリゴン化されていない.objファイルは正しく読み込めない場合があります。
- 3Dオブジェクトの途中差し替えはできません。
- 物理シミュレーションによる編集機能はありません。
- なんだか編集作業自体が面倒臭いのは仕様です。
- イマイチ用途が不明に感じる方がいらっしゃるのは仕様です。
変更/改善するかも知れませんし無限にこのままかも知れません。
7 プログラムソース
D言語(2.0)で書かれています。
Windows API プロジェクトのWinAPIバインディングを少し手を入れて利用させていただいています。 Win64対応の修正を少し入れてあります。 D言語はコンパイラバージョンが変わると、すぐにコンパイルが通らなくなりますので、 現時点でコンパイルできるセットをwin32-r416b.tar.xzとして勝手に固めさせてもらいました。 そんな訳で、Windowsでしか動きません(^^;
zlib, libpng, libjpeg を、MinGW用に野良ビルドしたものをスタティックリンク しています。
コンパイラは2013/07時点でgithubでメンテされている GDC を使用しました。 ただし、メインラインのtrunkはMinGW向けにビルドできません。 このため、MinGW向けに venix1さんが パッチとしてまとめている DMD2.062対応されたバージョンに少し手を入れて 使用しています(ビルドの参考)。
$ gdc -v Using built-in specs. COLLECT_GCC=C:\MinGW\gdc031_2062_480\bin\gdc.exe COLLECT_LTO_WRAPPER=c:/mingw/gdc031_2062_480/bin/../libexec/gcc/mingw32/4.8.0/lto-wrapper.exe Target: mingw32 Configured with: ../gcc-4.8.0/configure --build=mingw32 --with-arch=i686 --enable-languages=c,c++,d,lto --prefix=/ming w/gdc031_2062_480 --enable-threads --disable-nls --enable-sjlj-exceptions --disable-bootstrap Thread model: win32 gcc version 4.8.0 (GCC)
ビルド方法は以下の通り。~/download/ の下にtar.xzアーカイブをダウンロードしたとします。 作業ディレクトリは適当な場所だとします。
xz -dc ~/download/hairmaker_v010_src.tar.xz | tar xvf -
cd hairmaker_v010_src
xz -dc ~/download/win32-r416b.tar.xz | tar xvf -
./mk.sh -a
どちらかと言うとコンパイル環境を整えるのにかなり手間がかかりますが、それをいとわないという方 は適当に改造するなどして遊んでみてください。
8 制作メモ
コア部分のD言語へのリライトは比較的すぐに終わったのですが、GUIを付けようと思うと 部品クラスが色々と足りなくて停滞していました。 別の実験アプリを書いている間に部品が溜まってきたのでリライトを再開し、なんとなく 形になったという感じです。便利なGUI構築ツールを使った事が無いので良し悪しは よく判りませんが、アイコンを描いたりするのは面倒臭かったので、多分どんなツールを 使ってもGUIプログラムは面倒臭いものなんじゃないかな?と思います。
旧HairMakerを作成したのは2004年で、2005年1月くらいまでアップデートして一旦更新終了。 D言語にリライトし始めたのが2010年10月頃。GUIを付けようとしたのが2011年2月頃で、 そこからしばらく停滞。再び始めたのは2013年5月頃。そしてまとまったのが2013年7月。 その間にGDCのアップデートが再開されたり、MinGW向けにしばらく最新版が使えてなかったり と色々あって、なんだか時間がかかり過ぎてしまいました(^^;; で、時間がかかった割には、できる事は旧HairMakerと大差が無いという残念な感じがへっぽこ風という事で。