diff --git a/README.md b/README.md
index b9b434b..c3d1ce9 100644
--- a/README.md
+++ b/README.md
@@ -81,7 +81,7 @@ A slotted-actions Z-rotation turntable keyed through the cross-version channelba
-
+
|
diff --git a/docs/gallery/assets/depsgraph-export-hero.webp b/docs/gallery/assets/depsgraph-export-hero.webp
index 7253361..bdf11a0 100644
Binary files a/docs/gallery/assets/depsgraph-export-hero.webp and b/docs/gallery/assets/depsgraph-export-hero.webp differ
diff --git a/docs/gallery/assets/driver-wave-hero.webp b/docs/gallery/assets/driver-wave-hero.webp
index da69c42..74e638d 100644
Binary files a/docs/gallery/assets/driver-wave-hero.webp and b/docs/gallery/assets/driver-wave-hero.webp differ
diff --git a/docs/gallery/assets/gn-sdf-remesh-hero.webp b/docs/gallery/assets/gn-sdf-remesh-hero.webp
index 2b23e25..4130651 100644
Binary files a/docs/gallery/assets/gn-sdf-remesh-hero.webp and b/docs/gallery/assets/gn-sdf-remesh-hero.webp differ
diff --git a/docs/gallery/assets/wave-displace-hero.webp b/docs/gallery/assets/wave-displace-hero.webp
index 192c620..ffa6409 100644
Binary files a/docs/gallery/assets/wave-displace-hero.webp and b/docs/gallery/assets/wave-displace-hero.webp differ
diff --git a/docs/gallery/driver-wave/index.html b/docs/gallery/driver-wave/index.html
index 3bffc92..dfb2590 100644
--- a/docs/gallery/driver-wave/index.html
+++ b/docs/gallery/driver-wave/index.html
@@ -288,8 +288,8 @@ Source
mat = bpy.data.materials.new("ColMat")
mat.use_nodes = True
bsdf = mat.node_tree.nodes["Principled BSDF"]
- bsdf.inputs["Base Color"].default_value = (0.62, 0.68, 0.78, 1.0)
- bsdf.inputs["Roughness"].default_value = 0.45
+ bsdf.inputs["Base Color"].default_value = (1.0, 0.26, 0.012, 1.0) # selection orange
+ bsdf.inputs["Roughness"].default_value = 0.32
objs[0].data.materials.append(mat) # shared mesh -> all columns
# columns stand on the floor: lift each by its DRIVEN half-height
@@ -308,26 +308,38 @@ Source
fmat = bpy.data.materials.new("FloorMat")
fmat.use_nodes = True
fb = fmat.node_tree.nodes["Principled BSDF"]
- fb.inputs["Base Color"].default_value = (0.55, 0.57, 0.62, 1.0)
- fb.inputs["Roughness"].default_value = 0.9
+ fb.inputs["Base Color"].default_value = (0.055, 0.06, 0.07, 1.0) # dark graphite studio
+ fb.inputs["Roughness"].default_value = 0.5
floor_me.materials.append(fmat)
scene.collection.objects.link(floor)
+ wall = bpy.data.objects.new("Wall", floor_me.copy())
+ wall.location = (0.0, 9.0, 0.0)
+ wall.rotation_euler = (math.radians(90), 0.0, 0.0)
+ scene.collection.objects.link(wall)
world = bpy.data.worlds.new("World")
world.use_nodes = True
- world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.045, 0.05, 0.06, 1.0)
+ world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.008, 0.009, 0.012, 1.0)
scene.world = world
- key = bpy.data.lights.new("Key", 'AREA'); key.energy = 1000.0; key.size = 6.0
+ key = bpy.data.lights.new("Key", 'AREA'); key.energy = 1600.0; key.size = 5.0
+ key.color = (1.0, 0.97, 0.92)
key_ob = bpy.data.objects.new("Key", key)
key_ob.location = (-4.5, -5.5, 6.5)
key_ob.rotation_euler = (math.radians(46), 0.0, math.radians(-33))
scene.collection.objects.link(key_ob)
- fill = bpy.data.lights.new("Fill", 'AREA'); fill.energy = 350.0; fill.size = 8.0
+ fill = bpy.data.lights.new("Fill", 'AREA'); fill.energy = 260.0; fill.size = 8.0
+ fill.color = (0.8, 0.87, 1.0)
fill_ob = bpy.data.objects.new("Fill", fill)
fill_ob.location = (5.5, -4.0, 3.5)
fill_ob.rotation_euler = (math.radians(62), 0.0, math.radians(48))
scene.collection.objects.link(fill_ob)
+ rim = bpy.data.lights.new("Rim", 'AREA'); rim.energy = 480.0; rim.size = 5.0
+ rim.color = (0.75, 0.85, 1.0)
+ rim_ob = bpy.data.objects.new("Rim", rim)
+ rim_ob.location = (0.0, 6.5, 3.0)
+ rim_ob.rotation_euler = (math.radians(-78), 0.0, math.radians(180))
+ scene.collection.objects.link(rim_ob)
cam_data = bpy.data.cameras.new("Cam"); cam_data.lens = 45.0
cam = bpy.data.objects.new("Cam", cam_data)
diff --git a/docs/gallery/gn-sdf-remesh/index.html b/docs/gallery/gn-sdf-remesh/index.html
index 7c2ae9e..29bd3b5 100644
--- a/docs/gallery/gn-sdf-remesh/index.html
+++ b/docs/gallery/gn-sdf-remesh/index.html
@@ -246,14 +246,14 @@ Source
def build():
bpy.ops.wm.read_factory_settings(use_empty=True)
- bpy.ops.mesh.primitive_torus_add(location=(0, 0, 1.0), major_radius=1.2, minor_radius=0.5)
+ bpy.ops.mesh.primitive_torus_add(location=(0, 0, 0.55), major_radius=1.2, minor_radius=0.5)
obj = bpy.context.active_object
for p in obj.data.polygons:
p.use_smooth = True
- mat = bpy.data.materials.new("Clay"); mat.use_nodes = True
+ mat = bpy.data.materials.new("Ceramic"); mat.use_nodes = True
b = mat.node_tree.nodes.get('Principled BSDF')
- b.inputs['Base Color'].default_value = (0.45, 0.55, 0.85, 1)
- b.inputs['Roughness'].default_value = 0.45
+ b.inputs['Base Color'].default_value = (0.42, 0.028, 0.045, 1) # crimson ceramic
+ b.inputs['Roughness'].default_value = 0.22
obj.data.materials.append(mat)
return obj
@@ -262,23 +262,33 @@ Source
sc = bpy.context.scene
fme = bpy.data.meshes.new("Floor"); bm = bmesh.new()
bmesh.ops.create_grid(bm, x_segments=1, y_segments=1, size=30.0); bm.to_mesh(fme); bm.free()
+ fmat = bpy.data.materials.new("Studio"); fmat.use_nodes = True
+ fb = fmat.node_tree.nodes.get('Principled BSDF')
+ fb.inputs['Base Color'].default_value = (0.055, 0.06, 0.07, 1) # dark graphite studio
+ fb.inputs['Roughness'].default_value = 0.55
+ fme.materials.append(fmat)
floor = bpy.data.objects.new("Floor", fme); bpy.context.collection.objects.link(floor)
+ wall = bpy.data.objects.new("Wall", fme.copy()); wall.location = (0, 9.0, 0)
+ wall.rotation_euler = (1.5708, 0, 0); bpy.context.collection.objects.link(wall)
w = bpy.data.worlds.new("W"); w.use_nodes = True
- w.node_tree.nodes["Background"].inputs[0].default_value = (0.05, 0.06, 0.08, 1); sc.world = w
- aim = bpy.data.objects.new("Aim", None); aim.location = (0, 0, 1.0); bpy.context.collection.objects.link(aim)
- cam = bpy.data.objects.new("cam", bpy.data.cameras.new("cam")); cam.location = (0, -6.5, 3.0)
+ w.node_tree.nodes["Background"].inputs[0].default_value = (0.01, 0.011, 0.014, 1); sc.world = w
+ aim = bpy.data.objects.new("Aim", None); aim.location = (0, 0, 0.55); bpy.context.collection.objects.link(aim)
+ cam = bpy.data.objects.new("cam", bpy.data.cameras.new("cam")); cam.location = (0, -6.5, 2.2)
bpy.context.collection.objects.link(cam); sc.camera = cam
c = cam.constraints.new('TRACK_TO'); c.target = aim; c.track_axis = 'TRACK_NEGATIVE_Z'; c.up_axis = 'UP_Y'
- for nm, loc, en in [("K", (-4, -5, 7), 900), ("F2", (5, -4, 2), 350)]:
- ld = bpy.data.lights.new(nm, 'AREA'); ld.energy = en; ld.size = 5.0
+ # key, cool fill, warm rim
+ for nm, loc, en, sz, col in [("K", (-4, -5, 7), 1100, 5.0, (1.0, 0.98, 0.95)),
+ ("F2", (5, -4, 2), 220, 7.0, (0.85, 0.9, 1.0)),
+ ("R", (2.5, 6, 4), 700, 3.0, (1.0, 0.72, 0.45))]:
+ ld = bpy.data.lights.new(nm, 'AREA'); ld.energy = en; ld.size = sz; ld.color = col
lo = bpy.data.objects.new(nm, ld); lo.location = loc; bpy.context.collection.objects.link(lo)
lc = lo.constraints.new('TRACK_TO'); lc.target = aim; lc.track_axis = 'TRACK_NEGATIVE_Z'; lc.up_axis = 'UP_Y'
sc.render.engine = 'CYCLES' if engine == 'cycles' else get_eevee_engine_id()
if sc.render.engine == 'CYCLES':
- try: sc.cycles.samples = 16
+ try: sc.cycles.samples = 32
except Exception: pass
else:
- try: sc.eevee.taa_render_samples = 16
+ try: sc.eevee.taa_render_samples = 64
except Exception: pass
sc.render.resolution_x = 1280; sc.render.resolution_y = 720
sc.render.image_settings.file_format = 'PNG'; sc.render.filepath = path
diff --git a/docs/gallery/wave-displace/index.html b/docs/gallery/wave-displace/index.html
index 0f8c29b..2968fbd 100644
--- a/docs/gallery/wave-displace/index.html
+++ b/docs/gallery/wave-displace/index.html
@@ -284,24 +284,27 @@ Source
mat = bpy.data.materials.new("WaveMat")
mat.use_nodes = True
bsdf = mat.node_tree.nodes["Principled BSDF"]
- bsdf.inputs["Base Color"].default_value = (0.62, 0.68, 0.78, 1.0)
- bsdf.inputs["Roughness"].default_value = 0.35
+ bsdf.inputs["Base Color"].default_value = (0.012, 0.09, 0.38, 1.0) # deep sapphire
+ bsdf.inputs["Roughness"].default_value = 0.18
obj.data.materials.append(mat)
world = bpy.data.worlds.new("World")
world.use_nodes = True
- world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.045, 0.05, 0.06, 1.0)
+ world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.008, 0.009, 0.012, 1.0)
scene.world = world
- key = bpy.data.lights.new("Key", 'AREA'); key.energy = 1400.0; key.size = 7.0
+ # grazing cool key picks out the crests; warm rim from behind
+ key = bpy.data.lights.new("Key", 'AREA'); key.energy = 2000.0; key.size = 6.0
+ key.color = (0.9, 0.95, 1.0)
key_ob = bpy.data.objects.new("Key", key)
- key_ob.location = (-5.0, -6.0, 6.5)
- key_ob.rotation_euler = (math.radians(48), 0.0, math.radians(-35))
+ key_ob.location = (-6.5, -5.0, 3.2)
+ key_ob.rotation_euler = (math.radians(65), 0.0, math.radians(-50))
scene.collection.objects.link(key_ob)
- rim = bpy.data.lights.new("Rim", 'AREA'); rim.energy = 600.0; rim.size = 5.0
+ rim = bpy.data.lights.new("Rim", 'AREA'); rim.energy = 1300.0; rim.size = 4.0
+ rim.color = (1.0, 0.68, 0.38)
rim_ob = bpy.data.objects.new("Rim", rim)
- rim_ob.location = (4.0, 6.0, 4.5)
- rim_ob.rotation_euler = (math.radians(-55), 0.0, math.radians(150))
+ rim_ob.location = (4.5, 6.5, 2.6)
+ rim_ob.rotation_euler = (math.radians(-68), 0.0, math.radians(148))
scene.collection.objects.link(rim_ob)
cam_data = bpy.data.cameras.new("Cam"); cam_data.lens = 50.0
diff --git a/examples/depsgraph-export/preview.webp b/examples/depsgraph-export/preview.webp
index 2d22c72..511652d 100644
Binary files a/examples/depsgraph-export/preview.webp and b/examples/depsgraph-export/preview.webp differ
diff --git a/examples/driver-wave/driver_wave.py b/examples/driver-wave/driver_wave.py
index edf5423..f17fa86 100644
--- a/examples/driver-wave/driver_wave.py
+++ b/examples/driver-wave/driver_wave.py
@@ -85,8 +85,8 @@ def render_still(objs, path, engine):
mat = bpy.data.materials.new("ColMat")
mat.use_nodes = True
bsdf = mat.node_tree.nodes["Principled BSDF"]
- bsdf.inputs["Base Color"].default_value = (0.62, 0.68, 0.78, 1.0)
- bsdf.inputs["Roughness"].default_value = 0.45
+ bsdf.inputs["Base Color"].default_value = (1.0, 0.26, 0.012, 1.0) # selection orange
+ bsdf.inputs["Roughness"].default_value = 0.32
objs[0].data.materials.append(mat) # shared mesh -> all columns
# columns stand on the floor: lift each by its DRIVEN half-height
@@ -105,26 +105,38 @@ def render_still(objs, path, engine):
fmat = bpy.data.materials.new("FloorMat")
fmat.use_nodes = True
fb = fmat.node_tree.nodes["Principled BSDF"]
- fb.inputs["Base Color"].default_value = (0.55, 0.57, 0.62, 1.0)
- fb.inputs["Roughness"].default_value = 0.9
+ fb.inputs["Base Color"].default_value = (0.055, 0.06, 0.07, 1.0) # dark graphite studio
+ fb.inputs["Roughness"].default_value = 0.5
floor_me.materials.append(fmat)
scene.collection.objects.link(floor)
+ wall = bpy.data.objects.new("Wall", floor_me.copy())
+ wall.location = (0.0, 9.0, 0.0)
+ wall.rotation_euler = (math.radians(90), 0.0, 0.0)
+ scene.collection.objects.link(wall)
world = bpy.data.worlds.new("World")
world.use_nodes = True
- world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.045, 0.05, 0.06, 1.0)
+ world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.008, 0.009, 0.012, 1.0)
scene.world = world
- key = bpy.data.lights.new("Key", 'AREA'); key.energy = 1000.0; key.size = 6.0
+ key = bpy.data.lights.new("Key", 'AREA'); key.energy = 1600.0; key.size = 5.0
+ key.color = (1.0, 0.97, 0.92)
key_ob = bpy.data.objects.new("Key", key)
key_ob.location = (-4.5, -5.5, 6.5)
key_ob.rotation_euler = (math.radians(46), 0.0, math.radians(-33))
scene.collection.objects.link(key_ob)
- fill = bpy.data.lights.new("Fill", 'AREA'); fill.energy = 350.0; fill.size = 8.0
+ fill = bpy.data.lights.new("Fill", 'AREA'); fill.energy = 260.0; fill.size = 8.0
+ fill.color = (0.8, 0.87, 1.0)
fill_ob = bpy.data.objects.new("Fill", fill)
fill_ob.location = (5.5, -4.0, 3.5)
fill_ob.rotation_euler = (math.radians(62), 0.0, math.radians(48))
scene.collection.objects.link(fill_ob)
+ rim = bpy.data.lights.new("Rim", 'AREA'); rim.energy = 480.0; rim.size = 5.0
+ rim.color = (0.75, 0.85, 1.0)
+ rim_ob = bpy.data.objects.new("Rim", rim)
+ rim_ob.location = (0.0, 6.5, 3.0)
+ rim_ob.rotation_euler = (math.radians(-78), 0.0, math.radians(180))
+ scene.collection.objects.link(rim_ob)
cam_data = bpy.data.cameras.new("Cam"); cam_data.lens = 45.0
cam = bpy.data.objects.new("Cam", cam_data)
diff --git a/examples/driver-wave/preview.webp b/examples/driver-wave/preview.webp
index 5934bbb..be45953 100644
Binary files a/examples/driver-wave/preview.webp and b/examples/driver-wave/preview.webp differ
diff --git a/examples/gn-sdf-remesh/gn_sdf_remesh.py b/examples/gn-sdf-remesh/gn_sdf_remesh.py
index c05907e..071b57f 100644
--- a/examples/gn-sdf-remesh/gn_sdf_remesh.py
+++ b/examples/gn-sdf-remesh/gn_sdf_remesh.py
@@ -43,14 +43,14 @@ def build_remesh_via_sdf(voxel_size=0.1, threshold=0.0, material=None):
def build():
bpy.ops.wm.read_factory_settings(use_empty=True)
- bpy.ops.mesh.primitive_torus_add(location=(0, 0, 1.0), major_radius=1.2, minor_radius=0.5)
+ bpy.ops.mesh.primitive_torus_add(location=(0, 0, 0.55), major_radius=1.2, minor_radius=0.5)
obj = bpy.context.active_object
for p in obj.data.polygons:
p.use_smooth = True
- mat = bpy.data.materials.new("Clay"); mat.use_nodes = True
+ mat = bpy.data.materials.new("Ceramic"); mat.use_nodes = True
b = mat.node_tree.nodes.get('Principled BSDF')
- b.inputs['Base Color'].default_value = (0.45, 0.55, 0.85, 1)
- b.inputs['Roughness'].default_value = 0.45
+ b.inputs['Base Color'].default_value = (0.42, 0.028, 0.045, 1) # crimson ceramic
+ b.inputs['Roughness'].default_value = 0.22
obj.data.materials.append(mat)
return obj
@@ -59,23 +59,33 @@ def render_still(obj, path, engine):
sc = bpy.context.scene
fme = bpy.data.meshes.new("Floor"); bm = bmesh.new()
bmesh.ops.create_grid(bm, x_segments=1, y_segments=1, size=30.0); bm.to_mesh(fme); bm.free()
+ fmat = bpy.data.materials.new("Studio"); fmat.use_nodes = True
+ fb = fmat.node_tree.nodes.get('Principled BSDF')
+ fb.inputs['Base Color'].default_value = (0.055, 0.06, 0.07, 1) # dark graphite studio
+ fb.inputs['Roughness'].default_value = 0.55
+ fme.materials.append(fmat)
floor = bpy.data.objects.new("Floor", fme); bpy.context.collection.objects.link(floor)
+ wall = bpy.data.objects.new("Wall", fme.copy()); wall.location = (0, 9.0, 0)
+ wall.rotation_euler = (1.5708, 0, 0); bpy.context.collection.objects.link(wall)
w = bpy.data.worlds.new("W"); w.use_nodes = True
- w.node_tree.nodes["Background"].inputs[0].default_value = (0.05, 0.06, 0.08, 1); sc.world = w
- aim = bpy.data.objects.new("Aim", None); aim.location = (0, 0, 1.0); bpy.context.collection.objects.link(aim)
- cam = bpy.data.objects.new("cam", bpy.data.cameras.new("cam")); cam.location = (0, -6.5, 3.0)
+ w.node_tree.nodes["Background"].inputs[0].default_value = (0.01, 0.011, 0.014, 1); sc.world = w
+ aim = bpy.data.objects.new("Aim", None); aim.location = (0, 0, 0.55); bpy.context.collection.objects.link(aim)
+ cam = bpy.data.objects.new("cam", bpy.data.cameras.new("cam")); cam.location = (0, -6.5, 2.2)
bpy.context.collection.objects.link(cam); sc.camera = cam
c = cam.constraints.new('TRACK_TO'); c.target = aim; c.track_axis = 'TRACK_NEGATIVE_Z'; c.up_axis = 'UP_Y'
- for nm, loc, en in [("K", (-4, -5, 7), 900), ("F2", (5, -4, 2), 350)]:
- ld = bpy.data.lights.new(nm, 'AREA'); ld.energy = en; ld.size = 5.0
+ # key, cool fill, warm rim
+ for nm, loc, en, sz, col in [("K", (-4, -5, 7), 1100, 5.0, (1.0, 0.98, 0.95)),
+ ("F2", (5, -4, 2), 220, 7.0, (0.85, 0.9, 1.0)),
+ ("R", (2.5, 6, 4), 700, 3.0, (1.0, 0.72, 0.45))]:
+ ld = bpy.data.lights.new(nm, 'AREA'); ld.energy = en; ld.size = sz; ld.color = col
lo = bpy.data.objects.new(nm, ld); lo.location = loc; bpy.context.collection.objects.link(lo)
lc = lo.constraints.new('TRACK_TO'); lc.target = aim; lc.track_axis = 'TRACK_NEGATIVE_Z'; lc.up_axis = 'UP_Y'
sc.render.engine = 'CYCLES' if engine == 'cycles' else get_eevee_engine_id()
if sc.render.engine == 'CYCLES':
- try: sc.cycles.samples = 16
+ try: sc.cycles.samples = 32
except Exception: pass
else:
- try: sc.eevee.taa_render_samples = 16
+ try: sc.eevee.taa_render_samples = 64
except Exception: pass
sc.render.resolution_x = 1280; sc.render.resolution_y = 720
sc.render.image_settings.file_format = 'PNG'; sc.render.filepath = path
diff --git a/examples/gn-sdf-remesh/preview.webp b/examples/gn-sdf-remesh/preview.webp
index 7aa53d4..f5823e0 100644
Binary files a/examples/gn-sdf-remesh/preview.webp and b/examples/gn-sdf-remesh/preview.webp differ
diff --git a/examples/wave-displace/preview.webp b/examples/wave-displace/preview.webp
index c5da19a..fa11060 100644
Binary files a/examples/wave-displace/preview.webp and b/examples/wave-displace/preview.webp differ
diff --git a/examples/wave-displace/wave_displace.py b/examples/wave-displace/wave_displace.py
index 093a9bf..aafc292 100644
--- a/examples/wave-displace/wave_displace.py
+++ b/examples/wave-displace/wave_displace.py
@@ -82,24 +82,27 @@ def render_still(obj, path, engine):
mat = bpy.data.materials.new("WaveMat")
mat.use_nodes = True
bsdf = mat.node_tree.nodes["Principled BSDF"]
- bsdf.inputs["Base Color"].default_value = (0.62, 0.68, 0.78, 1.0)
- bsdf.inputs["Roughness"].default_value = 0.35
+ bsdf.inputs["Base Color"].default_value = (0.012, 0.09, 0.38, 1.0) # deep sapphire
+ bsdf.inputs["Roughness"].default_value = 0.18
obj.data.materials.append(mat)
world = bpy.data.worlds.new("World")
world.use_nodes = True
- world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.045, 0.05, 0.06, 1.0)
+ world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.008, 0.009, 0.012, 1.0)
scene.world = world
- key = bpy.data.lights.new("Key", 'AREA'); key.energy = 1400.0; key.size = 7.0
+ # grazing cool key picks out the crests; warm rim from behind
+ key = bpy.data.lights.new("Key", 'AREA'); key.energy = 2000.0; key.size = 6.0
+ key.color = (0.9, 0.95, 1.0)
key_ob = bpy.data.objects.new("Key", key)
- key_ob.location = (-5.0, -6.0, 6.5)
- key_ob.rotation_euler = (math.radians(48), 0.0, math.radians(-35))
+ key_ob.location = (-6.5, -5.0, 3.2)
+ key_ob.rotation_euler = (math.radians(65), 0.0, math.radians(-50))
scene.collection.objects.link(key_ob)
- rim = bpy.data.lights.new("Rim", 'AREA'); rim.energy = 600.0; rim.size = 5.0
+ rim = bpy.data.lights.new("Rim", 'AREA'); rim.energy = 1300.0; rim.size = 4.0
+ rim.color = (1.0, 0.68, 0.38)
rim_ob = bpy.data.objects.new("Rim", rim)
- rim_ob.location = (4.0, 6.0, 4.5)
- rim_ob.rotation_euler = (math.radians(-55), 0.0, math.radians(150))
+ rim_ob.location = (4.5, 6.5, 2.6)
+ rim_ob.rotation_euler = (math.radians(-68), 0.0, math.radians(148))
scene.collection.objects.link(rim_ob)
cam_data = bpy.data.cameras.new("Cam"); cam_data.lens = 50.0
|