DilayのOBJファイルを修正してみる

複数のメッシュを出力するとひと固まりになってしまう

スケッチベースでも使えるデジタル粘土ソフト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スクリプトで手作業を省略できるようにします。

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つのメッシュが作成されました。


関連記事