3次元の点群データをBlenderで可視化する
XYZの座標データが記録されているテキストデータからBlenderにインポートする方法です.テキストファイルから座標を読み取り,頂点を生成する仕組みとなっています.
テキストファイルの準備
まずは,3次元の点群データを用意しましょう.本ページのスクリプトをそのまま使いたい場合は,
点群データとして以下のようなテキストファイルを作成して任意の場所に保存してください.
このテキストファイル自体はなんとかして作ってください.Excelでも保存時にCSV出力することでカンマ区切りのテキストを吐き出せます.
データ数が多いときはPythonやRuby等(言語は何でもいい)で整形したテキストを作成します.
今回はサンプルデータとして
とある工業都市付近の標高データを用意してみました.
スクリプト
点群データをインポートするためのPythonスクリプトは以下の通りです.コピペするなり適当に使ってください.
Blender Python初心者の方は
こちらを参考にしてみてもいいと思います.
#Blender 2.80 beta
#点群データをBlenderにインポート
#実行時は必ずオブジェクトモードにしておく
import bpy
#テキストファイルを指定
TextFilePath = 'C:/tmp/XYZData.txt'
#頂点数取得
print('Loading Text File')
fp = open(TextFilePath)
Count = 1
line = fp.readline()
while line:
line = fp.readline().replace('\n', '')
Count += 1
fp.close()
#オブジェクト作成
print('Creating Object')
bpy.data.meshes.new(name='ImportMesh')
bpy.data.objects.new(name='ImportObj', object_data=bpy.data.meshes['ImportMesh'])
bpy.context.scene.collection.objects.link(bpy.data.objects['ImportObj'])
Obj = bpy.data.objects['ImportObj'].data
Obj.vertices.add(Count)
#頂点の移動
i = 0
fp = open(TextFilePath)
line = fp.readline()
while line:
dat = line.split(',')
X = float(dat[1])
Y = float(dat[2])
Z = float(dat[3])
Obj.vertices[i].co.x = X
Obj.vertices[i].co.y = Y
Obj.vertices[i].co.z = Z
line = fp.readline().replace('\n', '')
if i % 10000 == 0:
print(i)
i += 1
fp.close()
print('Finished : ' + str(i-1) + 'verts')
使用方法
- Blenderを起動します(新規作成)
- テキストエディタを開きます
(画面分割で3Dビューが一緒に見える状態がいいでしょう)
- 本ページのスクリプトをコピーしてBlender内のテキストエディタに貼り付けます
- スクリプト8行目をテキストファイルが保存されているファイルパスに書き換えます
フォルダの区切り文字は"\"ではなく"/"で入力します
- スクリプトを実行する前にシステムコンソールを表示しておきます
- オブジェクトモードになっていることを確認します
- スクリプトを実行します
([テキストエディタ]上にマウスカーソルを乗せた状態で[Alt]+[P])
あとはオブジェクトのサイズが大きすぎて表示できていないので,縮小したり位置調整をして完成となります.
注意点
本スクリプトは
Blender2.8対応です.実際に動作確認はしていませんが,恐らく
2.79以前のBlenderでは動作しません.
というのも,
Blender2.8からは
シーンの中に
コレクションという新しい要素が追加されたからなんですよねえ.どうしても
2.7xで動かしたいときは
スクリプト24行目の
".collection"部分を削ってやってください.(これで動くかは保証できないけど)
関連情報
これとは逆にBlenderのオブジェクトから頂点座標をテキストに書き出すスクリプトも作成しましたので興味があればどうぞ.
「頂点座標をテキストファイルにエクスポートするスクリプト」