import bpy
from random import randint
# 球体を作成する関数
def create_sphere(x, y, z, radius):
bpy.ops.mesh.primitive_uv_sphere_add(location=(x, y, z), radius=radius)
# ランダムな座標を返す関数
def random_location():
x = randint(-5, 5)
y = randint(-5, 5)
z = randint(-5, 5)
return (x, y, z)
# 5つの球体を作成
for i in range(5):
location = random_location()
create_sphere(location[0], location[1], location[2], 1)
ランダムではなく、 カシオペア座の5つの恒星 その3次元 宇宙内の相対位置を再現して
カシオペア座の5つの恒星の相対位置を再現するためには、各恒星の座標を知る必要があります。これらの座標を手動で入力することもできますが、以下のように、座標データを使用することもできます。
import bpy
# カシオペア座の5つの恒星の座標
coordinates = [(4.23, 56.87, 13.04),
(3.19, 61.75, -0.28),
(1.62, 58.75, -18.45),
(0.11, 59.15, 16.52),
(1.83, 54.93, 10.96)]
# 球体を作成する関数
def create_sphere(x, y, z, radius):
bpy.ops.mesh.primitive_uv_sphere_add(location=(x, y, z), radius=radius)
# 各恒星の座標に球体を作成
for coordinate in coordinates:
create_sphere(coordinate[0], coordinate[1], coordinate[2], 1)
地球から見た カシオペア座の方向に回転させて
カシオペア座の方向に回転するためには、Blenderのシーン内のカメラを変更する必要があります。以下のスクリプトでは、カシオペア座の方向にカメラを向け、それをアクティブなカメラとして設定しています。
import bpy
import mathutils
# カシオペア座の5つの恒星の座標
coordinates = [(4.23, 56.87, 13.04),
(3.19, 61.75, -0.28),
(1.62, 58.75, -18.45),
(0.11, 59.15, 16.52),
(1.83, 54.93, 10.96)]
# 球体を作成する関数
def create_sphere(x, y, z, radius):
bpy.ops.mesh.primitive_uv_sphere_add(location=(x, y, z), radius=radius)
# カメラをカシオペア座の方向に向ける関数
def point_camera_to_cassiopeia(camera):
# カメラの位置を定義
camera_location = mathutils.Vector((0, 0, 0))
# カシオペア座の重心座標を求める
center = mathutils.Vector((sum([c[0] for c in coordinates])/5,
sum([c[1] for c in coordinates])/5,
sum([c[2] for c in coordinates])/5))
# カメラの方向を設定
camera_direction = (center - camera_location).normalized()
# カメラの回転を設定
camera.rotation_mode = 'QUATERNION'
camera.rotation_quaternion = camera_direction.to_track_quat('-Z', 'Y')
# カメラの位置を設定
camera.location = camera_direction * -15
# カメラを作成
camera = bpy.data.cameras.new("Camera")
camera_obj = bpy.data.objects.new("Camera", camera)
bpy.context.scene.camera = camera_obj
# カメラをカシオペア座の方向に向ける
point_camera_to_cassiopeia(camera_obj)
# 各恒星の座標に球体を作成
for coordinate in coordinates:
create_sphere(coordinate[0], coordinate[1], coordinate[2], 1)
以下は エラーなのか
地球や
恒星の大きさ指定が
小さ過ぎたか
地球からのカシオペア座までの距離比で
恒星を球体1の大きさで描くを 最初に指定してたから
地球も描いて カシオペア座との相対距離を 恒星5つと比例させて 地球を10光年長さの半径大きさで描き 5つの恒星を5光年長さの半径で描いて
以下のスクリプトでは、前回のスクリプトに加えて、地球を描き、カシオペア座の5つの恒星との距離を比例させてそれぞれのオブジェクトを配置しています。地球は半径10光年の球体として作成され、カシオペア座の恒星は半径5光年の球体として作成されます。
import bpy
import mathutils
import math
# カシオペア座の5つの恒星の座標
coordinates = [(4.23, 56.87, 13.04),
(3.19, 61.75, -0.28),
(1.62, 58.75, -18.45),
(0.11, 59.15, 16.52),
(1.83, 54.93, 10.96)]
# 球体を作成する関数
def create_sphere(x, y, z, radius, name):
bpy.ops.mesh.primitive_uv_sphere_add(location=(x, y, z), radius=radius)
sphere = bpy.context.object
sphere.name = name
# カメラをカシオペア座の方向に向ける関数
def point_camera_to_cassiopeia(camera):
# カメラの位置を定義
camera_location = mathutils.Vector((0, 0, 0))
# カシオペア座の重心座標を求める
center = mathutils.Vector((sum([c[0] for c in coordinates])/5,
sum([c[1] for c in coordinates])/5,
sum([c[2] for c in coordinates])/5))
# カメラの方向を設定
camera_direction = (center - camera_location).normalized()
# カメラの回転を設定
camera.rotation_mode = 'QUATERNION'
camera.rotation_quaternion = camera_direction.to_track_quat('-Z', 'Y')
# カメラの位置を設定
camera.location = camera_direction * -15
# カメラを作成
camera = bpy.data.cameras.new("Camera")
camera_obj = bpy.data.objects.new("Camera", camera)
bpy.context.scene.camera = camera_obj
# カメラをカシオペア座の方向に向ける
point_camera_to_cassiopeia(camera_obj)
# 各恒星の座標に球体を作成
for i, coordinate in enumerate(coordinates):
name = "Star_" + str(i+1)
distance = math.sqrt(sum([c**2 for c in coordinate])) # カシオペア座の恒星との距離
scale = distance / 5 # カシオペア座の恒星との距離に比例してサイズを設定
create_sphere(coordinate[0], coordinate[1], coordinate[2], scale, name)
# 地球を作成
earth_scale = 10 # 地球のサイズ
create_sphere(0, 0, 0, earth_scale, "Earth")
恒星の大きさを 半径 0.1 光年長さにして
恒星の大きさを半径 0.1 光年にするには、以下のように create_sphere 関数を呼び出す際に、2つ目の引数である半径の値を 0.1 に変更します。
球体内 球体の完成
import bpy
import math
# 球体を作成する関数
def create_sphere(x, y, z, radius, name):
bpy.ops.mesh.primitive_uv_sphere_add(location=(x, y, z), radius=radius)
obj = bpy.context.active_object
obj.name = name
# 恒星の座標を設定
star_coords = [(2.5, 4, 5), (1, -3, -4), (-3, 2, 1), (4, -3, 2), (-4, 4, -1)]
# 恒星を作成
for i, coord in enumerate(star_coords):
x, y, z = coord
create_sphere(x, y, z, 0.1, f"Star{i+1}")
# 地球を作成
earth_scale = 10 # 地球のサイズ
create_sphere(0, 0, 0, earth_scale, "Earth")
# カメラの位置と向きを設定
bpy.ops.object.camera_add(location=(0, -20, 0), rotation=(math.pi/2, 0, math.pi))
# ランダムな回転を加える
bpy.ops.transform.rotate(value=math.pi/4, orient_axis='X')
bpy.ops.transform.rotate(value=math.pi/4, orient_axis='Z')
# カメラの注視点を変更
bpy.context.scene.camera.data.type = 'ORTHO'
bpy.context.scene.camera.data.ortho_scale = 15
bpy.context.scene.camera.constraints.new(type='TRACK_TO')
bpy.context.scene.camera.constraints['Track To'].target = bpy.data.objects['Earth']
# 恒星と地球の距離を設定
star_distances = [5, 4, 7, 3, 8]
for i, distance in enumerate(star_distances):
bpy.data.objects[f"Star{i+1}"].scale *= distance
bpy.data.objects['Earth'].scale *= 10
# ライトを作成
bpy.ops.object.light_add(type='SUN', location=(0, 0, 10))
# レンダリングの設定
bpy.context.scene.render.engine = 'CYCLES'
bpy.context.scene.cycles.samples = 200
bpy.context.scene.render.image_settings.file_format = 'PNG'
bpy.context.scene.render.filepath = "//blender_render.png"
bpy.ops.render.render(write_still=True)
import bpy
import math
# 球体を作成する関数
def create_sphere(x, y, z, radius, name):
bpy.ops.mesh.primitive_uv_sphere_add(location=(x, y, z), radius=radius)
obj = bpy.context.active_object
obj.name = name
# 恒星の座標を設定
star_coords = [(2.5, 4, 5), (1, -3, -4), (-3, 2, 1), (4, -3, 2), (-4, 4, -1)]
# 恒星を作成
for i, coord in enumerate(star_coords):
x, y, z = coord
create_sphere(x, y, z, 0.05, f"Star{i+1}")
# 地球を作成
earth_scale = 0.1 # 地球のサイズ
create_sphere(0, 0, 0, earth_scale, "Earth")
# カメラの位置と向きを設定
bpy.ops.object.camera_add(location=(0, -20, 0), rotation=(math.pi/2, 0, math.pi))
# ランダムな回転を加える
bpy.ops.transform.rotate(value=math.pi/4, orient_axis='X')
bpy.ops.transform.rotate(value=math.pi/4, orient_axis='Z')
# カメラの注視点を変更
bpy.context.scene.camera.data.type = 'ORTHO'
bpy.context.scene.camera.data.ortho_scale = 15
bpy.context.scene.camera.constraints.new(type='TRACK_TO')
bpy.context.scene.camera.constraints['Track To'].target = bpy.data.objects['Earth']
# 恒星と地球の距離を設定
star_distances = [5, 4, 7, 3, 8]
for i, distance in enumerate(star_distances):
bpy.data.objects[f"Star{i+1}"].scale *= distance
bpy.data.objects['Earth'].scale *= 10
# ライトを作成
bpy.ops.object.light_add(type='SUN', location=(0, 0, 10))
# レンダリングの設定
bpy.context.scene.render.engine = 'CYCLES'
bpy.context.scene.cycles.samples = 200
bpy.context.scene.render.image_settings.file_format = 'PNG'
bpy.context.scene.render.filepath = "//blender_render.png"
bpy.ops.render.render(write_still=True)
地球の半径を 1光年に設定して 全文 書き直して
恒星の大きさを半径 0.1 光年に、地球の大きさを半径 1 光年に設定するためには、以下のように create_sphere 関数を呼び出す際に、4つ目の引数である半径の値を恒星の場合は 0.1、地球の場合は 1 に変更します。
また、恒星と地球の距離も、恒星の場合は 5 光年以下の値、地球の場合は 10 光年以下の値に設定する必要があります。
以下が、全体を書き直したスクリプトです。
エラー
import bpy
import math
# 球体を作成する関数
def create_sphere(x, y, z, radius, name):
bpy.ops.mesh.primitive_uv_sphere_add(location=(x, y, z), radius=radius)
obj = bpy.context.active_object
obj.name = name
# 恒星の座標を設定
star_coords = [(2.5, 4, 5), (1, -3, -4), (-3, 2, 1), (4, -3, 2), (-4, 4, -1)]
# 恒星を作成
for i, coord in enumerate(star_coords):
x, y, z = coord
create_sphere(x, y, z, 0.1, f"Star{i+1}")
# 地球を作成
create_sphere(0, 0, 0, 1, "Earth")
# カメラの位置と向きを設定
bpy.ops.object.camera_add(location=(0, -20, 0), rotation=(math.pi/2, 0, math.pi))
# ランダムな回転を加える
bpy.ops.transform.rotate(value=math.pi/4, orient_axis='X')
bpy.ops.transform.rotate(value=math.pi/4, orient_axis='Z')
togetter.com/t/c2022meetzionad
togetter.com/t/b2022meetzionad
twitter 新着検索 Dürer & 測距儀
aaa
bbb
ccc twitter zionadchat
twitter に追い出されたら 連絡先は Gettr https://gettr.com/user/zionadchat
twitter サブアカウント https://twitter.com/2022zionad
old page いいい
new page いいい
目次 2022の目次 単純トリック hatena zionadchat
いいいいいいいい