Hexagonal infinite tessellation rotation 2#b3d pic.twitter.com/Wk4sdYwMUX
— hibit (@hibit_at) November 22, 2023
こういうやつを作ります。Blender スクリプトを使います。
メッシュを敷き詰める
import bpy
import math
import random
# 六角形タイルの設定
tile_radius = 1.0 # タイルの半径
rows = 20 # 行の数
cols = 20 # 列の数
# アニメーションの設定
animation_duration = 60 # アニメーションの総時間(秒)
frame_rate = 24 # フレームレート
total_frames = animation_duration * frame_rate
tiles_to_animate_per_frame = 30 # 1フレームあたりにアニメーションを適用するタイルの数
material_name = "Material" # ここに適用したいマテリアルの名前を設定
# 六角形タイルを生成する関数
def create_hex_tile(x, y, radius):
bpy.ops.mesh.primitive_cylinder_add(vertices=6, radius=radius, depth=0.1, location=(x, y, 0))
# タイルを配置する関数
def place_tiles(rows, cols, radius):
row_height = 1.5 * radius
for row in range(rows):
for col in range(cols):
x = col * math.sqrt(3) * radius
y = row * row_height
if row % 2 == 1:
x += radius * math.sqrt(3)/2
create_hex_tile(x, y, radius)
# タイルにアニメーションを設定する関数
def animate_tile(tile, start_frame, end_frame, start_angle, end_angle):
tile.rotation_mode = 'XYZ'
# 開始フレームでの回転を設定(指定された開始角度)
tile.rotation_euler[2] = start_angle
tile.keyframe_insert(data_path="rotation_euler", frame=start_frame)
# 終了フレームでの回転を設定(指定された終了角度)
tile.rotation_euler[2] = end_angle
tile.keyframe_insert(data_path="rotation_euler", frame=end_frame)
# タイルの配置を開始
place_tiles(rows, cols, tile_radius)
# 生成されたタイルのリストを取得
tiles = [obj for obj in bpy.data.objects if obj.type == 'MESH' and "Cylinder" in obj.name]
# タイル回転の記録しながら相対回転を定義
n = len(tiles)
m = total_frames//frame_rate
tile_rotation_info = [[0]*(n) for i in range(m+1)]
tile_idx = list(range(n))
for i in range(m):
selected_tiles_idx = random.sample(tile_idx,30)
for idx in range(n):
start_angle = tile_rotation_info[i][idx]
if idx in selected_tiles_idx:
tile_rotation_info[i+1][idx] = start_angle + math.radians(random.randint(-1,1)*60)
else:
tile_rotation_info[i+1][idx] = start_angle
end_angle = tile_rotation_info[i+1][idx]
animate_tile(tiles[idx],i*frame_rate,(i+0.5)*frame_rate,start_angle,end_angle)
# マテリアルを取得(存在しない場合は新規作成)
material = bpy.data.materials.get(material_name)
if material is None:
material = bpy.data.materials.new(name=material_name)
# すべてのタイルにマテリアルを適用
for tile in tiles:
if len(tile.data.materials) == 0:
tile.data.materials.append(material)
else:
tile.data.materials[0] = material
# すべてのタイルのアニメーションデータを削除(デバッグ用)
# for tile in tiles:
# tile.rotation_euler = (0,0,0)
# tile.animation_data_clear()…
Source: python
六角形無限回転テセレーションの作り方(Blender)