OneonetのPyBE

Python,Blender,Excelのいろいろ

Blender x Python でキューブを使ってマインクラフト風壁紙を自動で作る

画像ファイルを読み込み1ピクセルを1つのキューブでブロックのように積み上げて壁画のようにするスクリプトになります。キューブのサイズ半分だけずらしているので真上から見ても真横から見ても同じ画像です。

処理スピード感は、1ラインにあたるキューブ50コの処理時間が最初の1ライン目は0.1秒ですが、10ライン目2.5秒、50ライン目は16秒、100ライン目は30秒という感じでどんどん遅くなります。5000ピクセル程の小さな画像でも30分ほどかかりました。ということでほどほどのサイズでやってみてください。動画、静止画、スクリプトをご紹介します。どうすると早くなるんでしょうか。

#blender 3.0.0で動作確認
import cv2
import bpy

for item in bpy.data.meshes:
    bpy.data.meshes.remove(item)

im = cv2.imread('c:/tmp/picture.jpg')
height, width, channels = im.shape[:3]

for x in range(width):
    for y in range(height):
        b,g,r = im[y,x]
        bpy.ops.mesh.primitive_cube_add(enter_editmode=False, align='WORLD', location=(-(height-y) , x, height-y), scale=(0.5, 0.5, 0.5))
        mat_name = str( hex(r*0x10000+g*0x100+b))
        mat = bpy.data.materials.new(mat_name)
        mat.diffuse_color = (r/256, g/256, b/256, 1.0)
        bpy.context.object.data.materials.append(mat)

f:id:oneonet:20220316160843p:plain

是非動画をミラーサイトでご覧ください。
oneonet-blog.blogspot.com