エッジ・ラインの抽出

最終更新:2016/09/06

ウェブサイトの画像を作るのに必要になったので、オブジェクト(モデル)輪郭のエッジ・ラインを抽出してみた。LightWave Super Cel Shaderを使う方法と、自己発光を使う方法のふたつを紹介する。

レイアウトのレンダーオプションで「ワイヤーフレーム」を指定するだけでは、ポリゴンの表面が全部透明になってしまい、モデリング中のワイヤーフレームのような画像が出力されてしまう(ポイントは目立たないので大昔のワイヤーフレームのゲームのような感じ)。「ラインレンダー」を有効にしてもエッジ・ラインだけが出力されるわけではない。そこで、

『裏側が見えない、余計な線も見えないソリッドなワイヤーフレーム』

を目指してみた。

最初に、「リアリスティック」モードでいつものようにレンダリングした画像。ところどころ文字やマーキングなどのテクスチャが貼られているのがわかると思う。

Dragoon-Realistic_640

これを、次の画像のように出力させるのが目標。オブジェクト・モデルはまったく同じもの。

Dragoon-Wire_640

共通手順・サーフェースの統一

まず、モデラーにある「色・質感編集」の設定で、テクスチャ・マップなどを設定してあるサーフェースをすべて主要な色に統一する。今回の場合、テクスチャ・マップを指定してあるのは主に白色の部分と青色の部分なので、基本色の設定を見ながらその2色に振り分ける。

このとき、「ポリゴン選択モード(Ctrl+H)」で「ポリゴン状態(w)」ウィンドウから「Surf:」をクリックしてサーフェース単位で選択をすると楽にできる。

3DCGは、要は数学の世界なので出力はいつも同じ結果になる。ということは、出力に影響しない作業をいかに効率化するかで時間を稼ぐ。ひとつひとつポリゴンをマウスで選択してたり、なげなわ選択で大雑把に選択してからジリジリ選択ポリゴンを減らしているようではイカンのです。

そもそも、なんでサーフェースを振り分けるなんて面倒くさいことをするかというと、レイアウトにあるオブジェクトのアイテムプロパティの「輪郭」タブで指定するラインレンダーで「サーフェイス境界」を指定すると、テクスチャが設定してあるサーフェースと設定していないサーフェースの境界を、LightWaveは「色の境界」と判断してしまうから。このため、本来カラーリングの境界線も鋭角のエッジのないところに意図しないエッジがたくさん出力されてしまう。

私の場合はだいたい、テクスチャを割り当てるポリゴンの指定には色の境を意図していない。複数のテクスチャも画像編集ツールではなく、LightWaveサーフェース上のレイヤーでブレンドしたり位置を調整したりする。UVマップはサーフェースとは関連付けられるけど独立した概念なので、オブジェクト全体をくるむようなマッピングもメカの場合はあまりしない。

全部のポリゴンをひとつのサーフェースに統一してしまうのがもっとも簡単なんだけど、隣り合うふたつのポリゴンが、例えば平面のように続いていてエッジを共有している場合は、LightWaveのレンダーはそのエッジを省略してしまう。このため、カラーリングの境界に適切なエッジ・ラインが引かれず、ただ輪郭外形(シルエット)をなぞるだけの扁平な出力になってしまう。

主要な色に振り分け終わったら、必要なサーフェースをすべて同じ色に統一する。言うまでもないけど、サーフェースは非常にパラメータが多いので、サーフェース名を右クリックしてコピー & ペーストすると楽チン。今回は暗い青(RGB = 0,0,32)にした。

LightWave Super Cel Shaderを使う方法

Super Cel Shaderはほとんどの一般的なサーフェースの設定を無視するけど、念のため「反射光」や「光沢」、「鏡面反射率」、「透明度」の設定は「0%」にしておく。なお、「拡散レベル」を「100%」にしておかないとサーフェースが真っ黒になってしまうので注意。

Edge_Cel_000

主要な色のサーフェースの「シェーダ」タブにある「シェーダ追加」プルダウンメニューから「Super Cel Shader」を選択する。シェーダを右クリックすると出る「プロパティ」で4段階の明るさの階調の境界値を0~100%の範囲で指定するわけだけど、これをすべて「100%」に指定する。すると、まったくハイライトも影もない扁平な出力が得られる。

Edge_Cel_001

シェーダもプロパティごとコピー & ペーストできるので、ひとつのサーフェースを設定したら、あとはコピーして済ませておきたい。ただし、最低ひとつはシェーダを設定していないと右クリックできないので、シェーダを設定していない場合、「編集」ボタンをクリックして「貼付け」を選択して貼り付ける。このへんはちょっとインターフェースがいまいち。シェーダの設定とまとめてサーフェース全体をコピーしてしまうのも手だと思う。

最後に、別名で保存する。綺麗に色分けしたオブジェクトを壊しては何にもならないので、上書きに注意!

下記「共通手順・レイアウト」に進む。

自己発光を使う方法

自己発光を使うほうが実はLightWave Super Cel Shaderを使うより簡単なことに後で気付いた。

具体的には、モデラーの「色・質感編集」で、「自己発光度」を「100%」に設定し、「拡散レベル」を「0%」に設定する。Super Cel Shaderの場合とは逆に、「拡散レベル」が「100%」になっていると、自己発光していてもサーフェースに微妙な陰影が出てしまうのでソリッドなレンダリング結果を得られない。

Edge_Luminosity000

「高度な設定」タブを選択し、「グロウの明るさ」を「0%」に設定する。レイアウトの設定で無効にすることもできるけど、グロウエフェクトが効いてしまうとエッジ付近にぼんやりした輪郭が出力されてしまう。

Edge_Luminosity001

サーフェースの設定が終わったオブジェクトを別名で保存してレイアウトに配置するか、既存のシーンのオブジェクトを置き換える。元のオブジェクトを上書きしないように注意!

あとは、下記「共通手順・レイアウト」の手順で同じ設定をしていけば同様の結果を得られる。基本的な設定だけでシェーダをいちいち設定しなくて済むので、こちらのほうがオススメ。

共通手順・レイアウト

レイアウトのオブジェクト選択モードにしてから、「アイテムプロパティ」を選択する。「オブジェクトのアイテムプロパティ」ウィンドウが開いたら「輪郭」タブを選択。

「点/線の太さ」を2.0px(ミディアム)、「鋭角の折り目」、「共有しないエッジ」、「サーフェイス境界」をそれぞれ1.0px(スモール)に設定する。「シルエットエッジ」を2.0px(ミディアム)にしておくとオブジェクトの外縁がはっきりしてメリハリがつき、機械出力っぽさが少し減っていい感じになる。もっとカメラとの距離が近ければ「距離でエッジを縮小」オプションがうまく効くかもしれない。

Edge000

エッジの太さは用途と必要に応じて変更する。なお、「その他エッジ」は設定しない。

エッジ色はお好みで。今回はオーソドックスに白(RGB = 255,255,255)にした。

ちなみに、「その他エッジ」をオンにするとこうなる。極端な鈍角のある多角形を三角分割したポリゴンのエッジがそのまま出てしまう。これはちょっとカッコ悪い。

Dragoon-Wire_worth

「ウィンドウ」メニューから「背景オプション」を選択して「特殊効果ウィンドウ」を開く。背景色をオブジェクトの主要色と同じ(RGB = 0,0,32)にする。

Edge001

「プロセシング」タブにある「グロウ有効」はオフにしておく。

Edge002

レイトレースは今回の場合はむしろ問題になるので、ライトは平行光源などフォールオフしないものに変えておく。レンダリング時間も短くなる。

レンダリング時間を長くしてもいいことはないので、ラジオシティを指定していたら、「レンダーオプション」にある「大域照明」タブの「ラジオシティ有効」もオフにしておく。

Edge003

レイアウトのレンダーオプションでレンダーモードを「リアリスティック」に設定し、「ラインレンダー」のみを有効にしておく。

Edge004

他にオブジェクトを配置していなければ、レンダリングをかけると、背景部分にアルファ・チャンネルができる。有効に使いたいので、BMP形式よりはPNG形式や、使用できる環境であればPSD形式(Adobe Photoshop形式)にしておきたい。まだ加工するのであれば、少なくともJPG形式などの不可逆圧縮フォーマットは避けたい。

画像の加工

ここではレンダリング画像をいったんPNG形式で保存して他のソフトウェアに移す。今回は透過機能が使いやすいGIMP 2.6を使用した。主要な色に適当なしきい値(大きくすればするほどエッジ・ラインは細くなる)の色域で一括選択をかけてやるとエッジ・ラインの内側の部分もすべて選択できる。選択部分をDeleteキーで削除してやれば、エッジ・ライン以外はすべて透明になるので、透過GIF画像や透過PNG画像として使える。

色数が少ないので、PNGよりはGIFのほうがファイルサイズも小さくなって取り回しはいいかもしれないけど、用途に応じてお好みで。

ウェブページなどで使うときに背景色や背景画像から浮いて見えてしまうハロー現象を防ぐために二値化するのもいいけど、エッジが途切れてしまったり、アンチエイリアスがかからずジャギー(ピクセルドットの段差によるギザギザ)がくっきり出てしまったりするので「古臭いコンピュータっぽさ」を演出したい時でもない限り注意が必要。拡大縮小にも弱くなるので、画像サイズの調整は減色する前にやっておいたほうがいいと思う。

関連記事

LightWave Super Cel Shader 2.15

最終更新:2016/09/06

NightBlade002f

Super Cel Shaderの使い方をド忘れして無駄な時間を食ってしまったので、備忘録。

「色・質感編集」から「シェーダ」タブを選択。「シェーダ追加」プルダウンメニューから「Super Cel Shader」を選択。必要なサーフェースすべてに関して同様の手順。

シェーダの設定はモデラーでもできるけど、出力結果がOpenGLでは確認しにくいので、レイアウトのVPRで出力具合を確認しながら設定して、後でシーンをオブジェクトごと保存してしまったほうが手軽。Super Cel Shaderを一時的に使うだけの場合は、サーフェースの設定を保存しておくか、専用のオブジェクトを用意する。

オブジェクト選択モードにしてから、「アイテムプロパティ」を選択。「オブジェクトのアイテムプロパティ」ウィンドウが開いたら「輪郭」タブを選択。「点/線の太さ」を2.0px(ミディアム)、「シルエットエッジ」、「鋭角の折り目」、「サーフェイス境界」をそれぞれ1.0px(スモール)に設定する。「共有しないエッジ」は必要に応じて。「その他エッジ」は設定しない(ワイヤーフレーム風にしたければ設定する)。

「レンダー」タブを選択して、「レンダーオプション」をクリック。「レンダーオプション」ウィンドウが開いたらさらに「レンダー」タブを選択。「ラインレンダー」オプションを設定。通常のシェーダを使っている時にラインレンダーを選択してしまうとサーフェースが透明になってポリゴンのエッジだけ色がつく透過ワイヤーフレームが出力されてしまうけど、セルシェードをする場合にラインレンダーを指定しておかないとエッジのラインが出ないので注意。

機首はサーフェース境界なのでやむを得ないけど、カナード翼後ろの部分のエッジはモデリングの手間を減らす都合上生じてしまったもの。真面目に消そうと思えば消せる。主翼端にちょこっと出てる不規則エッジも原因はわかってるけど、今回は実験なのでひとまず放置。

ブリリアント・カット

最終更新:2016/09/06

成り行きで58面ブリリアント・カットを作ってみた。

三角ポリゴン以外では完全平面を作るのって結構難儀なんだけど、あえて完全平面を目指してみた(LightWaveで言うところの平面率0.0%)。精度が悪くてもよければ簡単に作れるんだけどねー。

石の幅を100%とすると、頂点の座標は0.000006%くらいの誤差があるけど、モデラーの精度の限界なのである程度は仕方ない。要はレイトレースの精度を確認するためなので平面がうまくできていればいいことにする。

brilliant000
brilliant001

本当にブリリアント・カットなのかちょっとわかりにくいので、直上からの構図で透過ワイヤーフレーム。各部の比率はBrilliant Cut Diamonds(英語)を参考にした。特に、『Eulitz Calculated Brilliant 1972』という比較的新しく算出されたものを用いている。

brilliant002

案の定、LightWaveのレンダーに屈折率2.417の再現は荷が重すぎた(聞くところによると、宝石商の屈折率計でも測れないらしい)。白のライトを虹色に分解してくれるとはさすがに思えなかったので、念のため赤・青・緑のライトを配置してみたけど、可視光の波長によって屈折率が微妙に変わる現象はさすがに演算してくれなかった。ダイヤモンド特有の虹色の輝きは再現できず、真っ黒くろすけになってしまいました。

直上からの構図も試してみたけど、ほとんど真っ黒でもはや宝石かどうかすらわからないという……。

たまには「デザインが決まりきっていてターゲットが明確なモデリング」もやってみると刺激になる。

昔にもブリリアントカットには挑戦したことあるんだけど、「58面体」を「58角形」と勘違いしていて、まったく別物になっていたのに長らく気がつかなかったのは若気の至り。

LightWave用MMDモデルPMD形式ファイル・インポーター

最終更新:2016/09/06

MikuMikuDnace用モデルデータのPMD形式ファイルをLightWaveで読み込む方法。

まず、『Microsoft Visual C++ 2005 Service Pack 1 再頒布可能パッケージ』(Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package)が必要なので、マイクロソフトの次のページからダウンロードする。

パッケージの詳細についてはこちらを参照。

リストから「Microsoft Visual C++ 2005 Service Pack 1 再頒布可能パッケージ」を選択するとダウンロードページに移動するので、システムによってダウンロードするファイルを選ぶ。Windows XPやVistaなどの32ビットシステムの場合はx86ベース(vcredist_x86.EXE)、Windows 7や8のような64ビットシステムの場合はx64ベース(vcredist_x64.EXE)を選択する。両方ともダウンロードしても特に問題なかった。EXEファイルを実行するとパッケージが自己解凍してインストールされる。

LightWaveのプラグインを多数作成しているfault0d氏のウェブサイト『Poly to Poly』からAS PMD Helperをダウンロードする。私はLightWave10を使っているのでバージョン0.121を選択。アーカイブファイルにはx64用のプラグインも同梱されている。

zipファイルを解凍して、AS_PMD_Helper.pファイルをLightWave用のプラグインが格納されているフォルダにコピーする。バージョンによってフォルダ構成は異なるのでLightWave 2015でも同じかどうかはわからないけど、LightWave 10では次のフォルダ。

C:\Program Files\NewTek\LightWave_10\support\plugins

モデラーを起動し、「ユーティリティ」タブを選択して「プラグイン追加」をクリック。

AS_PMD_Helper.pファイルを指定するとPMDインポーター/エクスポーターといくつかのPMDファイル作成補助プラグインが追加される。

AS_PMD_Helperに同梱されているドキュメントに従ってモデラー設定ファイル(lwm*.cfg ※「*」はLightWaveのバージョンごとに異なる)を更新しておくとPMD形式ファイルをLWOオブジェクトと同列に扱ってくれるようになる。設定ファイルはシステムドライブ(普通はCドライブ)の「ユーザー(Users)」フォルダの各ユーザーフォルダ以下「.NewTek」フォルダ内にあるので注意。

公開されているPMDファイルをダウンロードして試してみた。今回はシナモソさん作成のボーイング767-200をベースにdiagraph01さんが改造したE-767(diagraph01さんのページ)。テクスチャの再現性などなかなか優秀。個人的にはこれで充分満足。

ただ、細かいことを言えば、可動部分など分割されているパーツは一旦ひとつのレイヤーにまとめられてしまって名前がついてるだけで空っぽのレイヤーが大量にできる。また、スケルゴン(ボーン)もロードされるけどあくまでもMMD用に作られたデータなので、インポートした直後はLightWaveでのアニメーションの実用には堪えない(座標や必要なボーンの目安にはなる)。

MMDは日本発のソフトウェアなのでボーンやウェイトマップの名称にかな・漢字を使っていることが多く、改名しないと文字化けしてしまってスケルゴン・エディタなどの一部の機能で使いづらい。もっとも、LightWaveで2バイト文字や3バイト文字を使うのは昔から御法度なので、どっちかと言うとLightWave側の問題なんだけど。(そのへんAdobeの製品はローカライズが完璧なのでビックリする)

PMD形式ファイルを他のソフトウェアで変換することなくLightWaveで直接ロードできるだけでもありがたいと思ったほうが良さそう。

思っていたよりも調整するところがなかったので、単純にLWO形式で保存した後レイアウトに移してレンダリングしてみたのが次の画像。

E-767

関連記事

GIMP2.8のメニューバーのフォントの戻し方

最終更新:2016/09/30

以前に、Inkscape 0.48.2以降のメニューがWindowsの設定値に従ってくれず、明朝体風のフォントになってしまうので、Inkscapeのメニューバーのフォントの戻し方という記事を書いた。

GIMP2.8.10より古いバージョン

最近、GIMPもバージョンアップして2.8になっていたので、アップデートしてみたところ、Inkscapeとまったく同じ問題が発生した。どうも、中国語のフォントが選択されているらしいんだけど、クロスプラットフォーム用のフリーライセンス・ライブラリを使用して開発しているソフトウェアではほぼ共通の問題があるらしい。

しかも、設定の変更の仕方が異なるという不親切さ(笑)。

次のgtkrcファイルをテキストエディタなどで開く。

C:\Program Files\GIMP 2\share\gimp\2.0\themes\Default\gtkrc
style "gimp-default-style"
{
  stock["gtk-dialog-error"] =
    {
      { "images/stock-error-64.png", *, *, "gtk-dialog" }
    }
(略)
}

上記の部分に、次のように1行追加する。

style "gimp-default-style"
{
  font_name = "Meiryo 9"
  stock["gtk-dialog-error"] =
    {
      { "images/stock-error-64.png", *, *, "gtk-dialog" }
    }
(略)
}

とりあえず、「gtk-2.0」というモジュールと「gtkrc」という設定ファイルが深く関与していることは両者に共通していたので、次にこういうことがあったらまずそこを疑えばいいということだね。

GIMP2.8.16/18

実際に試すことができたのがGIMP2.8.16とGIMP2.8.18だけだったのでこれら2つのブランチについてはほぼ確実だと思うけど、他のウェブサイトを見る限りでは、GIMP2.8.10以降であればおそらく以下の方法でメニューバーのフォントを変更できる。

最近のGIMP2.8ブランチでは変更方法が変わった。PCのユーザーごとに設定ファイルが独立したため、カスタマイズしやすくなった。次のパスにファイルが存在していれば、gtkrcファイルを開く。存在していない場合は、新規作成する。普通のテキスト・ファイルでいい。

C:\Users\[USER NAME]\.gimp-2.8\gtkrc

次の一節をgtkrcファイルの末尾に追加するか、新規作成したファイルの先頭に記述する。

style "gimp-default-style"
{
  font_name = "Meiryo 9" 
}

GIMP2.8がこのファイルを参照しているとする根拠は、次のパスにあるthemercというテーマ設定ファイルで上のgtkrcファイルをインクルードしているから。

C:\Users\[USER NAME]\.gimp-2.8\themerc

themercファイルには次のように記述されている。

# GIMP themerc
#
# This file is written on GIMP startup and on every theme change.
# It is NOT supposed to be edited manually. Edit your personal
# gtkrc file instead (C:\Users\Taku Oshino\.gimp-2.8\gtkrc).

include "C:\\Program Files\\GIMP 2\\share\\gimp\\2.0\\themes\\Default\\gtkrc"
include "C:\\Users\\[USER NAME]\\.gimp-2.8\\gtkrc"

# end of themerc

もし、インクルードしているファイルが異なる場合は、themercに記述されているパスをよく見て新規gtkrcファイルを作成する。

参考記事

Inkscapeのメニューバーのフォントの戻し方

最終更新:2016/09/06

だいぶ前に、Inkscapeをバージョン0.48.2にアップデートしたらメニューバーのフォントが突然明朝体風になってしまって気持ち悪かったんだけど、戻し方がわからなくて困ってた。コンフィギュレーション系のファイルを開いてみてもどこをいじればいいのかサッパリ。

手に負えそうにないので、ネットで調べてみた。要約すると次のようにコードを少し編集する。

次のgtkrcファイルをテキストエディタなどで開く。

C:\Program Files (x86)\Inkscape\etc\gtk-2.0\gtkrc

gtkrcファイルの末尾に次の2行を追加する。

# UI font
gtk-font-name = "sans 10"

次のpango.aliasesファイルをテキストエディタなどで開く。

C:\Program Files (x86)\Inkscape\etc\pango\pango.aliases

pango.aliasesファイルの「sans」行の「arial,」の直後に「meiryo,」を追加する。

tahoma = "tahoma,browallia new,mingliu,simhei,gulimche,ms gothic,kartika,latha,mangal,raavi"
<span style="background-color: lemonchiffon; padding: 3px;">sans = "arial,browallia new,mingliu,simhei,gulimche,ms gothic,kartika,latha,mangal,raavi"</span>
serif = "times new roman,angsana new,mingliu,simsun,gulimche,ms gothic,kartika,latha,mangal,raavi"
mono = "courier new,courier monothai,mingliu,simsun,gulimche,ms gothic,kartika,latha,mangal,raavi"
monospace = "courier new,courier monothai,mingliu,simsun,gulimche,ms gothic,kartika,latha,mangal,raavi"

これはクロスプラットフォームのソフトウェア開発の素人にはわからないね。世の中にはすごい人がいるものだね。感謝感謝。

いつの間にかバージョン0.48.4が安定版になっていたけど、せっかくメニューバーが直ったことだし、アップデートはまた今度にしよう。(0.48.4はGUIに座標や各種数値を入力できない不具合があるので、バグフィックスされるまでは0.48.1以下が無難。)

gtkrcに次のコードを直接書いてやってもいけそうな気もするけど、今は0.48.1に落として使っているので試してみてはいない。

gtk-font-name = "Meiryo 10"

参考記事