【SketchUp/Blender】SketchUpモデルをBlenderで仕上げる③

SketchUp

前回は、Blenderで編集するためのSketchUpデータ作成のポイントなどを紹介しました。

前回記事:【SketchUp/Blender】SketchUpモデルをBlenderで仕上げる②

本記事では、Blenderで編集している最中にやっぱりSketchUpでモデルを修正したくなったときを想定し、修正したSketchUpのモデルをBlenderに再読み込みする流れについて紹介します。

※ 本記事で使用したバージョンはSketchUp2021, Blender3.1.2です。

モデルの準備

前回記事のリビングルームのモデルを修正し、間取り拡張してみました。これを前回同様、まずOBJ形式で書き出します。

再読み込みの問題点

前回の.blendファイルを開き、これまで作ったオブジェクトを一旦非表示にしておきます。

新しいOBJをインポートし、これまで同様のデータの下処理(Clear sharp → Clear Custom Split Normals Data → マテリアルごとにオブジェクトを分割)を行います。

ここでマテリアルの問題が発生します。新しく読み込んだモデルには新規のマテリアルが付与され、マテリアル名も末尾に.001が付いたものになっています。例えばfloor_matというマテリアルをSketchUpで割り当てていた部分はfloor_mat.001という新規マテリアルが割り当てられます。

「折角マテリアルをBlenderで調整していたのに、新しいマテリアルに置き換わってしまった!」と残念に思うかもしれませんが、前回調整したfloor_matが消えてしまったわけではないので、一つ一つ(例えばfloor_mat.001をfloor_matに)手で割り当て直すこともできます。ですが、これはマテリアル数が多ければかなりの手間となります。

この問題の解決手段として、末尾に.001が付いたマテリアルを削除し、元のマテリアルを割り当て直すBlenderスクリプトがあるので、それを紹介します。

Blenderスクリプトの紹介

BlenderのScriptingタブNewをクリックし、右側の欄に下記のスクリプトをコピー&ペーストします。

import bpy

def replace_material(bad_mat, good_mat):
    bad_mat.user_remap(good_mat)
    bpy.data.materials.remove(bad_mat)
    
    
def get_duplicate_materials(og_material):
    
    common_name = og_material.name
    
    if common_name[-3:].isnumeric():
        common_name = common_name[:-4]
    
    duplicate_materials = []
    
    for material in bpy.data.materials:
        if material is not og_material:
            name = material.name
            if name[-3:].isnumeric() and name[-4] == ".":
                name = name[:-4]
            
            if name == common_name:
                duplicate_materials.append(material)
    
    text = "{} duplicate materials found"
    print(text.format(len(duplicate_materials)))
    
    return duplicate_materials


def remove_all_duplicate_materials():
    i = 0
    while i < len(bpy.data.materials):
        
        og_material = bpy.data.materials[i]
        
        print("og material: " + og_material.name)
        
        # get duplicate materials
        duplicate_materials = get_duplicate_materials(og_material)
        
        # replace all duplicates
        for duplicate_material in duplicate_materials:
            replace_material(duplicate_material, og_material)
        
        # adjust name to no trailing numbers
        if og_material.name[-3:].isnumeric() and og_material.name[-4] == ".":
            og_material.name = og_material.name[:-4]
            
        i = i+1
    

remove_all_duplicate_materials()

出典:https://blender.stackexchange.com/questions/75790/how-to-merge-around-300-duplicate-materials/195474#195474

実行ボタンを押すと、「.001」付きのマテリアルが消え、元のマテリアルに割り当て直されました。

スクリプト適用後のワークフロー

ここまで出来たら、from_skpコレクション内の古いデータを全て削除し、新しいオブジェクトをfrom_skpの中に入れておきます。

ダミー用のオブジェクトを削除します(家具の位置調整が終わるまでアタリとして残しておいてもOK)。また、edited_allコレクションを非表示から表示に戻し、重複しているオブジェクトも削除します。

あとは再び家具や小物の位置などを調整して仕上げます。これで完成です!

注意点

外部アセットを使用している場合、たまにマテリアル名が整理されておらず、Material、Material.001、Material.002のように末尾に.001の付いた名前となっていることがあります。この場合、このスクリプトを実行した際にMaterial.001、Material.002の方が消えてしまうので注意しましょう。

このような場合は、事前にマテリアル名を変更しておけばOKです。(後ろに.001、.002・・・が付かなければ何でもいいので、例えばMaterial01、Material02のような名前にしてもOKです。)

まとめ

ここまで3つの記事に渡って、SketchUpのモデルをBlenderで仕上げるためのワークフローを紹介しました。

ここで紹介した流れは私の個人的なやり方なので、世の中のプロダクションはもっと違うアプローチをしているかもしれませんが、もし同じようなことをしようとしている方の参考になれば嬉しいです。

以上.

タイトルとURLをコピーしました