twanghcmut's picture
download
raw
1.68 kB
from dataclasses import dataclass
SIDES = ("left", "right")
FINGERS = ("Index", "Middle", "Ring", "Little")
ARKIT_FINGER_PARTS = (
"Metacarpal",
"Knuckle",
"IntermediateBase",
"IntermediateTip",
"Tip",
)
ARKIT_THUMB = (
"ThumbKnuckle",
"ThumbIntermediateBase",
"ThumbIntermediateTip",
"ThumbTip",
)
@dataclass(frozen=True)
class Skeleton:
joints: tuple
parents: tuple
keypoints: tuple
@property
def size(self):
return len(self.joints)
@property
def children(self):
return tuple(
tuple(j for j in range(self.size) if self.parents[j] == i)
for i in range(self.size)
)
def _chain_skeleton(root, chains, is_keypoint):
joints, parents = [root], [-1]
for chain in chains:
previous = 0
for name in chain:
joints.append(name)
parents.append(previous)
previous = len(joints) - 1
keypoints = tuple(i for i, name in enumerate(joints) if is_keypoint(name))
return Skeleton(tuple(joints), tuple(parents), keypoints)
ARKIT = _chain_skeleton(
"Hand",
[ARKIT_THUMB]
+ [[f"{finger}Finger{part}" for part in ARKIT_FINGER_PARTS] for finger in FINGERS],
lambda name: not name.endswith("Metacarpal"),
)
MANO = _chain_skeleton(
"Wrist",
[[f"{finger}{i}" for i in range(1, 5)] for finger in ("Thumb",) + FINGERS],
lambda name: True,
)
KP21_BONES = [(0, 1), (1, 2), (2, 3), (3, 4)] + [
bone
for finger in range(4)
for bone in [(0, 5 + 4 * finger)]
+ [(5 + 4 * finger + i, 6 + 4 * finger + i) for i in range(3)]
]
def joint_name(side, joint):
return f"{side}{joint}"

Xet Storage Details

Size:
1.68 kB
·
Xet hash:
24d1ea35fc5cf0cb233d879e5a92d15a6172289f15dedb47388c1b335abd97f4

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.