2023年4月1日土曜日

完成 比較 Z=0 で 円周に

aaa











# zion_collection_name = "球分布 0 kara 拡大 ランダム球体"     radius = 0.0001




import bpy
import math
import random
from mathutils import Vector

# 速度を指定する
zion_speed = 1.0

# 目標位置を指定する
zion_target = Vector((0, -60, 0))

# 平行移動するかどうかを指定する
parallel = False

# 平行移動量を指定する
parallel_distance = Vector((300, 300, 300))  # ここを変更する

# 球体を作成する関数
def create_sphere(location, radius):
    bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius, enter_editmode=False)

# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location, speed):
    distance = (target_location - obj.location).length
    duration = distance / speed
    for frame in range(start_frame, end_frame+1):
        t = (frame - start_frame) / duration
        obj.location = obj.location.lerp(target_location, t)
        obj.keyframe_insert(data_path="location", frame=frame)

# 分布想定 球体を作成する
spheres = []
for i in range(50):
    phi = random.uniform(0, math.pi)
    theta = random.uniform(0, 2*math.pi)
    radius = 0.0001
    x = radius * math.sin(phi) * math.cos(theta)
    y = radius * math.sin(phi) * math.sin(theta)
    z = radius * math.cos(phi)
    location = Vector((x, y, z))
    create_sphere(location, 1.0)
    obj = bpy.context.active_object
    obj.name = "分布拡大sphere"
    spheres.append(obj)

# アニメーションを設定する
for i, sphere in enumerate(spheres):
    start_frame = 1
    end_frame = 600
    location = sphere.location
    if parallel:
        target_location = location + parallel_distance
    else:
        # 表面に沿って動くように設定する
        normal = location.normalized()
        target_location = location + normal * 60  # 半径30の球体表面に沿って動く
    distance = (target_location - location).length
    speed = zion_speed / distance 
    set_animation(sphere, start_frame, end_frame, target_location, speed)




















# 円周 100個 z = 0


import bpy
import math
import random
from mathutils import Vector

# 速度を指定する
zion_speed = 1.0

# 目標位置を指定する
zion_target = Vector((0, -60, 0))

# 平行移動するかどうかを指定する
parallel = False

# 平行移動量を指定する
parallel_distance = Vector((300, 300, 300))  # ここを変更する

# 球体を作成する関数
def create_sphere(location, radius):
    bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius, enter_editmode=False)

# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location, speed):
    distance = (target_location - obj.location).length
    duration = distance / speed
    for frame in range(start_frame, end_frame+1):
        t = (frame - start_frame) / duration
        obj.location = obj.location.lerp(target_location, t)
        obj.keyframe_insert(data_path="location", frame=frame)

# 分布想定 球体を作成する
spheres = []
for i in range(100):
    phi = random.uniform(0, math.pi)
    theta = random.uniform(0, 2*math.pi)
    radius = 0.0001
    x = radius * math.sin(phi) * math.cos(theta)
    y = radius * math.sin(phi) * math.sin(theta)
    z = radius * math.cos(phi)
    location = Vector((x, y, 0))
    create_sphere(location, 1.0)
    obj = bpy.context.active_object
    obj.name = "分布拡大sphere"
    spheres.append(obj)

# アニメーションを設定する
for i, sphere in enumerate(spheres):
    start_frame = 1
    end_frame = 600
    location = sphere.location
    if parallel:
        target_location = location + parallel_distance
    else:
        # 表面に沿って動くように設定する
        normal = location.normalized()
        target_location = location + normal * 60  # 半径30の球体表面に沿って動く
    distance = (target_location - location).length
    speed = zion_speed / distance 
    set_animation(sphere, start_frame, end_frame, target_location, speed)







# 円周 100個 z = 0


import bpy
import math
import random
from mathutils import Vector

# 速度を指定する
zion_speed = 1.0

# 目標位置を指定する
zion_target = Vector((0, -60, 0))

# 平行移動するかどうかを指定する
parallel = False

# 平行移動量を指定する
parallel_distance = Vector((300, 300, 300))  # ここを変更する

# 球体を作成する関数
def create_sphere(location, radius):
    bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius, enter_editmode=False)

# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location, speed):
    distance = (target_location - obj.location).length
    duration = distance / speed
    for frame in range(start_frame, end_frame+1):
        t = (frame - start_frame) / duration
        obj.location = obj.location.lerp(target_location, t)
        obj.keyframe_insert(data_path="location", frame=frame)

# 分布想定 球体を作成する
spheres = []
for i in range(100):
    phi = random.uniform(0, math.pi)
    theta = random.uniform(0, 2*math.pi)
    radius = 0.0001
    x = radius * math.sin(phi) * math.cos(theta)
    y = radius * math.sin(phi) * math.sin(theta)
    z = radius * math.cos(phi)
    location = Vector((x, y, 0))
    create_sphere(location, 1.0)
    obj = bpy.context.active_object
    obj.name = "分布拡大sphere"
    spheres.append(obj)

# アニメーションを設定する
for i, sphere in enumerate(spheres):
    start_frame = 1
    end_frame = 600
    location = sphere.location
    if parallel:
        target_location = location + parallel_distance
    else:
        # 表面に沿って動くように設定する
        normal = location.normalized()
        target_location = location + normal * 60  # 半径30の球体表面に沿って動く
    distance = (target_location - location).length
    speed = zion_speed / distance 
    set_animation(sphere, start_frame, end_frame, target_location, speed)







# 円周 100個 z = 0


import bpy
import math
import random
from mathutils import Vector

# 速度を指定する
zion_speed = 1.0

# 目標位置を指定する
zion_target = Vector((0, -60, 0))

# 平行移動するかどうかを指定する
parallel = False

# 平行移動量を指定する
parallel_distance = Vector((300, 300, 300))  # ここを変更する

# 球体を作成する関数
def create_sphere(location, radius):
    bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius, enter_editmode=False)

# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location, speed):
    distance = (target_location - obj.location).length
    duration = distance / speed
    for frame in range(start_frame, end_frame+1):
        t = (frame - start_frame) / duration
        obj.location = obj.location.lerp(target_location, t)
        obj.keyframe_insert(data_path="location", frame=frame)

# 分布想定 球体を作成する
spheres = []
for i in range(3):
    phi = random.uniform(0, math.pi)
    theta = random.uniform(0, 2*math.pi)
    radius = 0.0001
    x = radius * math.sin(phi) * math.cos(theta)
    y = radius * math.sin(phi) * math.sin(theta)
    z = radius * math.cos(phi)
    location = Vector((x, y, 0))
    create_sphere(location, 2.0)
    obj = bpy.context.active_object
    obj.name = "分布拡大sphere"
    spheres.append(obj)

# アニメーションを設定する
for i, sphere in enumerate(spheres):
    start_frame = 1
    end_frame = 600
    location = sphere.location
    if parallel:
        target_location = location + parallel_distance
    else:
        # 表面に沿って動くように設定する
        normal = location.normalized()
        target_location = location + normal * 60  # 半径30の球体表面に沿って動く
    distance = (target_location - location).length
    speed = zion_speed / distance 
    set_animation(sphere, start_frame, end_frame, target_location, speed)





bbb

2023年3月30日木曜日

成功 x軸方向への 分布 平行移動 球体

aaa


import bpy
import math


zion_collection_name = "分布 to x 平行移動sphere"

# コレクションを作成する
col = bpy.data.collections.new(zion_collection_name)
bpy.context.scene.collection.children.link(col)




import bpy
import math


zion_collection_name = "分布 to xy 平行移動sphere"

# コレクションを作成する
col = bpy.data.collections.new(zion_collection_name)
bpy.context.scene.collection.children.link(col)




import bpy
import math


zion_collection_name = "分布 to xyz 平行移動sphere"

# コレクションを作成する
col = bpy.data.collections.new(zion_collection_name)
bpy.context.scene.collection.children.link(col)







import bpy

# 新しいフレーム長さを設定する
new_end_frame = 600

# 現在のフレーム長さを取得する
current_end_frame = bpy.context.scene.frame_end

# フレーム長さを変更する
bpy.context.scene.frame_end = new_end_frame






以下のように、parallel_distanceを(300, 300, 0)に変更することで、x軸とy軸の両方に同じ量だけ平行移動することができます。

python
Copy code
# 平行移動量を指定する
parallel_distance = Vector((300, 300, 0))  # x軸とy軸に平行移動する














#   obj.name = "分布 to x 平行移動sphere"


import bpy
import math
import random
from mathutils import Vector

# 速度を指定する
zion_speed = 1.0

# 目標位置を指定する
zion_target = Vector((600, 0, 0))  # x軸とy軸の両方に平行に移動する

# 球体を作成する関数
def create_sphere(location, radius):
    bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius, enter_editmode=False)

# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location, speed):
    distance = (target_location - obj.location).length
    duration = distance / speed
    for frame in range(start_frame, end_frame+1):
        t = (frame - start_frame) / duration
        obj.location = obj.location.lerp(target_location, t)
        obj.keyframe_insert(data_path="location", frame=frame)

# 球体を作成する
spheres = []
for i in range(100):
    phi = random.uniform(0, math.pi)
    theta = random.uniform(0, 2*math.pi)
    radius = 30
    x = radius * math.sin(phi) * math.cos(theta)
    y = radius * math.sin(phi) * math.sin(theta)
    z = radius * math.cos(phi)
    location = Vector((x, y, z))
    create_sphere(location, 1.0)
    obj = bpy.context.active_object
    obj.name = "分布平行移動sphere"
    spheres.append(obj)

# アニメーションを設定する
for i, sphere in enumerate(spheres):
    start_frame = 1
    end_frame = 600
    location = sphere.location
    target_location = location + zion_target
    distance = (target_location - location).length
    speed = zion_speed / distance
    set_animation(sphere, start_frame, end_frame, target_location, speed)










#   obj.name = "分布 to xy 平行移動sphere"


import bpy
import math
import random
from mathutils import Vector

# 速度を指定する
zion_speed = 1.0

# 目標位置を指定する
zion_target = Vector((600, 600, 0))  # x軸とy軸の両方に平行に移動する

# 球体を作成する関数
def create_sphere(location, radius):
    bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius, enter_editmode=False)

# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location, speed):
    distance = (target_location - obj.location).length
    duration = distance / speed
    for frame in range(start_frame, end_frame+1):
        t = (frame - start_frame) / duration
        obj.location = obj.location.lerp(target_location, t)
        obj.keyframe_insert(data_path="location", frame=frame)

# 球体を作成する
spheres = []
for i in range(100):
    phi = random.uniform(0, math.pi)
    theta = random.uniform(0, 2*math.pi)
    radius = 30
    x = radius * math.sin(phi) * math.cos(theta)
    y = radius * math.sin(phi) * math.sin(theta)
    z = radius * math.cos(phi)
    location = Vector((x, y, z))
    create_sphere(location, 1.0)
    obj = bpy.context.active_object
    obj.name = "分布平行移動sphere"
    spheres.append(obj)

# アニメーションを設定する
for i, sphere in enumerate(spheres):
    start_frame = 1
    end_frame = 600
    location = sphere.location
    target_location = location + zion_target
    distance = (target_location - location).length
    speed = zion_speed / distance
    set_animation(sphere, start_frame, end_frame, target_location, speed)









#   obj.name = "分布 to xyz 平行移動sphere"


import bpy
import math
import random
from mathutils import Vector

# 速度を指定する
zion_speed = 1.0

# 目標位置を指定する
zion_target = Vector((600, 600, 600))  # x軸とy軸の両方に平行に移動する

# 球体を作成する関数
def create_sphere(location, radius):
    bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius, enter_editmode=False)

# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location, speed):
    distance = (target_location - obj.location).length
    duration = distance / speed
    for frame in range(start_frame, end_frame+1):
        t = (frame - start_frame) / duration
        obj.location = obj.location.lerp(target_location, t)
        obj.keyframe_insert(data_path="location", frame=frame)

# 球体を作成する
spheres = []
for i in range(100):
    phi = random.uniform(0, math.pi)
    theta = random.uniform(0, 2*math.pi)
    radius = 30
    x = radius * math.sin(phi) * math.cos(theta)
    y = radius * math.sin(phi) * math.sin(theta)
    z = radius * math.cos(phi)
    location = Vector((x, y, z))
    create_sphere(location, 1.0)
    obj = bpy.context.active_object
    obj.name = "分布平行移動sphere"
    spheres.append(obj)

# アニメーションを設定する
for i, sphere in enumerate(spheres):
    start_frame = 1
    end_frame = 600
    location = sphere.location
    target_location = location + zion_target
    distance = (target_location - location).length
    speed = zion_speed / distance
    set_animation(sphere, start_frame, end_frame, target_location, speed)




























bbb
aaa





















# 平行 移動 球体

import bpy
import math
import random
from mathutils import Vector

# 速度を指定する
zion_speed = 1.0

# 目標位置を指定する
zion_target = Vector((60, 0, 0))

# 平行移動するかどうかを指定する
parallel = True

# 平行移動量を指定する
parallel_distance = Vector((300, 300, 300))  # ここを変更する

# 球体を作成する関数
def create_sphere(location, radius):
    bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius, enter_editmode=False)

# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location, speed):
    distance = (target_location - obj.location).length
    duration = distance / speed
    for frame in range(start_frame, end_frame+1):
        t = (frame - start_frame) / duration
        obj.location = obj.location.lerp(target_location, t)
        obj.keyframe_insert(data_path="location", frame=frame)

# 球体を作成する
spheres = []
for i in range(100):
    phi = random.uniform(0, math.pi)
    theta = random.uniform(0, 2*math.pi)
    radius = 30
    x = radius * math.sin(phi) * math.cos(theta)
    y = radius * math.sin(phi) * math.sin(theta)
    z = radius * math.cos(phi)
    location = Vector((x, y, z))
    create_sphere(location, 1.0)
    obj = bpy.context.active_object
    obj.name = "分布 平行移動sphere"
    spheres.append(obj)

# アニメーションを設定する
for i, sphere in enumerate(spheres):
    start_frame = 1
    end_frame = 300
    location = sphere.location
    if parallel:
        target_location = location + parallel_distance
    else:
        # 表面に沿って動くように設定する
        normal = location.normalized()
        target_location = location + normal * 60  # 半径30の球体表面に沿って動く
    distance = (target_location - location).length
    speed = zion_speed / distance
    set_animation(sphere, start_frame, end_frame, target_location, speed)















# 平行 移動 球体

import bpy
import math
import random
from mathutils import Vector

# 速度を指定する
zion_speed = 1.0

# 目標位置を指定する
zion_target = Vector((60, 0, 0))

# 平行移動するかどうかを指定する
parallel = True

# 平行移動量を指定する
parallel_distance = Vector((300, 300, 300))  # ここを変更する

# 球体を作成する関数
def create_sphere(location, radius):
    bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius, enter_editmode=False)

# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location, speed):
    distance = (target_location - obj.location).length
    duration = distance / speed
    for frame in range(start_frame, end_frame+1):
        t = (frame - start_frame) / duration
        obj.location = obj.location.lerp(target_location, t)
        obj.keyframe_insert(data_path="location", frame=frame)

# 球体を作成する
spheres = []
for i in range(100):
    phi = random.uniform(0, math.pi)
    theta = random.uniform(0, 2*math.pi)
    radius = 30
    x = radius * math.sin(phi) * math.cos(theta)
    y = radius * math.sin(phi) * math.sin(theta)
    z = radius * math.cos(phi)
    location = Vector((x, y, z))
    create_sphere(location, 1.0)
    obj = bpy.context.active_object
    obj.name = "分布 平行移動sphere"
    spheres.append(obj)

# アニメーションを設定する
for i, sphere in enumerate(spheres):
    start_frame = 1
    end_frame = 300
    location = sphere.location
    if parallel:
        target_location = location + parallel_distance
    else:
        # 表面に沿って動くように設定する
        normal = location.normalized()
        target_location = location + normal * 60  # 半径30の球体表面に沿って動く
    distance = (target_location - location).length
    speed = zion_speed / distance
    set_animation(sphere, start_frame, end_frame, target_location, speed)




bbb

連番004 製作004a 000 からの 球体分布 拡大

aaa


メモ リンク



2023年3月26日日曜日
0から60に 半径を大きくする球体


2023年3月24日金曜日
成功 球体 拡大 ランダム


 


import bpy
import math


zion_collection_name = "球分布 30 to 90 拡大"

# コレクションを作成する
col = bpy.data.collections.new(zion_collection_name)
bpy.context.scene.collection.children.link(col)



import bpy
import math


zion_collection_name = "球分布 0 kara 拡大 ランダム球体"

# コレクションを作成する
col = bpy.data.collections.new(zion_collection_name)
bpy.context.scene.collection.children.link(col)




import bpy
import math


zion_collection_name = "球分布 平行移動"

# コレクションを作成する
col = bpy.data.collections.new(zion_collection_name)
bpy.context.scene.collection.children.link(col)














#  球分布 30 to 90 拡大



import bpy
import math
import random
from mathutils import Vector

# 速度を指定する
zion_speed = 1.0

# 目標位置を指定する
zion_target = Vector((0, -60, 0))

# 平行移動するかどうかを指定する
parallel = False

# 平行移動量を指定する
parallel_distance = Vector((300, 300, 300))  # ここを変更する

# 球体を作成する関数
def create_sphere(location, radius):
    bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius, enter_editmode=False)

# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location, speed):
    distance = (target_location - obj.location).length
    duration = distance / speed
    for frame in range(start_frame, end_frame+1):
        t = (frame - start_frame) / duration
        obj.location = obj.location.lerp(target_location, t)
        obj.keyframe_insert(data_path="location", frame=frame)

# 球体を作成する
spheres = []
for i in range(100):
    phi = random.uniform(0, math.pi)
    theta = random.uniform(0, 2*math.pi)
    radius = 30
    x = radius * math.sin(phi) * math.cos(theta)
    y = radius * math.sin(phi) * math.sin(theta)
    z = radius * math.cos(phi)
    location = Vector((x, y, z))
    create_sphere(location, 1.0)
    obj = bpy.context.active_object
    obj.name = "球分布 30 to 90 拡大"
    spheres.append(obj)

# アニメーションを設定する
for i, sphere in enumerate(spheres):
    start_frame = 1
    end_frame = 600
    location = sphere.location
    if parallel:
        target_location = location + parallel_distance
    else:
        # 表面に沿って動くように設定する
        normal = location.normalized()
        target_location = location + normal * 60  # 半径30の球体表面に沿って動く
    distance = (target_location - location).length
    speed = zion_speed / distance
    set_animation(sphere, start_frame, end_frame, target_location, speed)















# 平行 移動 球体

import bpy
import math
import random
from mathutils import Vector

# 速度を指定する
zion_speed = 1.0

# 目標位置を指定する
zion_target = Vector((60, 0, 0))

# 平行移動するかどうかを指定する
parallel = True

# 平行移動量を指定する
parallel_distance = Vector((300, 300, 300))  # ここを変更する

# 球体を作成する関数
def create_sphere(location, radius):
    bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius, enter_editmode=False)

# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location, speed):
    distance = (target_location - obj.location).length
    duration = distance / speed
    for frame in range(start_frame, end_frame+1):
        t = (frame - start_frame) / duration
        obj.location = obj.location.lerp(target_location, t)
        obj.keyframe_insert(data_path="location", frame=frame)

# 球体を作成する
spheres = []
for i in range(100):
    phi = random.uniform(0, math.pi)
    theta = random.uniform(0, 2*math.pi)
    radius = 30
    x = radius * math.sin(phi) * math.cos(theta)
    y = radius * math.sin(phi) * math.sin(theta)
    z = radius * math.cos(phi)
    location = Vector((x, y, z))
    create_sphere(location, 1.0)
    obj = bpy.context.active_object
    obj.name = "分布 平行移動sphere"
    spheres.append(obj)

# アニメーションを設定する
for i, sphere in enumerate(spheres):
    start_frame = 1
    end_frame = 300
    location = sphere.location
    if parallel:
        target_location = location + parallel_distance
    else:
        # 表面に沿って動くように設定する
        normal = location.normalized()
        target_location = location + normal * 60  # 半径30の球体表面に沿って動く
    distance = (target_location - location).length
    speed = zion_speed / distance
    set_animation(sphere, start_frame, end_frame, target_location, speed)











# zion_collection_name = "球分布 0 kara 拡大 ランダム球体"     radius = 0.0001




import bpy
import math
import random
from mathutils import Vector

# 速度を指定する
zion_speed = 1.0

# 目標位置を指定する
zion_target = Vector((0, -60, 0))

# 平行移動するかどうかを指定する
parallel = False

# 平行移動量を指定する
parallel_distance = Vector((300, 300, 300))  # ここを変更する

# 球体を作成する関数
def create_sphere(location, radius):
    bpy.ops.mesh.primitive_uv_sphere_add(location=location, radius=radius, enter_editmode=False)

# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location, speed):
    distance = (target_location - obj.location).length
    duration = distance / speed
    for frame in range(start_frame, end_frame+1):
        t = (frame - start_frame) / duration
        obj.location = obj.location.lerp(target_location, t)
        obj.keyframe_insert(data_path="location", frame=frame)

# 分布想定 球体を作成する
spheres = []
for i in range(100):
    phi = random.uniform(0, math.pi)
    theta = random.uniform(0, 2*math.pi)
    radius = 0.0001
    x = radius * math.sin(phi) * math.cos(theta)
    y = radius * math.sin(phi) * math.sin(theta)
    z = radius * math.cos(phi)
    location = Vector((x, y, z))
    create_sphere(location, 1.0)
    obj = bpy.context.active_object
    obj.name = "分布拡大sphere"
    spheres.append(obj)

# アニメーションを設定する
for i, sphere in enumerate(spheres):
    start_frame = 1
    end_frame = 600
    location = sphere.location
    if parallel:
        target_location = location + parallel_distance
    else:
        # 表面に沿って動くように設定する
        normal = location.normalized()
        target_location = location + normal * 60  # 半径30の球体表面に沿って動く
    distance = (target_location - location).length
    speed = zion_speed / distance 
    set_animation(sphere, start_frame, end_frame, target_location, speed)








# 反転

import bpy
from mathutils import Vector

# 速度を指定する
back_speed = 1.0

# アニメーションを設定する関数
def set_animation(obj, start_frame, end_frame, target_location, speed):
    distance = (target_location - obj.location).length
    duration = distance / speed
    for frame in range(start_frame, end_frame+1):
        t = (frame - start_frame) / duration
        obj.location = obj.location.lerp(target_location, t)
        obj.keyframe_insert(data_path="location", frame=frame)

# 球体の中心位置
center = Vector((0, 0, 0))

# アニメーションを設定する
for sphere in bpy.data.objects:
    if sphere.type == 'MESH' and sphere.name.startswith('Sphere'):
        start_frame = 600
        end_frame = 1
        location = sphere.location
        target_location = center
        distance = (target_location - location).length
        speed = back_speed / distance
        set_animation(sphere, start_frame, end_frame, target_location, speed)














bbb

連番 007 未来光円錐 過去光円錐 円周中心からの球体放出

aaa 参考 2023年3月26日日曜日 製作 002b 未来光円錐の方向 線路レールで https://ia2023sha.blogspot.com/2023/03/002b.html import bpy import math zion_co...