Skip to content

Commit 14a10cb

Browse files
waylowPiOverFour
authored andcommitted
Fix Add Camera Rigs after 4.0 API changes
This pull request updates the 'add camera rigs' addon to use bone collections for the 4.0 release. It also adjusts some of the naming convention to match the Rigify. Pull Request: https://projects.blender.org/blender/blender-addons/pulls/104919
1 parent 7d2a5f2 commit 14a10cb

File tree

2 files changed

+72
-45
lines changed

2 files changed

+72
-45
lines changed

add_camera_rigs/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
bl_info = {
66
"name": "Add Camera Rigs",
77
"author": "Wayne Dixon, Brian Raschko, Kris Wittig, Damien Picard, Flavio Perez",
8-
"version": (1, 5, 1),
9-
"blender": (3, 3, 0),
8+
"version": (1, 6, 0),
9+
"blender": (4, 0, 0),
1010
"location": "View3D > Add > Camera > Dolly or Crane Rig",
1111
"description": "Adds a Camera Rig with UI",
1212
"doc_url": "{BLENDER_MANUAL_URL}/addons/camera/camera_rigs.html",

add_camera_rigs/build_rigs.py

+70-43
Original file line numberDiff line numberDiff line change
@@ -36,26 +36,35 @@ def create_dolly_bones(rig):
3636
root = bones.new("Root")
3737
root.tail = (0.0, 1.0, 0.0)
3838
root.show_wire = True
39+
rig.data.collections.new(name="Controls")
40+
rig.data.collections['Controls'].assign(root)
3941

40-
ctrl_aim_child = bones.new("Aim_shape_rotation-MCH")
42+
ctrl_aim_child = bones.new("MCH-Aim_shape_rotation")
4143
ctrl_aim_child.head = (0.0, 10.0, 1.7)
4244
ctrl_aim_child.tail = (0.0, 11.0, 1.7)
43-
ctrl_aim_child.layers = tuple(i == 1 for i in range(32))
45+
# Create bone collection and assign bone
46+
rig.data.collections.new(name="MCH")
47+
rig.data.collections['MCH'].assign(ctrl_aim_child)
48+
rig.data.collections['MCH'].is_visible = False
4449

4550
ctrl_aim = bones.new("Aim")
4651
ctrl_aim.head = (0.0, 10.0, 1.7)
4752
ctrl_aim.tail = (0.0, 11.0, 1.7)
4853
ctrl_aim.show_wire = True
54+
rig.data.collections['Controls'].assign(ctrl_aim)
4955

5056
ctrl = bones.new("Camera")
5157
ctrl.head = (0.0, 0.0, 1.7)
5258
ctrl.tail = (0.0, 1.0, 1.7)
5359
ctrl.show_wire = True
60+
rig.data.collections['Controls'].assign(ctrl)
5461

55-
ctrl_offset = bones.new("Camera_offset")
62+
ctrl_offset = bones.new("Camera_Offset")
5663
ctrl_offset.head = (0.0, 0.0, 1.7)
5764
ctrl_offset.tail = (0.0, 1.0, 1.7)
5865
ctrl_offset.show_wire = True
66+
rig.data.collections['Controls'].assign(ctrl_offset)
67+
5968

6069
# Setup hierarchy
6170
ctrl.parent = root
@@ -67,7 +76,7 @@ def create_dolly_bones(rig):
6776
bpy.ops.object.mode_set(mode='OBJECT')
6877
pose_bones = rig.pose.bones
6978
# Lock the relevant scale channels of the Camera_offset bone
70-
pose_bones["Camera_offset"].lock_scale = (True,) * 3
79+
pose_bones["Camera_Offset"].lock_scale = (True,) * 3
7180

7281

7382
def create_crane_bones(rig):
@@ -78,42 +87,51 @@ def create_crane_bones(rig):
7887
root = bones.new("Root")
7988
root.tail = (0.0, 1.0, 0.0)
8089
root.show_wire = True
90+
rig.data.collections.new(name="Controls")
91+
rig.data.collections['Controls'].assign(root)
8192

82-
ctrl_aim_child = bones.new("Aim_shape_rotation-MCH")
93+
ctrl_aim_child = bones.new("MCH-Aim_shape_rotation")
8394
ctrl_aim_child.head = (0.0, 10.0, 1.7)
8495
ctrl_aim_child.tail = (0.0, 11.0, 1.7)
85-
ctrl_aim_child.layers = tuple(i == 1 for i in range(32))
96+
rig.data.collections.new(name="MCH")
97+
rig.data.collections['MCH'].assign(ctrl_aim_child)
98+
rig.data.collections['MCH'].is_visible = False
8699

87100
ctrl_aim = bones.new("Aim")
88101
ctrl_aim.head = (0.0, 10.0, 1.7)
89102
ctrl_aim.tail = (0.0, 11.0, 1.7)
90103
ctrl_aim.show_wire = True
104+
rig.data.collections['Controls'].assign(ctrl_aim)
91105

92106
ctrl = bones.new("Camera")
93107
ctrl.head = (0.0, 1.0, 1.7)
94108
ctrl.tail = (0.0, 2.0, 1.7)
109+
rig.data.collections['Controls'].assign(ctrl)
95110

96-
ctrl_offset = bones.new("Camera_offset")
111+
ctrl_offset = bones.new("Camera_Offset")
97112
ctrl_offset.head = (0.0, 1.0, 1.7)
98113
ctrl_offset.tail = (0.0, 2.0, 1.7)
114+
rig.data.collections['Controls'].assign(ctrl_offset)
99115

100-
arm = bones.new("Crane_arm")
116+
arm = bones.new("Crane_Arm")
101117
arm.head = (0.0, 0.0, 1.7)
102118
arm.tail = (0.0, 1.0, 1.7)
119+
rig.data.collections['Controls'].assign(arm)
103120

104-
height = bones.new("Crane_height")
121+
height = bones.new("Crane_Height")
105122
height.head = (0.0, 0.0, 0.0)
106123
height.tail = (0.0, 0.0, 1.7)
124+
rig.data.collections['Controls'].assign(height)
107125

108126
# Setup hierarchy
109127
ctrl.parent = arm
110128
ctrl_offset.parent = ctrl
111129
ctrl.use_inherit_rotation = False
112-
ctrl.use_inherit_scale = False
130+
ctrl.inherit_scale = "NONE"
113131
ctrl.show_wire = True
114132

115133
arm.parent = height
116-
arm.use_inherit_scale = False
134+
arm.inherit_scale = "NONE"
117135

118136
height.parent = root
119137
ctrl_aim.parent = root
@@ -124,12 +142,12 @@ def create_crane_bones(rig):
124142
pose_bones = rig.pose.bones
125143

126144
# Lock the relevant loc, rot and scale
127-
pose_bones["Crane_arm"].lock_rotation = (False, True, False)
128-
pose_bones["Crane_arm"].lock_scale = (True, False, True)
129-
pose_bones["Crane_height"].lock_location = (True,) * 3
130-
pose_bones["Crane_height"].lock_rotation = (True,) * 3
131-
pose_bones["Crane_height"].lock_scale = (True, False, True)
132-
pose_bones["Camera_offset"].lock_scale = (True,) * 3
145+
pose_bones["Crane_Arm"].lock_rotation = (False, True, False)
146+
pose_bones["Crane_Arm"].lock_scale = (True, False, True)
147+
pose_bones["Crane_Height"].lock_location = (True,) * 3
148+
pose_bones["Crane_Height"].lock_rotation = (True,) * 3
149+
pose_bones["Crane_Height"].lock_scale = (True, False, True)
150+
pose_bones["Camera_Offset"].lock_scale = (True,) * 3
133151

134152

135153
def setup_3d_rig(rig, cam):
@@ -149,20 +167,20 @@ def setup_3d_rig(rig, cam):
149167
# Build the widgets
150168
root_widget = create_root_widget("Camera_Root")
151169
camera_widget = create_camera_widget("Camera")
152-
camera_offset_widget = create_camera_offset_widget("Camera_offset")
170+
camera_offset_widget = create_camera_offset_widget("Camera_Offset")
153171
aim_widget = create_aim_widget("Aim")
154172

155173
# Add the custom bone shapes
156174
pose_bones["Root"].custom_shape = root_widget
157175
pose_bones["Aim"].custom_shape = aim_widget
158176
pose_bones["Camera"].custom_shape = camera_widget
159-
pose_bones["Camera_offset"].custom_shape = camera_offset_widget
177+
pose_bones["Camera_Offset"].custom_shape = camera_offset_widget
160178

161179
# Set the "Override Transform" field to the mechanism position
162-
pose_bones["Aim"].custom_shape_transform = pose_bones["Aim_shape_rotation-MCH"]
180+
pose_bones["Aim"].custom_shape_transform = pose_bones["MCH-Aim_shape_rotation"]
163181

164182
# Add constraints to bones
165-
con = pose_bones['Aim_shape_rotation-MCH'].constraints.new('COPY_ROTATION')
183+
con = pose_bones['MCH-Aim_shape_rotation'].constraints.new('COPY_ROTATION')
166184
con.target = rig
167185
con.subtarget = "Camera"
168186

@@ -189,29 +207,38 @@ def create_2d_bones(context, rig, cam):
189207
root = bones.new("Root")
190208
root.tail = Vector((0.0, 0.0, 1.0))
191209
root.show_wire = True
210+
rig.data.collections.new(name="Controls")
211+
rig.data.collections['Controls'].assign(root)
192212

193213
ctrl = bones.new('Camera')
194214
ctrl.tail = Vector((0.0, 0.0, 1.0))
195215
ctrl.show_wire = True
216+
rig.data.collections['Controls'].assign(ctrl)
196217

197-
left_corner = bones.new("Left_corner")
218+
left_corner = bones.new("Left_Corner")
198219
left_corner.head = (-3, 10, -2)
199220
left_corner.tail = left_corner.head + Vector((0.0, 0.0, 1.0))
200221
left_corner.show_wire = True
222+
rig.data.collections['Controls'].assign(left_corner)
201223

202-
right_corner = bones.new("Right_corner")
224+
right_corner = bones.new("Right_Corner")
203225
right_corner.head = (3, 10, -2)
204226
right_corner.tail = right_corner.head + Vector((0.0, 0.0, 1.0))
205227
right_corner.show_wire = True
228+
rig.data.collections['Controls'].assign(right_corner)
206229

207230
corner_distance_x = (left_corner.head - right_corner.head).length
208231
corner_distance_y = -left_corner.head.z
209232
corner_distance_z = left_corner.head.y
233+
rig.data.collections['Controls'].assign(root)
210234

211-
center = bones.new("Center-MCH")
235+
center = bones.new("MCH-Center")
212236
center.head = ((right_corner.head + left_corner.head) / 2.0)
213237
center.tail = center.head + Vector((0.0, 0.0, 1.0))
214-
center.layers = tuple(i == 1 for i in range(32))
238+
center.show_wire = True
239+
rig.data.collections.new(name="MCH")
240+
rig.data.collections['MCH'].assign(center)
241+
rig.data.collections['MCH'].is_visible = False
215242
center.show_wire = True
216243

217244
# Setup hierarchy
@@ -227,7 +254,7 @@ def create_2d_bones(context, rig, cam):
227254
bone.rotation_mode = 'XYZ'
228255

229256
# Bone drivers
230-
center_drivers = pose_bones["Center-MCH"].driver_add("location")
257+
center_drivers = pose_bones["MCH-Center"].driver_add("location")
231258

232259
# Center X driver
233260
driver = center_drivers[0].driver
@@ -238,7 +265,7 @@ def create_2d_bones(context, rig, cam):
238265
var.name = corner
239266
var.type = 'TRANSFORMS'
240267
var.targets[0].id = rig
241-
var.targets[0].bone_target = corner.capitalize() + '_corner'
268+
var.targets[0].bone_target = corner.capitalize() + '_Corner'
242269
var.targets[0].transform_type = 'LOC_X'
243270
var.targets[0].transform_space = 'TRANSFORM_SPACE'
244271

@@ -255,7 +282,7 @@ def create_2d_bones(context, rig, cam):
255282
var.name = '%s_%s' % (corner, direction)
256283
var.type = 'TRANSFORMS'
257284
var.targets[0].id = rig
258-
var.targets[0].bone_target = corner.capitalize() + '_corner'
285+
var.targets[0].bone_target = corner.capitalize() + '_Corner'
259286
var.targets[0].transform_type = 'LOC_' + direction.upper()
260287
var.targets[0].transform_space = 'TRANSFORM_SPACE'
261288

@@ -275,31 +302,31 @@ def create_2d_bones(context, rig, cam):
275302
var.name = corner
276303
var.type = 'TRANSFORMS'
277304
var.targets[0].id = rig
278-
var.targets[0].bone_target = corner.capitalize() + '_corner'
305+
var.targets[0].bone_target = corner.capitalize() + '_Corner'
279306
var.targets[0].transform_type = 'LOC_Z'
280307
var.targets[0].transform_space = 'TRANSFORM_SPACE'
281308

282309
# Bone constraints
283310
con = pose_bones["Camera"].constraints.new('DAMPED_TRACK')
284311
con.target = rig
285-
con.subtarget = "Center-MCH"
312+
con.subtarget = "MCH-Center"
286313
con.track_axis = 'TRACK_NEGATIVE_Z'
287314

288315
# Build the widgets
289-
left_widget = create_corner_widget("Left_corner", reverse=True)
290-
right_widget = create_corner_widget("Right_corner")
316+
left_widget = create_corner_widget("Left_Corner", reverse=True)
317+
right_widget = create_corner_widget("Right_Corner")
291318
parent_widget = create_circle_widget("Root", radius=0.5)
292319
camera_widget = create_circle_widget("Camera_2D", radius=0.3)
293320

294321
# Add the custom bone shapes
295-
pose_bones["Left_corner"].custom_shape = left_widget
296-
pose_bones["Right_corner"].custom_shape = right_widget
322+
pose_bones["Left_Corner"].custom_shape = left_widget
323+
pose_bones["Right_Corner"].custom_shape = right_widget
297324
pose_bones["Root"].custom_shape = parent_widget
298325
pose_bones["Camera"].custom_shape = camera_widget
299326

300327
# Lock the relevant loc, rot and scale
301-
pose_bones["Left_corner"].lock_rotation = (True,) * 3
302-
pose_bones["Right_corner"].lock_rotation = (True,) * 3
328+
pose_bones["Left_Corner"].lock_rotation = (True,) * 3
329+
pose_bones["Right_Corner"].lock_rotation = (True,) * 3
303330
pose_bones["Camera"].lock_rotation = (True,) * 3
304331
pose_bones["Camera"].lock_scale = (True,) * 3
305332

@@ -331,18 +358,18 @@ def create_2d_bones(context, rig, cam):
331358
var.name = 'frame_width'
332359
var.type = 'LOC_DIFF'
333360
var.targets[0].id = rig
334-
var.targets[0].bone_target = "Left_corner"
361+
var.targets[0].bone_target = "Left_Corner"
335362
var.targets[0].transform_space = 'WORLD_SPACE'
336363
var.targets[1].id = rig
337-
var.targets[1].bone_target = "Right_corner"
364+
var.targets[1].bone_target = "Right_Corner"
338365
var.targets[1].transform_space = 'WORLD_SPACE'
339366

340367
for corner in ('left', 'right'):
341368
var = driver.variables.new()
342369
var.name = corner + '_z'
343370
var.type = 'TRANSFORMS'
344371
var.targets[0].id = rig
345-
var.targets[0].bone_target = corner.capitalize() + '_corner'
372+
var.targets[0].bone_target = corner.capitalize() + '_Corner'
346373
var.targets[0].transform_type = 'LOC_Z'
347374
var.targets[0].transform_space = 'TRANSFORM_SPACE'
348375

@@ -363,7 +390,7 @@ def create_2d_bones(context, rig, cam):
363390
var.name = corner + '_x'
364391
var.type = 'TRANSFORMS'
365392
var.targets[0].id = rig
366-
var.targets[0].bone_target = corner.capitalize() + '_corner'
393+
var.targets[0].bone_target = corner.capitalize() + '_Corner'
367394
var.targets[0].transform_type = 'LOC_X'
368395
var.targets[0].transform_space = 'TRANSFORM_SPACE'
369396

@@ -385,7 +412,7 @@ def create_2d_bones(context, rig, cam):
385412
var.name = '%s_%s' % (corner, direction)
386413
var.type = 'TRANSFORMS'
387414
var.targets[0].id = rig
388-
var.targets[0].bone_target = corner.capitalize() + '_corner'
415+
var.targets[0].bone_target = corner.capitalize() + '_Corner'
389416
var.targets[0].transform_type = 'LOC_' + direction.upper()
390417
var.targets[0].transform_space = 'TRANSFORM_SPACE'
391418

@@ -422,7 +449,7 @@ def create_2d_bones(context, rig, cam):
422449
var.name = '%s_%s' % (corner, direction)
423450
var.type = 'TRANSFORMS'
424451
var.targets[0].id = rig
425-
var.targets[0].bone_target = corner.capitalize() + '_corner'
452+
var.targets[0].bone_target = corner.capitalize() + '_Corner'
426453
var.targets[0].transform_type = 'LOC_' + direction.upper()
427454
var.targets[0].transform_space = 'TRANSFORM_SPACE'
428455

@@ -484,7 +511,7 @@ def build_camera_rig(context, mode):
484511
if mode == "2D":
485512
cam.parent_bone = "Camera"
486513
else:
487-
cam.parent_bone = "Camera_offset"
514+
cam.parent_bone = "Camera_Offset"
488515

489516
# Change display to BBone: it just looks nicer
490517
rig.data.display_type = 'BBONE'

0 commit comments

Comments
 (0)