2023年7月7日金曜日

20230708 sat 立方体 球体 表面 内部 ランダム分布

 


# 新しいBlenderファイルを作成
bpy.ops.wm.read_factory_settings(use_empty=True)
bpy.ops.object.select_all(action='DESELECT')

# オブジェクトを削除
bpy.ops.object.select_by_type(type='MESH')
bpy.ops.object.delete()

# カメラの設定
bpy.ops.object.camera_add(location=(0, -5, 2))
bpy.context.scene.camera = bpy.context.object

# ライトの設定
bpy.ops.object.light_add(type='SUN', location=(0, 0, 5))

# レンダリング設定
bpy.context.scene.render.engine = 'CYCLES'
bpy.context.scene.cycles.device = 'GPU'

# レンダリング実行
bpy.ops.render.render(write_still=True)






blender python

半径 0.01 の球体 100個で

1辺2の正方形内に ランダムに配置



import bpy

import random

from mathutils import Vector


# Clear existing objects

bpy.ops.object.select_all(action='DESELECT')

bpy.ops.object.select_by_type(type='MESH')

bpy.ops.object.delete()


# Create spheres

for _ in range(1000):

    x = random.uniform(-1, 1)

    y = random.uniform(-1, 1)

    z = random.uniform(-1, 1)

    location = Vector((x, y, z)).normalized() * 0.99

    bpy.ops.mesh.primitive_uv_sphere_add(radius=0.05, location=location)



Certainly! Here's the continuation:

After executing the code, you should see the 1000 spheres created in the Blender viewport. Each sphere will have a radius of 0.01 and be randomly positioned within a unit sphere of radius 0.99.

You can adjust the parameters in the code to customize the behavior. For example, you can change the number of spheres by modifying the range in the for loop (for _ in range(1000):), or you can change the radius of the spheres by modifying the radius parameter in the bpy.ops.mesh.primitive_uv_sphere_add() function.

If you want to further manipulate or modify the spheres after creating them, you can access them through the Blender API. For example, you can assign them to variables or perform operations on them using the bpy.data.objects collection.

Feel free to experiment with the code and adapt it to your specific needs. Let me know if there's anything else I can help you with!




# 球内部空間に配置

import bpy
import random
from mathutils import Vector

# 新しいBlenderファイルを作成
bpy.ops.wm.read_factory_settings(use_empty=True)
bpy.ops.object.select_all(action='DESELECT')

# オブジェクトを削除
bpy.ops.object.select_by_type(type='MESH')
bpy.ops.object.delete()

# 1000個の球体を作成
for _ in range(100):
    x = random.uniform(-1, 1)
    y = random.uniform(-1, 1)
    z = random.uniform(-1, 1)
    location = Vector((x, y, z)).normalized() * random.uniform(0.05, 0.99)
    bpy.ops.mesh.primitive_uv_sphere_add(radius=0.05, location=location)

# カメラの設定
bpy.ops.object.camera_add(location=(0, -5, 2))
bpy.context.scene.camera = bpy.context.object

# ライトの設定
bpy.ops.object.light_add(type='SUN', location=(0, 0, 5))

# レンダリング設定
bpy.context.scene.render.engine = 'CYCLES'
bpy.context.scene.cycles.device = 'GPU'

# レンダリング実行
bpy.ops.render.render(write_still=True)


このスクリプトでは、球体の内部空間にランダムに配置するために、位置の計算部分を変更しました。locationの計算では、ランダムな位置のベクトルを正規化し、0.05から0.99の範囲で乗算することで、内部空間に球体を配置しています。



コレクションを作る

名前は

”立方体 内部 blue1000"
”立方体 内部 red100"
”立方体 表面 blue1000"
”立方体 表面 red100"
”球体 内部 blue1000"
”球体 内部 red100"
”球体 表面 blue1000"
”球体 表面 red100"

import bpy

# 立方体内部の青いオブジェクト用コレクションの作成
cube_inner_blue_collection = bpy.data.collections.new("立方体 内部 blue1000")
bpy.context.scene.collection.children.link(cube_inner_blue_collection)

# 立方体内部の赤いオブジェクト用コレクションの作成
cube_inner_red_collection = bpy.data.collections.new("立方体 内部 red100")
bpy.context.scene.collection.children.link(cube_inner_red_collection)

# 立方体表面の青いオブジェクト用コレクションの作成
cube_surface_blue_collection = bpy.data.collections.new("立方体 表面 blue1000")
bpy.context.scene.collection.children.link(cube_surface_blue_collection)

# 立方体表面の赤いオブジェクト用コレクションの作成
cube_surface_red_collection = bpy.data.collections.new("立方体 表面 red100")
bpy.context.scene.collection.children.link(cube_surface_red_collection)

# 球体内部の青いオブジェクト用コレクションの作成
sphere_inner_blue_collection = bpy.data.collections.new("球体 内部 blue1000")
bpy.context.scene.collection.children.link(sphere_inner_blue_collection)

# 球体内部の赤いオブジェクト用コレクションの作成
sphere_inner_red_collection = bpy.data.collections.new("球体 内部 red100")
bpy.context.scene.collection.children.link(sphere_inner_red_collection)

# 球体表面の青いオブジェクト用コレクションの作成
sphere_surface_blue_collection = bpy.data.collections.new("球体 表面 blue1000")
bpy.context.scene.collection.children.link(sphere_surface_blue_collection)

# 球体表面の赤いオブジェクト用コレクションの作成
sphere_surface_red_collection = bpy.data.collections.new("球体 表面 red100")
bpy.context.scene.collection.children.link(sphere_surface_red_collection)







# 立方体 内部空間に配置

import bpy
import random

# 立方体のサイズ
cube_size = 2.0

# オブジェクトの数
object_count = 1000

# オブジェクトをランダムに配置
for _ in range(object_count):
    # ランダムな位置を生成
    x = random.uniform(-cube_size/2, cube_size/2)
    y = random.uniform(-cube_size/2, cube_size/2)
    z = random.uniform(-cube_size/2, cube_size/2)

    # 立方体内にオブジェクトを配置
    bpy.ops.mesh.primitive_uv_sphere_add(radius=0.05, location=(x, y, z))



# 立方体 表面に配置

import bpy
import random


# 立方体のサイズ
cube_size = 2.0

# オブジェクトの数
object_count = 100

# 立方体の表面にオブジェクトをランダムに配置
for _ in range(object_count):
    # ランダムな面を選択
    face_index = random.randint(0, 5)
    
    # 面の中心の位置を計算
    if face_index == 0:  # 前面
        x = random.uniform(-cube_size / 2, cube_size / 2)
        y = random.uniform(-cube_size / 2, cube_size / 2)
        z = cube_size / 2
    elif face_index == 1:  # 後面
        x = random.uniform(-cube_size / 2, cube_size / 2)
        y = random.uniform(-cube_size / 2, cube_size / 2)
        z = -cube_size / 2
    elif face_index == 2:  # 上面
        x = random.uniform(-cube_size / 2, cube_size / 2)
        y = cube_size / 2
        z = random.uniform(-cube_size / 2, cube_size / 2)
    elif face_index == 3:  # 底面
        x = random.uniform(-cube_size / 2, cube_size / 2)
        y = -cube_size / 2
        z = random.uniform(-cube_size / 2, cube_size / 2)
    elif face_index == 4:  # 左側面
        x = -cube_size / 2
        y = random.uniform(-cube_size / 2, cube_size / 2)
        z = random.uniform(-cube_size / 2, cube_size / 2)
    elif face_index == 5:  # 右側面
        x = cube_size / 2
        y = random.uniform(-cube_size / 2, cube_size / 2)
        z = random.uniform(-cube_size / 2, cube_size / 2)

    bpy.ops.mesh.primitive_uv_sphere_add(radius=0.05, location=(x, y, z))




# 球体 表面に 配置

import bpy
import random
from math import pi, cos, sin


# 球体の半径とオブジェクトの数
sphere_radius = 1.0
object_count = 100

# オブジェクトを球体表面にランダムに配置
for _ in range(object_count):
    # 球面座標系でのランダムな角度を生成
    theta = random.uniform(0, 2 * pi)
    phi = random.uniform(0, pi)

    # 球面座標からデカルト座標への変換
    x = sphere_radius * sin(phi) * cos(theta)
    y = sphere_radius * sin(phi) * sin(theta)
    z = sphere_radius * cos(phi)

    bpy.ops.mesh.primitive_uv_sphere_add(radius=0.05, location=(x, y, z))




このスクリプトでは、球体の半径とオブジェクトの数を指定し、球面座標系でランダムな角度を生成してからデカルト座標に変換します。それにより、球体表面上にランダムにオブジェクトを配置します。




# 半径1の球体 内部空間に分布

import bpy
import random
from mathutils import Vector

# 球体の半径とオブジェクトの数
sphere_radius = 1.0
object_count = 100

# オブジェクトを球体内部にランダムに配置
for _ in range(object_count):
    # ランダムな3Dベクトルを生成
    random_vector = Vector((random.uniform(-1, 1), random.uniform(-1, 1), random.uniform(-1, 1)))
    
    # ランダムな3Dベクトルを正規化して球体内に配置
    location = random_vector.normalized() * random.uniform(0, sphere_radius)
    
    bpy.ops.mesh.primitive_uv_sphere_add(radius=0.05, location=location)



aaaa

a

ああああああああああああああああああああああ





blender pytohn で


0,0,0

1,1,0を

対角線とする正方形をつくる


This updated code will create a square with vertices at (1, 1, 0), (1, -1, 0), (-1, -1, 0), and (-1, 1, 0).


import bpy

from mathutils import Matrix


# Create the vertices of the square

vertices = [

    (1, 1, 0),

    (1, -1, 0),

    (-1, -1, 0),

    (-1, 1, 0)

]


# Create the edges of the square

edges = [

    (0, 1),

    (1, 2),

    (2, 3),

    (3, 0)

]


# Create a new mesh and object

mesh = bpy.data.meshes.new("SquareMesh")

obj = bpy.data.objects.new("Square", mesh)


# Link the object to the scene

scene = bpy.context.scene

scene.collection.objects.link(obj)


# Create the mesh data

mesh.from_pydata(vertices, edges, [])


# Set the diagonal length to 1

diagonal_length = 1

scale_factor = diagonal_length / (2 ** 0.5)

matrix = Matrix.Scale(scale_factor, 3, (0, 0, 0))

obj.matrix_world = matrix


# Select the object and enter edit mode

bpy.context.view_layer.objects.active = obj

bpy.ops.object.mode_set(mode="EDIT")

bpy.ops.mesh.select_all(action="SELECT")


# Scale the object to set the diagonal length to 1

bpy.ops.transform.resize(value=(diagonal_length, diagonal_length, 1))


# Exit edit mode

bpy.ops.object.mode_set(mode="OBJECT")




マテリアルにして

表と裏の色を


表 濃い緑

裏 薄い緑


オブジェクトに 名前を使える ”正方形2x2x2"