スケッチベースでも使えるデジタル粘土ソフトDilayはいたずら描き感覚でモデリングができるすてきなソフトなんだけど、出力データに複数のメッシュが含まれているとBlenderにインポートした時化けてしまう。
DilayのOBJファイル
OBJはテキストエディタで読めるファイルなので開いて中を見てみます。“o"というオブジェクト名・“v"で始まる頂点データ・“f"で始まるポリゴン面要素の3種類の行で構成されています。
o
v -0.424239 -0.365115 -0.308144
v -0.378294 -0.340542 -0.326604
…
f 6 7 2
f 2 1 6
…
o
v -0.215013 -0.328235 0.231146
v -0.18893 -0.330672 0.229857
…
f 11 2 1
f 11 1 10
…
Pythonスクリプトで手作業を省略
“o”/“v”/“f"のブロックをひとつずつファイルに書き出してそれらをBlenderでインポートすれば化けません。単純作業の繰り返しなのでPythonスクリプトで手作業を省略できるようにします。
Dilayの保存名は"test.obj”、修正ファイルは"out+2桁の連番+.obj"で固定ということで。
# Dilayの複数オブジェクトが一体化してしまう問題
wrkDir = "path/to/workingDir"
dilayOut = wrkDir + "test.obj"
import os
os.chdir(wrkDir)
def dilayOBJfix():
'''
dilayOutを読み込んで一つのメッシュごとにout01, out02, …
小分けのobjファイルを作る
'''
# outxx.objを消去
objFiles = []
for f in os.listdir(wrkDir):
if os.path.isfile(f) and f.startswith("out") and f.endswith(".obj"):
objFiles.append(f)
for i in objFiles:
os.remove(i)
# dilayOutを1行ずつ読む
with open(dilayOut, "r") as f:
txts = f.readlines()
All = ""
for i in txts:
All = All + i
Divs = All.split("o\n")
loop = 1
OutFile = "out" + str(loop).zfill(2) + ".obj"
for j in Divs:
if len(j) != 0:
OutData = "o\n" + j
f = open(OutFile, "w")
f.writelines(OutData)
f.close()
loop += 1
OutFile = "out" + str(loop).zfill(2) + ".obj"
def importOBJs():
'''
Blender内でoutxx.objをインポート
'''
import bpy
# objファイルのリスト
objFiles = []
for f in os.listdir(wrkDir):
if os.path.isfile(f) and f.startswith("out") and f.endswith(".obj"):
objFiles.append(f)
# objファイルをあるだけインポート
for i in objFiles:
bpy.ops.import_scene.obj(filepath=wrkDir + i)
# :*:・。,☆゚'・:*:・。,。・:*:・゚'☆,。・:*:*:・。,☆゚'・:*:・。,。・:*:・゚'☆,。・:*:
if __name__ == "__main__":
# Part 1
dilayOBJfix()
# Part 2
importOBJs()
画像の例では"out01.obj"と"out02.obj"を読み込んで2つのメッシュが作成されました。