これを参考に
import bpy
import random
# タグ名
tag_name = "zion cone"
# コレクションを取得する
collection = bpy.data.collections.get(tag_name)
# コレクションが存在しない場合は作成する
if not collection:
collection = bpy.data.collections.new(tag_name)
bpy.context.scene.collection.children.link(collection)
# 円錐を作成する
bpy.ops.mesh.primitive_cone_add(radius1=300, depth=300)
# 作成したオブジェクトをコレクションに追加する
obj = bpy.context.active_object
collection.objects.link(obj)
import bpy
# タグ名
tag_name = "zion cone"
# コレクションを取得する
collection = bpy.data.collections.get(tag_name)
# コレクションが存在しない場合は作成する
if not collection:
collection = bpy.data.collections.new(tag_name)
bpy.context.scene.collection.children.link(collection)
# 円錐を作成する
bpy.ops.mesh.primitive_cone_add(radius1=300, depth=600)
# 作成したオブジェクトをコレクションに追加する
obj = bpy.context.active_object
collection.objects.link(obj)
# オブジェクトの変換を変更する
obj.location = (-600, 0, 0) # 円錐の頂点を指定
obj.data.vertices[0].co = (0, 0, 300) # 円錐底面の中心を指定
import bpy
import random
# タグ名
tag_name = "zion cone"
# コレクションを取得する
collection = bpy.data.collections.get(tag_name)
# コレクションが存在しない場合は作成する
if not collection:
collection = bpy.data.collections.new(tag_name)
bpy.context.scene.collection.children.link(collection)
# 円錐を作成する
bpy.ops.mesh.primitive_cone_add(radius1=100, depth=200)
# 作成したオブジェクトをコレクションに追加する
obj = bpy.context.active_object
collection.objects.link(obj)
# オブジェクトの位置を変更する
obj.location = (0, 0, 0)
# カメラの位置を設定する
cam = bpy.data.objects["Camera"]
cam.location = (0, 500, 0)
# カメラをオブジェクトに向ける
look_at_vector = obj.location - cam.location
rot_quat = look_at_vector.to_track_quat('Z', 'Y')
cam.rotation_euler = rot_quat.to_euler()
# オブジェクトが画面内に収まるようにカメラ位置を微調整する
bpy.ops.view3d.camera_to_view_selected()
円錐をランダムに 50個 obj.location = (0, 0, 0) から500 離れた位置に 円錐の頂点を置いて 円錐の底面中心が700 離れた位置になるようにして
2 / 2
以下のようにスクリプトを書くことで、ランダムな位置に円錐を50個生成し、円錐の頂点を指定された距離に配置することができます。また、円錐の底面中心が指定された距離になるように、底面の中心を計算して位置を微調整しています。
import bpy
import random
# タグ名
tag_name = "zion cone"
# コレクションを取得する
collection = bpy.data.collections.get(tag_name)
# コレクションが存在しない場合は作成する
if not collection:
collection = bpy.data.collections.new(tag_name)
bpy.context.scene.collection.children.link(collection)
# 円錐を50個作成する
for i in range(50):
# 円錐を作成する
bpy.ops.mesh.primitive_cone_add(radius1=100, depth=200)
# 作成したオブジェクトをコレクションに追加する
obj = bpy.context.active_object
collection.objects.link(obj)
# 円錐の頂点位置を指定された距離に移動する
obj.location = (random.uniform(-500, 500), random.uniform(-500, 500), random.uniform(0, 500))
# 円錐の底面中心が指定された距離になるように微調整する
bottom_center = obj.location - (0, 0, obj.dimensions.z/2)
obj.location += (0, 0, 700 - bottom_center.z)
# マテリアルを作成する
mat = bpy.data.materials.new(name=f"MyMaterial_{i}")
mat.diffuse_color = (random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1))
# オブジェクトにマテリアルを割り当てる
if obj.data.materials:
obj.data.materials[0] = mat
else:
obj.data.materials.append(mat)
# カメラの位置を設定する
cam = bpy.data.objects["Camera"]
cam.location = (0, 0, 1000)
# カメラをオブジェクトに向ける
look_at_vector = collection.objects[0].location - cam.location
rot_quat = look_at_vector.to_track_quat('Z', 'Y')
cam.rotation_euler = rot_quat.to_euler()
# オブジェクトが画面内に収まるようにカメラ位置を微調整する
bpy.ops.view3d.camera_to_view_selected()
from vapory import *
# 2つの円錐頂点
v1 = [-600, 0, 0]
v2 = [600, 0, 0]
# 円錐の底面中心を求める
center = [(v1[0] + v2[0]) / 2, (v1[1] + v2[1]) / 2, (v1[2] + v2[2]) / 2]
# 円錐の高さと半径
height = 300
radius = 300
# 円錐の底面を中心に配置するための変換行列
translate_matrix = [Translation([center[0], center[1] - radius, center[2]])]
# 円錐の生成
cone = Cone(v1, height, v2, radius, Texture(Pigment('color', [1, 1, 1])))
# カメラの設定
camera = Camera('location', [0, 0, -1000], 'look_at', [0, 0, 0])
# ライトの設定
light = LightSource([0, 0, -1000], 'color', [1, 1, 1])
# 3Dシーンの生成
scene = Scene(camera, objects=[light, cone], included=['colors.inc'])
# 画像の保存
scene.render('cone.png', width=800, height=600, antialiasing=0.01, auto_camera=True, include_alpha=False, remove_temp=True, quality=11)
2つ円錐頂点 (-600,0,0)
(600,0,0)
円錐の頂点と
円錐底面の中心が 2つの円錐頂点が存在する直線上にする
円錐高さ 300
円錐底面半径 300
bbb