Buckets:
| 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", | |
| ) | |
| class Skeleton: | |
| joints: tuple | |
| parents: tuple | |
| keypoints: tuple | |
| def size(self): | |
| return len(self.joints) | |
| 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.