2026-03-11_1
This commit is contained in:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,9 +1,9 @@
|
||||
schema_version = "1.0.0"
|
||||
id = "add_camera_rigs"
|
||||
name = "Add Camera Rigs"
|
||||
version = "1.8.1"
|
||||
version = "1.8.2"
|
||||
tagline = "Adds a Camera Rig with UI"
|
||||
maintainer = "Community"
|
||||
maintainer = "Wayne Dixon <waylowinternet@gmail.com>"
|
||||
type = "add-on"
|
||||
tags = ["Camera"]
|
||||
blender_version_min = "4.2.0"
|
||||
|
||||
@@ -20,6 +20,15 @@ from .create_widgets import (
|
||||
)
|
||||
|
||||
|
||||
def lock_mch_transforms(rig):
|
||||
for bone in rig.pose.bones:
|
||||
if bone.name.startswith("MCH-"):
|
||||
bone.lock_location = (True, True, True)
|
||||
bone.lock_rotation = (True, True, True)
|
||||
bone.lock_rotation_w = True
|
||||
bone.lock_scale = (True, True, True)
|
||||
|
||||
|
||||
def create_prop_driver(rig, cam, prop_from, prop_to):
|
||||
"""Create driver to a property on the rig"""
|
||||
driver = cam.data.driver_add(prop_to)
|
||||
@@ -52,7 +61,7 @@ def create_dolly_bones(rig):
|
||||
root.color.palette = 'THEME02'
|
||||
collection_controls.assign(root)
|
||||
|
||||
ctrl_aim_child = bones.new("MCH-Aim_shape_rotation")
|
||||
ctrl_aim_child = bones.new("MCH-Aim_widget")
|
||||
ctrl_aim_child.head = (0.0, 10.0, 1.7)
|
||||
ctrl_aim_child.tail = (0.0, 11.0, 1.7)
|
||||
collection_mch.assign(ctrl_aim_child)
|
||||
@@ -107,7 +116,7 @@ def create_crane_bones(rig):
|
||||
root.color.palette = 'THEME02'
|
||||
collection_controls.assign(root)
|
||||
|
||||
ctrl_aim_child = bones.new("MCH-Aim_shape_rotation")
|
||||
ctrl_aim_child = bones.new("MCH-Aim_widget")
|
||||
ctrl_aim_child.head = (0.0, 10.0, 1.7)
|
||||
ctrl_aim_child.tail = (0.0, 11.0, 1.7)
|
||||
collection_mch.assign(ctrl_aim_child)
|
||||
@@ -147,7 +156,6 @@ def create_crane_bones(rig):
|
||||
height.color.palette = 'THEME07'
|
||||
collection_controls.assign(height)
|
||||
|
||||
|
||||
# Setup hierarchy
|
||||
ctrl.parent = arm
|
||||
ctrl_offset.parent = ctrl
|
||||
@@ -187,13 +195,15 @@ def setup_3d_rig(rig, cam):
|
||||
pb = pose_bones['Camera']
|
||||
pb["lens"] = 50.0
|
||||
ui_data = pb.id_properties_ui("lens")
|
||||
ui_data.update(min=1.0, max=1000000.0, soft_max=5000.0, default=50.0, subtype="DISTANCE_CAMERA")
|
||||
ui_data.update(min=1.0, max=1000000.0, soft_max=5000.0,
|
||||
default=50.0, subtype="DISTANCE_CAMERA")
|
||||
|
||||
# lens offset property
|
||||
pb = pose_bones['Camera']
|
||||
pb["lens_offset"] = 0.0
|
||||
ui_data = pb.id_properties_ui("lens_offset")
|
||||
ui_data.update(min=-1000000.0, max=1000000.0, soft_max = 5000.0, soft_min = -5000.0,default=0.0)
|
||||
ui_data.update(min=-1000000.0, max=1000000.0,
|
||||
soft_max=5000.0, soft_min=-5000.0, default=0.0)
|
||||
|
||||
# Build the widgets
|
||||
root_widget = create_root_widget("Camera_Root")
|
||||
@@ -207,11 +217,13 @@ def setup_3d_rig(rig, cam):
|
||||
pose_bones["Camera"].custom_shape = camera_widget
|
||||
pose_bones["Camera_Offset"].custom_shape = camera_offset_widget
|
||||
|
||||
#
|
||||
|
||||
# Set the "Override Transform" field to the mechanism position
|
||||
pose_bones["Aim"].custom_shape_transform = pose_bones["MCH-Aim_shape_rotation"]
|
||||
pose_bones["Aim"].custom_shape_transform = pose_bones["MCH-Aim_widget"]
|
||||
|
||||
# Add constraints to bones
|
||||
con = pose_bones['MCH-Aim_shape_rotation'].constraints.new('COPY_ROTATION')
|
||||
con = pose_bones['MCH-Aim_widget'].constraints.new('COPY_ROTATION')
|
||||
con.target = rig
|
||||
con.subtarget = "Camera"
|
||||
|
||||
@@ -249,6 +261,9 @@ def setup_3d_rig(rig, cam):
|
||||
var.targets[0].transform_type = 'SCALE_AVG'
|
||||
var.targets[0].bone_target = 'Root'
|
||||
|
||||
# lock all transforms on MCH bones
|
||||
lock_mch_transforms(rig)
|
||||
|
||||
|
||||
def create_2d_bones(rig, cam):
|
||||
"""Create bones for the 2D camera rig"""
|
||||
@@ -476,8 +491,10 @@ def create_2d_bones(rig, cam):
|
||||
pose_bones["Left_Corner"].lock_rotation = (True,) * 3
|
||||
pose_bones["Right_Corner"].lock_rotation = (True,) * 3
|
||||
|
||||
# Camera settings
|
||||
# lock all transforms on MCH bones
|
||||
lock_mch_transforms(rig)
|
||||
|
||||
# Camera settings
|
||||
cam.data.sensor_fit = "HORIZONTAL" # Avoids distortion in portrait format
|
||||
cam.data.dof.focus_object = rig
|
||||
cam.data.dof.focus_subtarget = "DOF"
|
||||
@@ -539,7 +556,8 @@ def create_2d_bones(rig, cam):
|
||||
|
||||
# Orthographic scale driver
|
||||
driver = cam.data.driver_add("ortho_scale").driver
|
||||
driver.expression = "abs({distance_x} - (left_x - right_x))".format(distance_x=corner_distance_x)
|
||||
driver.expression = "abs({distance_x} - (left_x - right_x))".format(
|
||||
distance_x=corner_distance_x)
|
||||
|
||||
for corner in ("left", "right"):
|
||||
var = driver.variables.new()
|
||||
@@ -694,6 +712,11 @@ def build_camera_rig(context, mode):
|
||||
rig.data.display_type = 'BBONE'
|
||||
# Change display to wire for object
|
||||
rig.display_type = 'WIRE'
|
||||
# Set the widgets to be 1.5 width (easier to see)
|
||||
if bpy.app.version >= (4, 2, 0):
|
||||
for bone in rig.pose.bones:
|
||||
if bone.custom_shape:
|
||||
bone.custom_shape_wire_width = 1.5
|
||||
|
||||
# Lock camera transforms
|
||||
cam.lock_location = (True,) * 3
|
||||
|
||||
@@ -27,6 +27,7 @@ def get_rig_and_cam(obj):
|
||||
return obj.parent, obj
|
||||
return None, None
|
||||
|
||||
|
||||
def calculate_aim_distance(obj):
|
||||
'''This will return the distance of the camera and the aim bone at the time it is called.'''
|
||||
camera_bone = obj.pose.bones['Camera'].matrix
|
||||
@@ -53,10 +54,12 @@ def poll_perspective(cls, context):
|
||||
|
||||
rig, cam = get_rig_and_cam(context.active_object)
|
||||
if cam.data.type == 'ORTHO':
|
||||
cls.poll_message_set("This operator is not supported for orthographic cameras.")
|
||||
cls.poll_message_set(
|
||||
"This operator is not supported for orthographic cameras.")
|
||||
return False
|
||||
if rig["rig_id"].lower() == '2d_rig':
|
||||
cls.poll_message_set("This operator is not supported for 2D camera rigs.")
|
||||
cls.poll_message_set(
|
||||
"This operator is not supported for 2D camera rigs.")
|
||||
return False
|
||||
return True
|
||||
|
||||
@@ -73,7 +76,8 @@ class ADD_CAMERA_RIGS_OT_set_scene_camera(Operator):
|
||||
|
||||
_rig, cam = get_rig_and_cam(context.active_object)
|
||||
if cam is context.scene.camera:
|
||||
cls.poll_message_set("Selected camera is already the scene camera.")
|
||||
cls.poll_message_set(
|
||||
"Selected camera is already the scene camera.")
|
||||
return False
|
||||
return True
|
||||
|
||||
@@ -120,7 +124,7 @@ class ADD_CAMERA_RIGS_OT_set_dof_bone(Operator):
|
||||
cam.data.dof.focus_object = rig
|
||||
cam.data.dof.focus_subtarget = (
|
||||
'DOF' if rig["rig_id"].lower() == '2d_rig'
|
||||
else 'MCH-Aim_shape_rotation')
|
||||
else 'Aim')
|
||||
|
||||
return {'FINISHED'}
|
||||
|
||||
@@ -169,7 +173,7 @@ class ADD_CAMERA_RIGS_OT_remove_dolly_zoom(Operator):
|
||||
# reset the offset back to zero
|
||||
rig.pose.bones["Camera"]["lens_offset"] = 0.0
|
||||
|
||||
#set the bone color to default
|
||||
# set the bone color to default
|
||||
rig.pose.bones["Aim"].color.palette = 'DEFAULT'
|
||||
|
||||
return {'FINISHED'}
|
||||
@@ -191,16 +195,20 @@ class ADD_CAMERA_RIGS_OT_shift_to_pivot(Operator):
|
||||
aim_loc = rig.pose.bones["Aim"].matrix_basis.to_translation()
|
||||
|
||||
# create a transform matrix for the z loc of the aim bone
|
||||
mat_trans = mathutils.Matrix.Translation( [0, 0, aim_loc[2] + 1.7 ]) # Hardcoded height of rest position
|
||||
mat_trans = mathutils.Matrix.Translation(
|
||||
[0, 0, aim_loc[2] + 1.7]) # Hardcoded height of rest position
|
||||
# repostion the aim bone so it's above the root (using the original z value)
|
||||
rig.pose.bones["Aim"].matrix = rig.pose.bones["Root"].matrix @ mat_trans
|
||||
|
||||
# offset the camera matrix relative to the new aim position
|
||||
camera_offset_vector = (rig.pose.bones["Aim"].matrix_basis.to_translation() ) - aim_loc
|
||||
camera_offset_matrix = mathutils.Matrix.Translation(camera_offset_vector)
|
||||
camera_offset_vector = (
|
||||
rig.pose.bones["Aim"].matrix_basis.to_translation()) - aim_loc
|
||||
camera_offset_matrix = mathutils.Matrix.Translation(
|
||||
camera_offset_vector)
|
||||
rig.pose.bones["Camera"].matrix = rig.pose.bones["Camera"].matrix @ camera_offset_matrix
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class ADD_CAMERA_RIGS_OT_swap_lens(Operator):
|
||||
bl_idname = "add_camera_rigs.swap_lens"
|
||||
bl_label = "Swap Lens"
|
||||
|
||||
Reference in New Issue
Block a user