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

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

立体地図を作るのに便利なプログラム2種についての覚書

立体地図のモデル(OBJ形式)を制作で品質や作業効率の改善のために以下のようなPythonプログラムを作ってみました。いずれもOBJ形式データを生成するませに標高メッシュの情報を表すCSV形式のデータの前処理を行うプログラムです。

標高値の平滑化(ガウシアンフィルタ)

https://www.dropbox.com/s/eljitfa74xgbq7r/Gaussian.py?dl=1

山脈部分を触るとチクチクしてちょっと痛いという指摘があったこと、ピースを組み合わせて遊んでいるうちに細かい凸が折れたりつぶれたりしてしまうことがあったので凹凸をある程度ならして平滑化するプログラムを作ってみました。

3×3の重みづけマトリックス(下図)に従って標高の値の加重平均を計算していきます。

f:id:ichidaya:20190727215357j:plain

加重平均の重みづけ

右は左のオリジナルモデルに対して加重平均フィルタを3回かけた結果です。表面の凸凹がだいぶ滑らかになりました。

f:id:ichidaya:20190727215458j:plain

加重平均の実施例

形状の平滑化(モルフォロジー処理)

https://www.dropbox.com/s/bqloitvmkkb3o40/OpenClose.py?dl=1

QGISから取り込んだ標高データをそのまま3Dモデルにすると標高の低い部分でぽつんと穴があいたり、県境の形状が1メッシュ分だけ飛び出してはめ合わせがしにくくなったりします。これまでは3DをGenObj.pyで生成してからZBrushに読み込んで手作業で修正していたのですが、何十個もやっていたら肩こりと緊張性頭痛がひどくなってしまい自動化を検討することにしました。

モルフォロジー処理の拡張操作(注目点の周り3×3のいずれかにデータがあれば注目点にも標高のデータを補間する)、縮退操作(注目点の周り3×3の全てにデータがある場合のみ注目点のデータを残す)を実装し、まず穴を埋めるためのClose処理(先に拡張を行ってから縮退を実施)を行い、続いてかたちを整えるためにOpen処理(先に縮退を行ってから拡張を実施)を実施することにしました。

f:id:ichidaya:20190727223449j:plain

左:オリジナル 中央:クローズ処理 右:クローズ処理後にオープン処理

 左端のオリジナルでは浜名湖(佐鳴湖?)のあたりに穴があいて抜けていますがクローズ処理によって塞ぐことができています。続いてオープン処理を行うことで輪郭の形の細かい凹凸をならしています(右端の画面)。金魚のような形の背びれの部分などはこれによってはめ合わせがしやすい単純な形になりました。これまではOBJファイルを作ってからZBrushのZModelerブラシで面をひとつずつ操作してこれらの修正を行っていたのがとても楽になりました。