OneonetのPyBE

Python,Blender,Excelのいろいろ

Blender x Python で作るQRコード

URL等の文字列からキューブメッシュでQRコードを作成するスクリプトです。ザクッとQRコードを作ってから、キューブの色、ライティング、カメラアングル等いろいろ変更してみると楽しいと思います。いろいろやってみたところで、カメラアングルのお勧めは真正面からの10度ずらしです。

ロジックとしては、「qrcode」というライブラリでQRコードの画像を生成します。その画像から、位置を指定して色を読み取り、その色に合わせて2色のマテリアルを割り当てることでQRコードを生成しています。生成した画像はどこにも現れません。

簡単にロジックやカスタマイズ箇所をご案内します。

冒頭"QR_BLOCK_SIZE=10"は、QRコードを生成するときの1ブロックのピクセル数です。画像からを解析するときに必要ですが、結果には影響しません。

"QR_CODE"に文字列を指定します。お好きなURLを指定してください。

"mat_b","mat_w"は2色のマテリアルです。黒に該当する色は濃い目の色なら何色でも構いません。濃淡を逆にすると読めないリーダーがあるようです。

forの2重ループで、QR画像から色を読み取り、色に合うマテリアルを適用させています。色やメッシュの形はかなり自由に変更できると思います。また、カメラアングルやライティングもいろいろ試してみると面白いと思います。

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

#全部メッシュの削除
for item in bpy.data.meshes:
    bpy.data.meshes.remove(item)

QR_BLOCK_SIZE = 10
QR_CODE = "https://oneonet-blog.blogspot.com/"

qr = qrcode.QRCode(box_size=QR_BLOCK_SIZE, border=0)
qr.add_data(QR_CODE)
qr.make()
img = qr.make_image(fill_color="black", back_color="white")
img_size,img_size_dummy = img.size
qr_size = img_size // QR_BLOCK_SIZE

mat_b = bpy.data.materials.new("Black")
mat_b.diffuse_color = (0, 0, 0, 1.0)

mat_w = bpy.data.materials.new("White")
mat_w.diffuse_color = (1, 1, 1, 1.0)

for z in range(qr_size):
    for x in range(qr_size):
        x_pos = x * QR_BLOCK_SIZE+1
        z_pos = z * QR_BLOCK_SIZE+1

        bpy.ops.mesh.primitive_cube_add(location=(x,0,qr_size - z), scale=(0.5, 0.5, 0.5))

        if img.getpixel((x_pos, z_pos)):
            bpy.context.object.data.materials.append(mat_w)
        else:
            bpy.context.object.data.materials.append(mat_b)

f:id:oneonet:20220316161341p:plain