The below code will rotate a selection of objects around an arbitrary location (using the active object's location here) by the chosen angle (45 in this example). I cobbled this code together from a few places but I don't fully understand how to manipulate matrices very well yet. If you create a few objects and press **run script** you'll see 45 degrees is added to the objects while transforming them around the active object. This is almost exactly what I need minus one issue. I need this code to **set** the rotation value to 45 (or whatever arbitrary value) when the script is run ***not*** add 45 degrees to the selection of object's matrices. import bpy from math import radians from mathutils import Matrix ob = bpy.context.object rot_point = ob.location rot_angle = 45 rot_axis = 'Y' mat = (Matrix.Translation(rot_point) * Matrix.Rotation(radians(rot_angle), 4, rot_axis) * Matrix.Translation(-rot_point)) for obj in bpy.context.selected_objects: obj.matrix_world = mat * obj.matrix_world EDIT: If you create a few random objects, select them and then run the script, each time you run the script 45 degrees (45 degrees is an arbitrary value, it means nothing, just a random input value for this example) will be added to the object rotation values (as displayed in the clip below). This is good, and I need the objects to move like they're moving. Ultimately the value controlled by rot_angle will be fed into from mouse coordinates in a modal though, so I don't need the code to add the rot_angle value to these object's values, I need to be able to set them. Ultimately, the code should rotate the objects around whatever chosen rot_point in the manner displayed below, however once rotated, pressing run script shouldn't do anything. As the code stands, when fed into a modal it breaks everything because the code continually adds to the values with the mouse movement instead of setting them. [![enter image description here][1]][1] [1]: https://i.sstatic.net/wqtx3.gif UPDATE: The below code sort of does what I want. The problem is it starts breaking down once the object gets rotated in to many ways. If I could subtract the rotation matrix values to get the same results for the rotation angle difference (ra_dif) instead of comparing against the Euler rotation value of the object, I'm guessing it would work better. How could I do that? Or does someone see a better (less dense) way of accomplishing what I'm trying to do here? import bpy from math import radians,degrees from mathutils import Matrix ob = bpy.context.object rot_point = bpy.context.scene.cursor_location rot_angle = 45 rot_axis = 'Y' ra_dif = rot_angle - round(degrees(ob.rotation_euler.y)) print(ra_dif) mat = (Matrix.Translation(rot_point) * Matrix.Rotation(radians(ra_dif), 4, rot_axis) * Matrix.Translation(-rot_point)) for obj in bpy.context.selected_objects: obj.matrix_world = mat * obj.matrix_world