2017年4月30日

Grasshopper : Elk

Elkを試してみました。
ElkはGrasshopper用のアドインで、OpenStreetMapから書き出した地図ファイル(.osm)を読み込んでRhino上に地図モデルを作ることができます。
Rhino以外全部無料なのはよいのですが、最も重要な地図データがショボい。特に日本のデータは...。
オープンソースなので仕方ないですけどね。

個々の建物データにheight情報があれば高さのある3Dの建物モデルを作ることができます。
地図好きな方はご近所の情報を追加してください。
アカウントを作ってログインすると誰でも自由に地図を編集できます。


ElkはFood4Rhinoから。


2017年4月15日

無料で地形メッシュを取得!2

実は国土地理院のページで直接3Dデータのダウンロードができます。
地理院地図3D
恐らく元データは数値地図なのでしょうから、かなり高精度なのだろうと思います。


もともと触れる3D地図が作れる!(3Dプリンタで)とかいうコンセプトのものですが、簡単に地形メッシュを取得できるのでCG屋にとっても便利かもしれません。
ただし、アップにするとギザギザ...。触地図向けだからかな?それともデジタルすかし的な?

少し引くときれいなメッシュが取得できます。


2017年4月9日

国土地理院の基盤地図情報から地形メッシュを作る

地形メッシュを無料で作る!


[必要なもの]

  - 数値標高モデル
  - 基盤情報のダウンロードに必要な登録
  - 基盤情報ビューワー
  - 平面直角座標系
  - テキストエディタ
  - MeshLab
  - MeshMixer




[数値標高モデル]

  いわゆるDEMといわれるものを入手する必要があります。
  これは国土地理院のページからダウンロードできます。
  https://fgd.gsi.go.jp/download/menu.php

  数値標高モデルのボタンを選択すると、
  エリアを選択するための画面になります。
  ダウンロードしたいエリアを選択して、
  ほしい情報にチェックを入れてダウンロードします。
  今回は5mメッシュだけいいですね。
  ※ダウンロード時にログインとパスワード認証が必要です。

  ちなみに緯度・経度がわかっていると検索しやすいです。

  ビューワーのダウンロード

 [読み込み]
  ビューワーをインストール・起動したら、
  ダウンロードしたファイルをドラッグ&ドロップでデータを読み込めます。
  ※ZIPファイルを解凍する必要はありません。

 [書き出し]
   書き出したいエリアをズームして、ビューワーの画面いっぱいにしてエクスポートします。

  "エクスポートー標高メッシュをシェープファイルへ出力" を選びます。
  ブラウズボタンからテキスト形式.IDXYZ(*.xyz)を選んで保存します。


  この時大事なのが "直角座標系に変換して出力" をチェックすることです。
  書き出しエリアが何番系なのか調べて置きましょう。

  [地図データ]
    後で航空写真をテクスチャとして貼るなら、
    地図データも出してあげると位置合わせがしやすいと思います。
    .SFCで書き出せば、JWWなどでDXF変換できます。



  書き出されたデータの中身はこんなフォーマットになっています。


  IDとX、Y、Zの座標値の4つのコラムで構成されています。


[測量座標系の変換]

  基盤情報ビューワーから書き出された点群データは測量座標系になっているらしく、
  XとYが反転しています。
  そのまま変換してCGソフトに取り込むとひっくり返ったりしてややこしくなるので、
  CGソフトに持って行く前にテキストエディタで修正してしまうと楽です。

必要なのは以下の作業です。
  - IDの列を削除  ※座標系の変化とは関係ないですが1列目は不要なので削除!
  XとYを入れ替え
  Y-Upの座標系に変換  ※Maya等、Y-Up座標系のCGソフトに持っていく場合のみ
    
正規表現を使った置換をすることになりますが、点群データのサイズがデカすぎると
その辺のテキストエディタでは開くことさえ大変になるので、自分はEmEditorを使っています。

一列目削除
 
入れ替え

    Y-Upにするには測量系を直したあと、YとZを入れ替えます。
    この時、Yは符号を反転してからZと入れ替える必要があります。
    検索置換でやるなら、Y軸にマイナスを追加して、
    あとでマイナス二つになったところを削除します。



[点群をメッシュ化]

  MeshLabを使うと取得した点群ファイルをメッシュ化できます。
  MeshLabはOpen Sourceです。


[MeshLab]

   点群データの読み込み
   Import Mesh...


  [ズレている点群を削除]
    点群の端部がガクンと落ちていたりすることがあるので目視で確認して、おかしければ
    点を選択して削除します。
    点選択ツールで選んでからDelete。
    そのまま保存すると元の.xyzファイルが更新されます。
   

  [Compute normals for point sets]
    メッシュを張るまえに法線を計算します。

    地形の場合、たいていは上から見てNormalを計算するのがよいと思います。
    ※数字キーでビューを変えることができます。
 
    Show NormalをOnにするとNormal(法線)を表示できます。
    


  [Surface Reconstruction : Ball Pivoting]
    メッシュを生成します。
    パラメータの設定がなかなか難しいので何回かトライ&エラーが必要です。
  今回は5mメッシュを取得したので6くらいから始めてみます。
    
    Pivoting Ball radiusをあまり大きくすると不正なフェースがたくさんできるので、
    小さめがベターだと思います。
    ただし、あとで穴がたくさん出来るので、修正が大変になります。
    不正なフェースなど細かいことを気にしないような状況なら
    少し大きめにしてもいいと思います。

  [Cleaning and Repairing]
    どうしても一発で完璧なメッシュが出来ることはないので、
    いろいろな手法で修正が必要です。

  Select Self Intersected Faces


  Delete Selected Faces
    大変落ちやすいので保存しながら慎重に!
    こまめにexport as meshしてOBJなどに保存しながら作業します。

  Close Holes
    塞ぎたい穴の周囲の面を選択して実行するのがベターです。
  

  周囲のフェースを選択すると重なっている面がわかるので、
  その周囲まるごと削除してからClose holesをやり直すといいです。

  Close Holesした後に真っ黒になったら、それは単に裏返っただけです。

 

  [ダウンサンプリング]
    データが重すぎて扱えないほどになってしまうようなら、
    点群を読み込んだ後にClustered Vertex Subsamplingして点群の数を減らします。






[Meshmixer]


 MeshLabsで修正しきれなかった穴をどうしても修正したいなら、Meshmixerが便利です。
http://www.meshmixer.com/

  [Inspector]
    インスペクターを使うと問題点を洗い出してくれます。
    穴を塞ぐには、青いボールをクリックしてつぶしていきます。

  [Fill Hole]
    手動で穴を塞ぎたいなら、穴の周囲の面を選択してFキー。
    Wキーを押すとワイヤーフレームを表示します。

 
  この他にも便利な機能がたくさんあるのでいろいろいじってみると面白いですよ。







2017年4月2日

Grasshopper

アプリって、使わないと忘れてしまう...。

ほとんど放置だったGrasshopperもすっかり忘れてしまいました。
やっぱり自由自在に使えたら楽しいだろうなぁって思って、またゼロからやってみることにします。
Rhinoceros + Grasshopper

2017年3月12日

html to pdf


画像とちょっとしたテキストをまとめた文書をたくさん作りたかったので、
自動処理するための簡単な方法を探してみました。


WORDでVBA?と思ったのですが、WORD持ってない...。
書き出す情報はExcelにまとめてあるのでExcel VBAでExcel文書を作るという手もあるかと思ったのですが...。
でもそもそも、そんな高度なものを作るつもりはないので簡単なのはHTMLという結論でです。


そうして出来上がった文書を他へ出すならHTMLより印刷しやすいPDFが便利です。
ということでHTMLPDF変換するソフトが必要になりました。


wkhtmltopdf

一番簡単に使えそうなのはこれですかね。
http://wkhtmltopdf.org/
URLからPDFを生成したり、ローカルのHTMLファイルも変換できます。
ダウンロードしてインストール、パスを通した後、PCの再起動が必要でした。
コマンドプロンプトから簡単に変換できます。

wkhtmltopdf test1.htm test1.pdf

大量にあってもバッチファイルを用意すれば簡単です。


pdfkit

Pythonからはpdfkitを使うと便利です。
https://pypi.python.org/pypi/pdfkit



2017年3月8日

AutoLisp : 文字をプロットする

AutoCADで文字を大量にプロットしたい時があったのですが、
以下のコマンドで行けました。

(command "_.text" "-484780.852,-346328.436" "500" "0" "文字列")

こういうフォーマットのデータを羅列したテキストファイル(.lsp)を用意して、ドラッグ&ドロップで実行できます。

2017年2月28日

地形モデリング

等高線から地形をモデリングするお仕事をいただきました。
何回やっても苦労する仕事ですね...。
formZにはTerrainツールがあるので一見簡単そうですが、それがなかなかうまく行かないんです...。



[等高線]
    クライアントから等高線データが提供される場合でも必ずしも安心できないです。
    データに様々な問題があり、'使えない'場合が多々あります。
    そもそも、CADデータを貰えない場合も多いものです。
    その場合は地図の画像をトレースして等高線データを作ることになります。


[formZ]

Terrainツールが使えない場合も多々あります。

    - 等高線が途切れている
    - 等高線の自己交差
    - 等高線が敷地範囲をしっかり跨いでいない
    - 短い線分などのゴミが混じっている
    - 等高線が多すぎる

    幸いなことにformZにはTerrainツールの実行前にこれらの問題を事前にチェックする
    Contour Dr.ツールがあり、
    チェック時に'修正を試みる'というオプションもあります。
    ただしあんまり使えなくて、結局手動で修正することになります。
    修正すべきものの数が少なければ手動でもよいのですが、何百もあったらもう無理...。




等高線に問題があっても面を張る方法はないのか?

今回、高さ情報を持った等高線データを貰えましたが、
上記のようなデータの問題で結局Terrainツールは諦めました。
ではどうしたらよいのか?




[Rhinoceros]
    Patchコマンドを使うと複数のカーブ上に面を張ることができます。
    しかも早い!サーフェースの次数を調整すればグリッド状の面も張れます。
    ただし、サーフェースの分割数に制限があるので、
    あまり細かいメッシュにはできません...。
    IGES経由でMayaに互換した後、NurbsSurface to Polygonを使うと
    グリッド状のポリゴンメッシュにできます。ただし、元がNurbsサーフェースなので、
    凸凹部分が跳ね上がったり沈み込んだりします。





もう少しディテールのあるメッシュに出来ないか?

たとえばカシミール3Dみたいな地形作成ソフトだと最小5mとか10mメッシュくらいのデータを扱います。
5mというと自動車くらいの大きさですが、細い道路なんかは潰れてしまいます。
これでも地形モデリングソフトの世界では非常に細かいものです。
でも実際はもう少し細かく表現出来たらいいのになという場合が多々あります。




[Maya nCloth]
    MayaにはnClothという '布' をシミュレートする機能があります。
    Gravity(重力)を設定すればテーブルクロスを敷くようにメッシュを物体の上に
    被せることができます。
    今回は等高線を縦方向にExtrudeしてポリゴンメッシュにし、
    それをRigidに変換してテストしてみましたが重くて動きませんでした...。
    大きすぎて無理だと諦めました。





他の方法

コンターラインの頂点を'点群'と見立てれば、点群処理用のソフトが使えるのではないかと思い、試してみました。
今回は約240万点になります。





[ReCap]
    http://www.autodesk.com/products/recap-360/overview
    どうもProバージョンが無いとメッシュの生成と書き出しができないようです...。


[MeshLab]
    http://www.meshlab.net/
    Point Cloudを扱うオープンソースソフトウェアです。
    通常はレーザースキャンで生成される点群データを扱いますが、
    点データならとりあえず取り込めます。
    今回はMayaに取り込んだ等高線カーブからCVの座標情報を
    全部書きだしてデータとしました。
    3列の座標値の羅列のテキストデータです。
 
   データを取り込んだらダウンサンプリングした後、
    平均ノーマルを計算、
    Surface Reconstruction Ball Pivoting で面を生成できます。
 
    やってみましたが、これもあまりうまく行きませんでした...。
    等高線の性格上、均等にバラ撒かれた点群にはならないので、
    ディテールを潰さないように細かい設定にすると、
    穴だらけになってしまいます。逆に穴を埋められるように
    パラメータを調整するとディテールが無くなってしまいます...。
    まあ、レーザースキャン出来れば早いんですけどね。





結局、Rhinoで作ったラフなメッシュに手動でディテールを付けることになりました。
ローポリモデリングです。ディテールを端折って形状特徴をひろっていくという地道な作業です。
手間がかかりますが、無駄なポリゴンが増えず軽くて扱いやすいデータにできます。

今のところこれがベターなのかなと思っています。