立体地図用テクスチャ画像作成に関する備忘録
カラー造形のためのテクスチャ画像を作成する考え方は前回述べたとおりなのですがもう少し実装よりというか、泥臭い作業上の注意点なども記録しておきたいと思います。
テクスチャ画像の生成スクリプトのソースコードを下記に置きました。
このPythonスクリプトは画像編集ソフトGimpのプラグインとして動作します。単独では動きませんのでご注意ください。GimpはフリーのソフトウェアでWindowsとMac両方で利用可能ですが、私のPythonスクリプトはWindows環境でのみテストしています。
PythonスクリプトのファイルをWindowsのユーザフォルダ下の".gimp-2.8\plug-ins"フォルダ(私はGimp2.8を使っているのでこの名前になります)にコピーしておいてGimpを起動するとテクスチャ画像生成をGimpのコマンドとして利用できるようになります。
フィルター(R)->Python-fu->Map->Gen Texture
で以下のようなダイアログが表示されます。
File NameにはUVマッピングの結果を含んだOBJファイルを指定します(重要!! ファイルパスの文字列にダブルバイト文字が含まれていると異常終了します。OBJファイルを置いておくフォルダ名には半角文字を使ってください)。Image Sizeにはテクスチャ画像の縦と横(正方形なので同じ値になります)の画素数を指定します。一般に大きな値を指定したほうが精密な絵が描けますが、頂点間の間隔があいているところを塗りきりなかったり(後述)します。形状のポリゴンの数や大きさも影響しますので、私は512から2048ぐらいの値で悩みながら決めています。BaseとVer.Scaleはプリント用の3Dモデルの高さから元の標高を逆算するのに必要なパラメータです。Excelで直方体のデータを出力するとき、標高の値を縦方向に70万分の1に縮尺してから台の部分を5mm分足しているのでこの逆を行うわけです。得られた標高値に応じて色を決めているのですがその部分は現時点ではハードコーディングされていて以下のような感じです。
height = ((z - base)*ver_scale)/1000.0 thr = - ((base/3.0)*ver_scale)/1000.0 if height < thr : color = (230,230,230,1.0) elif height < 0.1 : color = (43,131,186,1.0) elif height < 10.0 : color = (100,171,176,1.0) elif height < 200.0 : color = (157,211,167,1.0) elif height < 300.0 : color = (199,233,173,1.0) elif height < 500.0 : color = (237,248,185,1.0) elif height < 1000.0 : color = (255,237,170,1.0) elif height < 1500.0 : color = (254,201,128,1.0) elif height < 2000.0 : color = (249,158,89,1.0) elif height < 2500.0 : color = (232,91,58,1.0) else : color = (215,25,28,1.0)
実は、あともう1つこのダイアログには含まれないのですがテクスチャ画像の出来栄えに影響を与えるパラメータがあります。下の図で青枠で囲った数字、指定された色で点を打つときのブラシサイズです。現状のスクリプトでは実行時に設定されていたサイズで点を打っていきます。
現状のスクリプトでは点のサイズを小さくすると精密な着色ができるのですが大きなポリゴンを塗り切れないことがあります(下の図の赤枠部分)。点を打つのがポリゴンの頂点の位置で中を塗りつぶすようなロジックになっていないからです。
ZBrushのDynaMeshの機能でポリゴンの大きさを均質かつ十分小さくしておけばこういうことはおこらないのですがテクスチャ生成に非常に時間がかかってしまうことがあります。ブラシのサイズを大きめに設定してテクスチャ画像を生成すると 粗くはなるが塗り残しをなくすことができます。
2つの画像を重ね、塗り残し部分は粗い画像の情報で補うという手もあります。
ここらへんはどんなやりかたが良いのかいまだ試行錯誤を続けている状況です。
画像が生成できたらZBrushにテクスチャ画像に取り込んでもう一度OBJ形式でエクスポートを行って以下の3つのファイルを作成します。
XXX.OBJ
XXX.mtl
XXX.BMP
OBJファイルににmtlファイルへのパスを記述し、mtlファイルの中にBMPファイルへのパスを記述するというのがカラー造形を依頼するときのお作法になっているためです。