follow bone method
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
import bpy
|
||||
import math
|
||||
|
||||
from mathutils import Vector, Matrix
|
||||
from bpy_extras.object_utils import world_to_camera_view
|
||||
|
||||
def get_bone_head_tail_2d(posebone, scene=None, cam=None) -> tuple[Vector, Vector]:
|
||||
'''Get 2D vectors in camera view of bone head and tails
|
||||
return tuple of 2d vectors (head_2d and tail_2d)
|
||||
'''
|
||||
scene = scene or bpy.context.scene
|
||||
cam = cam or scene.camera
|
||||
|
||||
arm = posebone.id_data
|
||||
|
||||
# Get 3D locations of head and tail
|
||||
head_3d = arm.matrix_world @ posebone.head
|
||||
tail_3d = arm.matrix_world @ posebone.tail
|
||||
|
||||
# Convert 3D locations to 2D
|
||||
head_2d = world_to_camera_view(scene, cam, head_3d)
|
||||
tail_2d = world_to_camera_view(scene, cam, tail_3d)
|
||||
|
||||
ratio = scene.render.resolution_y / scene.render.resolution_x
|
||||
head_2d.y *= ratio
|
||||
tail_2d.y *= ratio
|
||||
|
||||
return Vector((head_2d.x, head_2d.y)), Vector((tail_2d.x, tail_2d.y))
|
||||
|
||||
|
||||
def rotate_matrix_around_pivot(matrix, angle, pivot, axis):
|
||||
'''Rotate a given matrix by a CW angle around pivot on a given axis
|
||||
matrix (Matrix): the matrix to rotate
|
||||
angle (Float, Radians): the angle in radians
|
||||
pivot (Vector3): the pivot 3D coordinate
|
||||
axis (Vector3): the vector axis of rotation
|
||||
'''
|
||||
|
||||
# Convert angle to radians ?
|
||||
# angle = math.radians(angle)
|
||||
|
||||
# Create a rotation matrix
|
||||
rot_matrix = Matrix.Rotation(angle, 4, axis)
|
||||
|
||||
# Create translation matrices
|
||||
translate_to_origin = Matrix.Translation(-pivot)
|
||||
translate_back = Matrix.Translation(pivot)
|
||||
|
||||
# Combine the transformations : The order of multiplication is important
|
||||
new_matrix = translate_back @ rot_matrix @ translate_to_origin @ matrix
|
||||
|
||||
return new_matrix
|
||||
Reference in New Issue
Block a user