2023年3月7日火曜日

球体表面に ランダムに 半径0.1球体 20 個を 描く

















日本語で質問しますので、以下形式で回答してください。
【質問の英訳】
【英訳に対する英語の回答】
【英語の回答の日本語訳】
blender 3.4.1 python スクリプト 書いて 冒頭に import math 挿入 内容は 



半径1の球体を描く
この球体表面に ランダムに 半径0.1球体 20 個くを 描く


Question:
I would like to write a Python script in Blender 3.4.1 that begins with importing math. The content should be to draw a sphere with a radius of 1, and then draw 20 spheres with a radius of 0.1 randomly on the surface of the first sphere.

Answer:
You can use the following Python script in Blender 3.4.1 to accomplish this task:


import bpy
import math
import random

# Define the parameters
num_spheres = 20
outer_radius = 1
inner_radius = 0.1

# Create the outer sphere
bpy.ops.mesh.primitive_uv_sphere_add(radius=outer_radius)

# Create the inner spheres
for i in range(num_spheres):
    theta = random.uniform(0, 2*math.pi)
    phi = random.uniform(0, math.pi)
    x = outer_radius * math.sin(phi) * math.cos(theta)
    y = outer_radius * math.sin(phi) * math.sin(theta)
    z = outer_radius * math.cos(phi)
    bpy.ops.mesh.primitive_uv_sphere_add(radius=inner_radius, location=(x, y, z))




This script first imports the necessary modules, including math and random. It then defines the parameters for the number of spheres to create, as well as the radii of the outer and inner spheres.

The script creates the outer sphere using the primitive_uv_sphere_add function with the given outer radius. It then uses a loop to create the inner spheres. For each inner sphere, the script generates random values for the spherical coordinates theta and phi using the random.uniform function. It then uses these values to calculate the Cartesian coordinates x, y, and z of the location on the surface of the outer sphere where the inner sphere will be placed. Finally, it creates each inner sphere at the calculated location with the given inner radius.

回答:
Blender 3.4.1でPythonスクリプトを書き、冒頭にmathをインポートするには、以下のようなPythonスクリプトを使用できます。このスクリプトは、半径1の球体を描き、その表面に半径0.1の球体を20個ランダムに描画します。





import bpy
import math
import random

# パラメータを定義
num_spheres = 20
outer_radius = 1
inner_radius = 0.1

# 外側の球体を作成
bpy.ops.mesh.primitive_uv_sphere_add(radius=outer_radius)

# 内側の球体を作成
for i in range(num_spheres):
    theta = random.uniform(0, 2*math.pi)
    phi = random.uniform(0, math.pi)
    x = outer_radius * math.sin(phi) * math.cos(theta)
    y = outer_radius * math.sin(phi) * math.sin(theta)
    z = outer_radius * math.cos(phi)
    bpy.ops.mesh.primitive_uv_sphere_add(radius=inner_radius, location=(x, y, z))











「半径1の球体」の名前を変更して Big_sphere   
以下のようにスクリプトを変更することで、「半径1の球体」の名前を"Big_sphere"に変更できます。

import bpy
import math
import random

# Define the parameters
num_spheres = 20
outer_radius = 1
inner_radius = 0.1

# Create the outer sphere and rename it
bpy.ops.mesh.primitive_uv_sphere_add(radius=outer_radius)
big_sphere = bpy.context.active_object
big_sphere.name = "Big_sphere"

# Create the inner spheres
for i in range(num_spheres):
    theta = random.uniform(0, 2*math.pi)
    phi = random.uniform(0, math.pi)
    x = outer_radius * math.sin(phi) * math.cos(theta)
    y = outer_radius * math.sin(phi) * math.sin(theta)
    z = outer_radius * math.cos(phi)
    bpy.ops.mesh.primitive_uv_sphere_add(radius=inner_radius, location=(x, y, z))




スクリプトでは、まずパラメータを定義し、外側の半径を使用してprimitive_uv_sphere_add関数で外側の球体を作成します。その後、作成した球体を変数big_sphereに保存し、その名前を"Big_sphere"に変更します。最後に、内側の球体を作成します。

big_sphere = bpy.context.active_objectは、現在アクティブなオブジェクトを変数big_sphereに保存するためのコードです。big_sphere.name = "Big_sphere"は、変数big_sphereの名前を"Big_sphere"に変更するためのコードです。これにより、"半径1の球体"は"Big_sphere"に置き換えられます。













ランダム 200個にする



「半径1の球体」の名前を変更して Big_sphere   
以下のようにスクリプトを変更することで、「半径1の球体」の名前を"Big_sphere"に変更できます。

import bpy
import math
import random

# Define the parameters
num_spheres = 200
outer_radius = 1
inner_radius = 0.1

# Create the outer sphere and rename it
bpy.ops.mesh.primitive_uv_sphere_add(radius=outer_radius)
big_sphere = bpy.context.active_object
big_sphere.name = "Big_sphere"

# Create the inner spheres
for i in range(num_spheres):
    theta = random.uniform(0, 2*math.pi)
    phi = random.uniform(0, math.pi)
    x = outer_radius * math.sin(phi) * math.cos(theta)
    y = outer_radius * math.sin(phi) * math.sin(theta)
    z = outer_radius * math.cos(phi)
    bpy.ops.mesh.primitive_uv_sphere_add(radius=inner_radius, location=(x, y, z))



















繰り返し 描画









さらに 大きい球を 再度 描画しないテスト




import bpy
import math
import random

# Define the parameters
num_spheres = 200
outer_radius = 1
inner_radius = 0.1



# Create the inner spheres
for i in range(num_spheres):
    theta = random.uniform(0, 2*math.pi)
    phi = random.uniform(0, math.pi)
    x = outer_radius * math.sin(phi) * math.cos(theta)
    y = outer_radius * math.sin(phi) * math.sin(theta)
    z = outer_radius * math.cos(phi)
    bpy.ops.mesh.primitive_uv_sphere_add(radius=inner_radius, location=(x, y, z))
































ランダム 500個にする
小球体 サイズ 0.1 → 0.02


「半径1の球体」の名前を変更して Big_sphere   
以下のようにスクリプトを変更することで、「半径1の球体」の名前を"Big_sphere"に変更できます。

import bpy
import math
import random

# Define the parameters
num_spheres = 500
outer_radius = 1
inner_radius = 0.02

# Create the outer sphere and rename it
bpy.ops.mesh.primitive_uv_sphere_add(radius=outer_radius)
big_sphere = bpy.context.active_object
big_sphere.name = "Big_sphere"

# Create the inner spheres
for i in range(num_spheres):
    theta = random.uniform(0, 2*math.pi)
    phi = random.uniform(0, math.pi)
    x = outer_radius * math.sin(phi) * math.cos(theta)
    y = outer_radius * math.sin(phi) * math.sin(theta)
    z = outer_radius * math.cos(phi)
    bpy.ops.mesh.primitive_uv_sphere_add(radius=inner_radius, location=(x, y, z))

































内側の球体 すべてを 赤色に塗って


以下のように、内側の全ての球体を赤色に塗ることができます。

lua
Copy code
import bpy
import math
import random

# Define the parameters
num_spheres = 20
outer_radius = 1
inner_radius = 0.1

# Create the outer sphere and rename it to Big_sphere
bpy.ops.mesh.primitive_uv_sphere_add(radius=outer_radius)
big_sphere = bpy.context.object
big_sphere.name = 'Big_sphere'

# Create the inner spheres
for i in range(num_spheres):
    theta = random.uniform(0, 2*math.pi)
    phi = random.uniform(0, math.pi)
    x = outer_radius * math.sin(phi) * math.cos(theta)
    y = outer_radius * math.sin(phi) * math.sin(theta)
    z = outer_radius * math.cos(phi)
    bpy.ops.mesh.primitive_uv_sphere_add(radius=inner_radius, location=(x, y, z))

    # Change the color of the sphere to red
    inner_sphere = bpy.context.object
    mat = bpy.data.materials.new(name="Red")
    mat.diffuse_color = (1, 0, 0, 1)
    inner_sphere.data.materials.append(mat)
このスクリプトでは、primitive_uv_sphere_add関数を使用して内側の球体を作成します。その後、bpy.context.objectを使用して作成した球体を取得し、inner_sphereに割り当てます。そして、bpy.data.materials.newを使用して新しいマテリアルを作成し、mat.diffuse_colorを使用してマテリアルの色を赤に変更します。最後に、inner_sphere.data.materials.appendを使用して、内側の球体に赤色のマテリアルを適用します。






以下

研究中




「Blender」複数のオブジェクトにマテリアルをコピペする方法
https://mizuncoonote.blogspot.com/2021/01/blender-object-material-copy-paste.html
 







1つ1つのオブジェクトの色を替えるのではなく 一括で変えたい
すみません、前回の回答が不十分だったようです。3D viewport で選択したすべてのオブジェクトの色を一括で変更するには、以下の手順を実行してください。

3D viewport で、変更したい全てのオブジェクトを選択します。Shiftキーを押しながら複数のオブジェクトを選択することができます。
プロパティエディターを開きます。ショートカットは「N」キーです。
「Object Data Properties」タブをクリックします。
「Viewport Display」のセクションで、「Color」をクリックします。
カラーピッカーからエメラルドグリーン色を選択します。
変更が反映されるまで、3D viewport を更新します。ショートカットは「Z」キーの「Rendered」ビューポートモードに切り替えることで行うことができます。
以上の手順で、選択した全てのオブジェクトの色を一括で変更することができます。

















失敗

赤色に塗った球体すべてを エメラルドグリーン色に 塗り替えたい そこだけのスクリプト書いて


以下のように、赤色に塗った全ての内側の球体をエメラルドグリーン色に変更することができます。


このスクリプトでは、bpy.context.scene.objectsを使用してシーン内の全てのオブジェクトをループします。そして、オブジェクトの名前が"Big_sphere"ではなく、"Sphere"で始まる場合に、そのオブジェクトに適用されている全てのマテリアルについてループを行います。マテリアルが赤色である場合に、mat_slot.material.diffuse_colorを使用してマテリアルの色をエメラルドグリーン色に変更します。













伊勢丹 建物広告 球体群 配置 20240323_001

aaa y軸に 球体半径0.1を等間隔に配置して 球体の名前は Sphere_x_y_z で 小数1桁で 座標位置で 名前を作る y=+1から ー1までで 21個の球体で 作る コレクションだけを作って "y軸の球体群" import bpy #...