3Dモデルをいろいろ作ってみたい

3Dモデルをいろいろ作ろうとがんばっています。苦労した点、役に立ちそうな情報を発信していきます。

立体地図用テクスチャ画像作成に関する備忘録

カラー造形のためのテクスチャ画像を作成する考え方は前回述べたとおりなのですがもう少し実装よりというか、泥臭い作業上の注意点なども記録しておきたいと思います。

テクスチャ画像の生成スクリプトソースコードを下記に置きました。

MapTexture.py

このPythonスクリプトは画像編集ソフトGimpプラグインとして動作します。単独では動きませんのでご注意ください。GimpはフリーのソフトウェアでWindowsMac両方で利用可能ですが、私のPythonスクリプトWindows環境でのみテストしています。

Gimpダウンロード

 PythonスクリプトのファイルをWindowsのユーザフォルダ下の".gimp-2.8\plug-ins"フォルダ(私はGimp2.8を使っているのでこの名前になります)にコピーしておいてGimpを起動するとテクスチャ画像生成をGimpのコマンドとして利用できるようになります。

フィルター(R)->Python-fu->Map->Gen Texture
で以下のようなダイアログが表示されます。

f:id:ichidaya:20190207230219p:plain

テクスチャ画像生成ダイアログ

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つこのダイアログには含まれないのですがテクスチャ画像の出来栄えに影響を与えるパラメータがあります。下の図で青枠で囲った数字、指定された色で点を打つときのブラシサイズです。現状のスクリプトでは実行時に設定されていたサイズで点を打っていきます。

f:id:ichidaya:20190208172808p:plain

テクスチャ画像作成時の点の大きさの指定

 現状のスクリプトでは点のサイズを小さくすると精密な着色ができるのですが大きなポリゴンを塗り切れないことがあります(下の図の赤枠部分)。点を打つのがポリゴンの頂点の位置で中を塗りつぶすようなロジックになっていないからです。

 

f:id:ichidaya:20190208181712p:plain

テクスチャを塗り切れない例

ZBrushのDynaMeshの機能でポリゴンの大きさを均質かつ十分小さくしておけばこういうことはおこらないのですがテクスチャ生成に非常に時間がかかってしまうことがあります。ブラシのサイズを大きめに設定してテクスチャ画像を生成すると 粗くはなるが塗り残しをなくすことができます。

f:id:ichidaya:20190208182944p:plain

ブラシサイズを大きくしたテクスチャ画像

 2つの画像を重ね、塗り残し部分は粗い画像の情報で補うという手もあります。

f:id:ichidaya:20190208183521p:plain

粗い画像と精微な画像の重ね合わせ

ここらへんはどんなやりかたが良いのかいまだ試行錯誤を続けている状況です。

 

 画像が生成できたらZBrushにテクスチャ画像に取り込んでもう一度OBJ形式でエクスポートを行って以下の3つのファイルを作成します。

XXX.OBJ

XXX.mtl

XXX.BMP

OBJファイルににmtlファイルへのパスを記述し、mtlファイルの中にBMPファイルへのパスを記述するというのがカラー造形を依頼するときのお作法になっているためです。