前回の記事でスロットのリール作成をBlender上で行いましたが
図柄の配列を変えるたびに画像を作り変えるのも面倒なので
リール(シリンダー形状のメッシュ)の作成とUV値の設定を自動化しました。
図柄テクスチャの作成
まずはリールに設定する図柄を一枚のテクスチャへ整理しました。
各図柄の大きさは横280px 縦156pxとなっています。
メッシュ作成を行うためのスクリプト作成
スクリプトを書くためのウインドウを開きます
(Text Editor)
何でも良いので.py拡張子で名前を付けて作成します。
ここまでで、スクリプトを書く準備はできました。
スクリプトはpythonで記述します。
スクリプト:各図柄の識別子
個々の図柄に対して以下のような識別子を作ります。
seven=0
cherry=1
bar=3
puramu=2
bell=5
suika=4
スクリプト:各図柄のUV座標
各図柄のUV値(テクスチャ上の座標)を下記のように配列で記載します。
ここの値は後に0.0~1.0の小数に変更してメッシュに設定します。
zu_px = 280
zu_py = 156
zugara = [
#7
[0,0,zu_px,zu_py*1],
#cherry
[zu_px,0,zu_px*2,zu_py*1],
# puramu
[zu_px*2,0,zu_px*3,zu_py*1],
# BAR
[zu_px*0,zu_py*1,zu_px*1,zu_py*2],
# suika
[zu_px*1,zu_py*1,zu_px*2,zu_py*2],
# bell
[zu_px*2,zu_py*1,zu_px*3,zu_py*2],
]
スクリプト:リールの配列
リーズの図柄を回転の順に記載します(左側のリール)
left=[
seven,
cherry,
bar,
puramu,
bell,
suika,
bell,
puramu,
bar,
suika,
bell,
puramu,
cherry,
seven,
puramu,
bell,
suika,
seven,
suika,
puramu,
bell,
]
スクリプト:メッシュ作成
メッシュを作るスクリプト部分を記載します。
def create_cylinder_with_front_uv(obj_name,xoff,segments, radius, width, zugaras):
# メッシュとオブジェクトを作成
mesh = bpy.data.meshes.new("CylinderMesh")
obj = bpy.data.objects.new(obj_name, mesh)
bpy.context.collection.objects.link(obj)
bpy.context.view_layer.objects.active = obj
obj.select_set(True)
# bmeshでシリンダーを作成
bm = bmesh.new()
angle_step = 2 * math.pi / segments
# 左部と右部の円に沿って頂点を作成
left_verts = []
right_verts = []
for i in range(segments):
angle = i * angle_step
y = -math.cos(angle) * radius
z = math.sin(angle) * radius
left_verts.append(bm.verts.new((-width/2+xoff, y, z)))
right_verts.append(bm.verts.new((width/2+xoff, y, z)))
bm.verts.ensure_lookup_table()
# 側面の面を作成
# Hantokei mawari
faces = []
for i in range(segments):
v1 = left_verts[i]
v4 = left_verts[(i + 1) % segments]
v3 = right_verts[(i + 1) % segments]
v2 = right_verts[i]
face = bm.faces.new((v1, v2, v3, v4))
faces.append(face)
# 上面と下面の面を作成
#bm.faces.new(left_verts)
#bm.faces.new(reversed(right_verts))
# UVマップを追加
uv_layer = bm.loops.layers.uv.new("UVMap")
# 正面の面にのみUVを設定
for i,zu in enumerate(zugaras):
map = zugara[zu]
print(zu)
u0 = map[0]
v0 = map[1]
u1 = map[2]
v1 = map[3]
face = faces[i]
# UV座標を設定 (四角いUVの配置)
# LB
face.loops[0][uv_layer].uv = (u0/1024, 1.0-v1/1024)
# LT
face.loops[3][uv_layer].uv = (u0/1024, 1.0-v0/1024)
# RT
face.loops[2][uv_layer].uv = (u1/1024, 1.0-v0/1024)
# RB
face.loops[1][uv_layer].uv = (u1/1024, 1.0-v1/1024)
# メッシュデータを更新してオブジェクトにリンク
bm.to_mesh(mesh)
bm.free()
スクリプト:メッシュ作成呼び出し
最後にここまでで用意したデータと関数を結びつけるように
メッシュ作成関数を呼び出します。
create_cylinder_with_front_uv(obj_name="ReelL",xoff=-0.1,segments=21, radius=0.15, width=0.09, zugaras=left)
#obj_name:オブジェクト名
#xoff:リールメッシュのX位置(中心点)
#segments:面の数(図柄のコマの数)
#radius:リール半径(0.15=15cm)
#width:リールのコマの幅
#zugaras:図柄の並びデータ
メッシュ作成
Text Editor上部にある「Run Script」ボタンをクリックするとリールオブジェクトが作成されます!
コメント