立体地図を作る -補足2 標高で色分けする-
先日投稿した標高で色分けした立体地図の作り方の説明です。
業者に色付きで造形してもらうために渡すデータの形式はいくつかありますが、私はOBJ形式ファイル+テクスチャ画像を渡して依頼しました。ここでいうテクスチャ画像とは立体の表面にシーム(切れ目)を入れて平面に展開した画像です。立体のどこにどうシームをいれて展開するかということを規定する情報はUVマッピングと呼ばれていてその記述方法はOBJ形式の仕様で決められています。前の投稿で説明した”v”と”f”によるOBJ形式の記述はUVマッピングを持たない形状だけの情報でしたが、これにUVマッピングの情報が追加されます。したがって、色付きの造形データを準備するためには
という2ステップの作業を行うことになります。
1. UBマッピング付きのOBJファイルを作成する
よほど単純な形状でない限り手作業でUVマッピングを行うのは無理なので専用のソフトウェアの手助けが必要になります。私の場合、ZBrushのUVマスターというプラグインを使いました。UVマスターでは直感的にわかりやすい展開画像が得られるようシームを入れてほしくない場所(赤)、逆にここに切り分けて展開してほしいという場所(青)を人手で指定したうえで展開処理(Unwrap)を起動します。
展開結果は下の図のようになります。
2.UVマッピングに沿った色付きのテクスチャ画像を作成する
展開画像に対してPhotshopなどの画像編集ソフトウェアを使って手作業で色を塗ることもできますが、今回は標高の数値に応じてきちんと塗り分けたいのでそのためのスクリプトを作成しました。
ZBrushでUVマッピングを行った後でOBJ形式でモデルをエクスポートすると
v 133.550 47.474 9.898 v 133.710 47.439 9.912 v 133.529 47.291 9.871 v 133.723 47.288 9.936 : vt 0.66436 0.38941 vt 0.66386 0.38996 vt 0.66326 0.38942 vt 0.66425 0.38883 : f 2/1 1/2 3/3 4/4 f 5/5 2/1 4/4 f 3/3 24/6 8/7 4/4 f 5/5 4/4 8/7 9/8
:
といったデータが出力されます。形状の情報のみのを保管した場合と比べると"vt"とい文字列で始まる行が追加され、面を表現する”f”で始まる行の記法が変わっています。"vt"で始まる行の2つの数字は展開後の画像のX座標、Y座標です(3次元形状のX,Y,Z座標と区別するためにUV座標と呼ばれます)。この座標の値は0から1の間の値に正規化されているので、テクスチャ画像を作成する側で決めた画像の大きさに応じて実際の点の位置が決まります。
”f”で始まる行で面を構成する頂点を記述していくときには
3次元の頂点のインデックス/UV座標の点のインデックス
という組で記述されます。上の例で2/1という記述はインデックス2の頂点(133.710 47.439 9.912 )はインデックス1のUV座標( 0.66436 0.38941 )と対応していることを示しています。
以上から、標高で塗り分けられたテクスチャ画像を作成するには
面を構成する(”f”で始まる行にでてくる)すべてのインデックスの組に対して
1 3次元頂点のインデックス番号をもとに頂点のZ座標(高さ)をもとめる
2 Z座標から何色(RGBの値)で塗るかを決定する(例えば標高5m以下なら水色)
3 UVのインデックス番号からUV座標を取得、画像上の座標に換算する
4 3でもとめた画像上の座標に2でもとめた色の点をうつ
という処理を 繰り返せばよいことがわかります。
上記のアルゴリズムをPythonスクリプトで実装し実行した結果です。
作成したテクスチャをZBrushに取り込んでみました。この状態でもう一度OBJファイルをエクスポートすると、OBJ、mtl、BMPの3つのファイルが作成されるのでこれをZipに固めて造形を依頼します。