Correcting Gimble Lock Using Set Driven Keys

By Brian J. Immel

Set up the Joints

1. Create skeleton setup similar to image below.

2. Select the Shoulder_upper and group it. Name the group Shoulder_group. Note: if you create this group and it not centered on the Shoulder_upper joint, center it so that it is! To avoid gimble lock, we need another pivot to draw rotational information so that when we rotate one axis on top of another, it will not lock.

Create the Controller

1. Create the letter S using a NURBS curve (Create > Text > option box).

2. In the outliner, select the curve1 and unparent it. Delete Text_S_1. The reason we are deleting the groups is to avoid any issues about selecting orders and assigning new attributes to the wrong node later on.

3. Select curve1 and rename it to Shoulder_Control.

4. Using the Add Attribute window add the following attributes to the Shoulder_Control:

  • Shoulder UD Min: -10, Max 10, Default 0. UD stands for Up and Down.
  • Shoulder TW Min: -10, Max 10, Default 0. TW stands for Twist.
  • Shoulder FB Min: -10, Max 10, Default 0. FB stands for Forward and Backward.

 

5. You Attribute Editor should look like Figure 2 when you select Shoulder_Control.

6. Next we are going to set up the Set Driven Keys using the SDK window. Using the Set Driven Key window, load Shoulder_Control as the Driver.

7. Select the Shoulder_group and Shoulder_upper joint and load them as the Driven.

 

Set Driven Keys

1. Highlight ShoulderUD in the Driver section and highlight rotateX of Shoulder_upper in the Driven section and hit Key. RotateX should control the up and down motions of the shoulder rotation. If this rotation does not perform this function, select the appropriate rotation and set the SDKs as necessary.

2. Set ShoulderUD to 10.

3. Rotate Shoulder_upper rotateX to 90.

4. Hit Key in the Set Driven Key window.

5. Set ShoulderUD to -10.

6. Rotate Shoulder_upper rotateX to -90.

7. Hit Key in the Set Driven Key window.

8. Set ShoulderUD to 0.

9. Highlight ShoulderTW in the Driver section and highlight rotateZ of Shoulder_upper in the Driven section and hit Key. RotateZ should control the twisting motion of the entire arm from the shoulder down. If this rotation does not perform this function, select the appropriate rotation and set the SDKs as necessary.

10. Set ShoulderTW to 10.

11. Rotate Shoulder_upper rotateZ to 90.

12. Hit Key in the Set Driven Key window.

13. Set ShoulderTW to -10.

14. Rotate Shoulder_upper rotateZ to -90.

15. Hit Key in the Set Driven Key window.

16. Set ShoulderTW to 0.

17. Highlight ShoulderFB in the Driver section and highlight rotateY of Shoulder_group in the Driven section and hit Key. RotateY of the Shoulder_group should rotate the entire hierarchy forward and backward. If this rotation does not perform this function, select the appropriate rotation and set the SDKs as necessary.

18. Set ShoulderFB to 10.

19. Rotate Shoulder_upper rotateY to 90.

20. Hit Key in the Set Driven Key window.

21. Set ShoulderFB to -10.

22. Rotate Shoulder_upper rotateY to -90.

23. Hit Key in the Set Driven Key window.

24. Set ShoulderFB to 0.

Another option to help bend the shoulder up/down and forward/backward is to set up the Shoulder_lower in the SDKs as well. Give the Shoulder_upper joint the majority of the rotational values and the Shoulder_lower joint a fraction of the total rotations. Example: if the total rotation of the shoulder moving forward is 90, the give the Shoulder_upper joint 60 and Shoulder_lower joint 30.

 

 

Top

Special thanks to Linda for her input and suggestions. Any comments or suggestions please email them to brian@jawa9000.com.