dashdoas commited on
Commit
dc4ff4b
·
verified ·
1 Parent(s): 0834f69

Upload 41 files

Browse files
Files changed (42) hide show
  1. .gitattributes +3 -0
  2. animation/.DS_Store +0 -0
  3. animation/README.md +77 -0
  4. animation/demo.sh +7 -0
  5. animation/download.py +13 -0
  6. animation/inputs/.DS_Store +0 -0
  7. animation/inputs/crocodile/first_frames/render_back.png +0 -0
  8. animation/inputs/crocodile/first_frames/render_front.png +0 -0
  9. animation/inputs/crocodile/first_frames/render_left.png +0 -0
  10. animation/inputs/crocodile/first_frames/render_right.png +0 -0
  11. animation/inputs/crocodile/input.mp4 +3 -0
  12. animation/inputs/crocodile/objs/material.mtl +7 -0
  13. animation/inputs/crocodile/objs/mesh.obj +0 -0
  14. animation/inputs/crocodile/objs/rig.txt +2611 -0
  15. animation/inputs/fish/first_frames/render_back.png +0 -0
  16. animation/inputs/fish/first_frames/render_front.png +0 -0
  17. animation/inputs/fish/first_frames/render_left.png +0 -0
  18. animation/inputs/fish/first_frames/render_right.png +0 -0
  19. animation/inputs/fish/input.mp4 +3 -0
  20. animation/inputs/fish/objs/fish_texture.png +3 -0
  21. animation/inputs/fish/objs/material.mtl +8 -0
  22. animation/inputs/fish/objs/mesh.obj +0 -0
  23. animation/inputs/fish/objs/rig.txt +1204 -0
  24. animation/model.py +199 -0
  25. animation/optimization.py +626 -0
  26. animation/renderer.py +348 -0
  27. animation/third_partys/.DS_Store +0 -0
  28. animation/utils/cameras/back.json +1 -0
  29. animation/utils/cameras/back_left.json +64 -0
  30. animation/utils/cameras/back_right.json +64 -0
  31. animation/utils/cameras/front.json +1 -0
  32. animation/utils/cameras/front_left.json +64 -0
  33. animation/utils/cameras/front_right.json +64 -0
  34. animation/utils/cameras/left.json +1 -0
  35. animation/utils/cameras/right.json +1 -0
  36. animation/utils/data_loader.py +170 -0
  37. animation/utils/loss_utils.py +420 -0
  38. animation/utils/misc.py +34 -0
  39. animation/utils/quat_utils.py +179 -0
  40. animation/utils/render_first_frame.py +93 -0
  41. animation/utils/save_flow.py +288 -0
  42. animation/utils/save_utils.py +374 -0
.gitattributes CHANGED
@@ -33,3 +33,6 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ animation/inputs/crocodile/input.mp4 filter=lfs diff=lfs merge=lfs -text
37
+ animation/inputs/fish/input.mp4 filter=lfs diff=lfs merge=lfs -text
38
+ animation/inputs/fish/objs/fish_texture.png filter=lfs diff=lfs merge=lfs -text
animation/.DS_Store ADDED
Binary file (6.15 kB). View file
 
animation/README.md ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 3D Animation with Video Guidance
2
+ This repository provides a complete pipeline for generating 3D object animations with video guidance. The system includes data processing and optimization algorithms for rigging-based animation.
3
+
4
+ ## Overview
5
+ The pipeline takes a rigged 3D model and a reference video, then optimizes the object's motion to match the video guidance while maintaining realistic skeletal constraints.
6
+
7
+ ## Prerequisites
8
+
9
+ ### Model Downloads
10
+ Download the required pre-trained models:
11
+
12
+ - [Video-Depth-Anything](https://huggingface.co/depth-anything/Video-Depth-Anything-Large) - For depth estimation
13
+ - [CoTracker3](https://huggingface.co/facebook/cotracker3) - For point tracking
14
+
15
+ ```
16
+ python download.py
17
+ ```
18
+
19
+ ### Input Data Structure
20
+
21
+ Organize your input data as follows:
22
+ ```
23
+ inputs/
24
+ └── {seq_name}/
25
+ ├── objs/
26
+ │ ├── mesh.obj # 3D mesh geometry
27
+ │ ├── rig.txt # Rigging definition
28
+ │ ├── material.mtl # Material properties (optional)
29
+ │ └── texture.png # Texture maps (optional)
30
+ ├── first_frames/ # Rendered initial frames
31
+ ├── imgs/ # Extracted video frames
32
+ ├── flow/ # Optical flow data
33
+ ├── flow_vis/ # Visualized optical flow
34
+ ├── depth/ # Esitmated depth data
35
+ ├── track_2d_verts/ # tracked vertices
36
+ ├── track_2d_joints/ # tracked joints
37
+ └── input.mp4 # Source video
38
+ ```
39
+
40
+ ## Data Processing
41
+
42
+ Given a 3D model with rigging under `inputs/{seq_name}/objs` (`mesh.obj, rig.txt`, optional `.mtl` and texture `.png`), we first render the object from a specified viewpoint. This image is used as the input (first frame) to the video generation model (e.g., [Jimeng AI](https://jimeng.jianying.com/ai-tool/home?type=video)).
43
+
44
+ ```
45
+ python utils/render_first_frame.py --input_path inputs --seq_name {seq_name}
46
+ ```
47
+ Replace `{seq_name}` with your sequence name. The first-frame images are saved to `inputs/{seq_name}/first_frames`. This generates reference images from 4 different viewpoints (you can add more). Choose the viewpoint that best shows the object's joints and key parts for optimal animation results. Save the generated videos to `inputs/{seq_name}/input.mp4`.
48
+
49
+ Then we extract the frames from the video by running:
50
+
51
+ ```
52
+ cd inputs/{seq_name}; mkdir imgs
53
+ ffmpeg -i input.mp4 -vf fps=10 imgs/frame_%04d.png
54
+ cd ../../
55
+ ```
56
+
57
+ Estimate optical flows by running:
58
+
59
+ ```
60
+ python utils/save_flow.py --input_path inputs --seq_name {seq_name}
61
+ ```
62
+ The flow `.flo` files are saved to `inputs/{seq_name}/flow`, the flow visualization are saved to `inputs/{seq_name}/flow_vis`. Depth and tracking information are saved during optimization.
63
+
64
+ ## Optimization
65
+
66
+ To optimize the animation, you can run
67
+
68
+ ```
69
+ bash demo.sh
70
+ ```
71
+
72
+ The results are saved to `results/{seq_name}/{save_name}`. Modify `--main_renderer` and `--additional_renderers` to change rendering viewpoints. If animations exhibit jitter or instability, increase the root/joint smoothing weights for better temporal consistency.
73
+
74
+
75
+ ## TODO
76
+
77
+ - [ ] Add multi-view supervisions.
animation/demo.sh ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ python optimization.py --save_path results --iter 200 --input_path inputs --img_size 960 \
2
+ --seq_name 'fish' --save_name 'fish' --coherence_weight 5
3
+
4
+ # python optimization.py --save_path results --iter 200 --input_path inputs --img_size 960 \
5
+ # --seq_name 'crocodile' --save_name 'crocodile_demo' --coherence_weight 15
6
+
7
+
animation/download.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from huggingface_hub import hf_hub_download
2
+
3
+ file_path = hf_hub_download(
4
+ repo_id="facebook/cotracker3",
5
+ filename="scaled_offline.pth",
6
+ local_dir="third_partys/co_tracker/ckpt"
7
+ )
8
+
9
+ file_path = hf_hub_download(
10
+ repo_id="depth-anything/Video-Depth-Anything-Large",
11
+ filename="video_depth_anything_vitl.pth",
12
+ local_dir="third_partys/Video_Depth_Anything/ckpt"
13
+ )
animation/inputs/.DS_Store ADDED
Binary file (6.15 kB). View file
 
animation/inputs/crocodile/first_frames/render_back.png ADDED
animation/inputs/crocodile/first_frames/render_front.png ADDED
animation/inputs/crocodile/first_frames/render_left.png ADDED
animation/inputs/crocodile/first_frames/render_right.png ADDED
animation/inputs/crocodile/input.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1182d9336eaf8946c2099100508f123cf70763af8053889f67fd227ce7c49b9b
3
+ size 2584084
animation/inputs/crocodile/objs/material.mtl ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ newmtl CrocodileMaterial_01
2
+ Ka 1.000000 1.000000 1.000000
3
+ Kd 0.800000 0.800000 0.800000
4
+ Ks 0.000000 0.000000 0.000000
5
+ Ns 10.000000
6
+ illum 2
7
+
animation/inputs/crocodile/objs/mesh.obj ADDED
The diff for this file is too large to render. See raw diff
 
animation/inputs/crocodile/objs/rig.txt ADDED
@@ -0,0 +1,2611 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ joints joint0 -1.96306712 -0.02048700 0.28044931
2
+ joints joint1 -1.57830150 -0.02048700 0.28044931
3
+ joints joint2 -1.27068431 -0.02048700 0.24199716
4
+ joints joint3 -0.96306712 -0.02048700 0.20354502
5
+ joints joint4 -0.50115306 -0.02048700 0.20354502
6
+ joints joint5 -0.23162181 -0.94431512 0.35735361
7
+ joints joint6 -0.23162181 0.86476691 0.35735361
8
+ joints joint7 -0.19316966 -1.13669794 0.35735361
9
+ joints joint8 -0.19316966 1.05666144 0.35735361
10
+ joints joint9 -0.15471752 -0.36692255 0.20354502
11
+ joints joint10 -0.15471752 -0.02048700 0.20354502
12
+ joints joint11 -0.15471752 0.28737433 0.20354502
13
+ joints joint12 -0.03923900 -0.67478387 0.16503183
14
+ joints joint13 -0.03923900 0.63380988 0.16503183
15
+ joints joint14 0.03772633 -0.02048700 0.16503183
16
+ joints joint15 0.38410084 -0.02048700 0.12654917
17
+ joints joint16 0.65363209 -0.02048700 0.16503183
18
+ joints joint17 0.92267506 -0.63620966 0.28044931
19
+ joints joint18 0.96173756 -0.40525262 0.24199716
20
+ joints joint19 0.96173756 -0.13596552 0.20354502
21
+ joints joint20 0.96173756 0.05647833 0.20354502
22
+ joints joint21 0.96173756 0.36427863 0.24199716
23
+ joints joint22 0.96173756 0.59523566 0.28044931
24
+ joints joint23 1.11505788 -0.02048700 0.16503183
25
+ joints joint24 1.11505788 0.74904425 0.35735361
26
+ joints joint25 1.19220631 -0.82859247 0.35735361
27
+ joints joint26 1.34650319 -0.02048700 0.12654917
28
+ joints joint27 1.53888600 -0.02048700 0.08806650
29
+ root joint10
30
+ hier joint10 joint14
31
+ hier joint14 joint15
32
+ hier joint14 joint9
33
+ hier joint10 joint4
34
+ hier joint14 joint11
35
+ hier joint15 joint16
36
+ hier joint9 joint12
37
+ hier joint4 joint3
38
+ hier joint11 joint13
39
+ hier joint16 joint23
40
+ hier joint12 joint5
41
+ hier joint3 joint2
42
+ hier joint13 joint6
43
+ hier joint23 joint26
44
+ hier joint23 joint19
45
+ hier joint23 joint20
46
+ hier joint5 joint7
47
+ hier joint2 joint1
48
+ hier joint6 joint8
49
+ hier joint26 joint27
50
+ hier joint19 joint18
51
+ hier joint20 joint21
52
+ hier joint1 joint0
53
+ hier joint18 joint17
54
+ hier joint21 joint22
55
+ hier joint17 joint25
56
+ hier joint22 joint24
57
+ skin 0 joint26 1.000000
58
+ skin 1 joint26 1.000000
59
+ skin 2 joint26 1.000000
60
+ skin 3 joint26 1.000000
61
+ skin 4 joint26 1.000000
62
+ skin 5 joint26 1.000000
63
+ skin 6 joint26 1.000000
64
+ skin 7 joint26 1.000000
65
+ skin 8 joint26 1.000000
66
+ skin 9 joint26 1.000000
67
+ skin 10 joint26 1.000000
68
+ skin 11 joint26 1.000000
69
+ skin 12 joint26 1.000000
70
+ skin 13 joint26 1.000000
71
+ skin 14 joint26 1.000000
72
+ skin 15 joint26 1.000000
73
+ skin 16 joint26 1.000000
74
+ skin 17 joint26 1.000000
75
+ skin 18 joint26 1.000000
76
+ skin 19 joint26 1.000000
77
+ skin 20 joint26 1.000000
78
+ skin 21 joint26 0.678619 joint27 0.321381
79
+ skin 22 joint26 0.732537 joint27 0.267463
80
+ skin 23 joint26 0.732537 joint27 0.267463
81
+ skin 24 joint26 1.000000
82
+ skin 25 joint26 1.000000
83
+ skin 26 joint26 0.582329 joint27 0.417671
84
+ skin 27 joint26 1.000000
85
+ skin 28 joint26 1.000000
86
+ skin 29 joint26 1.000000
87
+ skin 30 joint26 1.000000
88
+ skin 31 joint26 1.000000
89
+ skin 32 joint26 1.000000
90
+ skin 33 joint26 0.732537 joint27 0.267463
91
+ skin 34 joint26 1.000000
92
+ skin 35 joint26 0.732537 joint27 0.267463
93
+ skin 36 joint27 1.000000
94
+ skin 37 joint26 0.295836 joint27 0.704164
95
+ skin 38 joint26 0.295836 joint27 0.704164
96
+ skin 39 joint26 0.348470 joint27 0.651529
97
+ skin 40 joint26 0.576930 joint27 0.423070
98
+ skin 41 joint26 0.576930 joint27 0.423070
99
+ skin 42 joint26 0.348470 joint27 0.651529
100
+ skin 43 joint27 1.000000
101
+ skin 44 joint26 0.400758 joint27 0.599242
102
+ skin 45 joint27 1.000000
103
+ skin 46 joint27 1.000000
104
+ skin 47 joint27 1.000000
105
+ skin 48 joint27 1.000000
106
+ skin 49 joint27 1.000000
107
+ skin 50 joint27 1.000000
108
+ skin 51 joint27 1.000000
109
+ skin 52 joint27 1.000000
110
+ skin 53 joint26 0.336109 joint27 0.663891
111
+ skin 54 joint27 1.000000
112
+ skin 55 joint27 1.000000
113
+ skin 56 joint27 1.000000
114
+ skin 57 joint27 1.000000
115
+ skin 58 joint27 1.000000
116
+ skin 59 joint27 1.000000
117
+ skin 60 joint26 0.337740 joint27 0.662260
118
+ skin 61 joint27 1.000000
119
+ skin 62 joint26 0.268269 joint27 0.731731
120
+ skin 63 joint27 1.000000
121
+ skin 64 joint27 1.000000
122
+ skin 65 joint27 1.000000
123
+ skin 66 joint27 1.000000
124
+ skin 67 joint27 1.000000
125
+ skin 68 joint27 1.000000
126
+ skin 69 joint27 1.000000
127
+ skin 70 joint27 1.000000
128
+ skin 71 joint26 0.272801 joint27 0.727199
129
+ skin 72 joint27 1.000000
130
+ skin 73 joint27 1.000000
131
+ skin 74 joint27 1.000000
132
+ skin 75 joint27 1.000000
133
+ skin 76 joint27 1.000000
134
+ skin 77 joint27 1.000000
135
+ skin 78 joint27 1.000000
136
+ skin 79 joint27 1.000000
137
+ skin 80 joint27 1.000000
138
+ skin 81 joint26 1.000000
139
+ skin 82 joint26 1.000000
140
+ skin 83 joint26 1.000000
141
+ skin 84 joint26 1.000000
142
+ skin 85 joint26 1.000000
143
+ skin 86 joint26 1.000000
144
+ skin 87 joint26 0.720251 joint27 0.279749
145
+ skin 88 joint26 0.720251 joint27 0.279749
146
+ skin 89 joint26 1.000000
147
+ skin 90 joint26 1.000000
148
+ skin 91 joint26 1.000000
149
+ skin 92 joint26 1.000000
150
+ skin 93 joint26 1.000000
151
+ skin 94 joint26 1.000000
152
+ skin 95 joint26 1.000000
153
+ skin 96 joint26 1.000000
154
+ skin 97 joint26 1.000000
155
+ skin 98 joint26 1.000000
156
+ skin 99 joint26 1.000000
157
+ skin 100 joint26 1.000000
158
+ skin 101 joint26 0.720251 joint27 0.279749
159
+ skin 102 joint26 0.720251 joint27 0.279749
160
+ skin 103 joint26 0.720251 joint27 0.279749
161
+ skin 104 joint26 0.720251 joint27 0.279749
162
+ skin 105 joint26 1.000000
163
+ skin 106 joint26 0.720251 joint27 0.279749
164
+ skin 107 joint26 0.720251 joint27 0.279749
165
+ skin 108 joint26 0.693260 joint27 0.306740
166
+ skin 109 joint26 0.701043 joint27 0.298957
167
+ skin 110 joint26 1.000000
168
+ skin 111 joint26 1.000000
169
+ skin 112 joint26 1.000000
170
+ skin 113 joint26 1.000000
171
+ skin 114 joint26 1.000000
172
+ skin 115 joint26 0.325966 joint27 0.674034
173
+ skin 116 joint26 0.311307 joint27 0.688693
174
+ skin 117 joint26 0.311307 joint27 0.688693
175
+ skin 118 joint26 0.372629 joint27 0.627371
176
+ skin 119 joint26 0.424944 joint27 0.575056
177
+ skin 120 joint26 0.343554 joint27 0.656446
178
+ skin 121 joint26 0.372629 joint27 0.627371
179
+ skin 122 joint26 0.372629 joint27 0.627371
180
+ skin 123 joint26 0.279008 joint27 0.720992
181
+ skin 124 joint26 0.456522 joint27 0.543478
182
+ skin 125 joint27 1.000000
183
+ skin 126 joint26 0.304618 joint27 0.695382
184
+ skin 127 joint26 0.304618 joint27 0.695382
185
+ skin 128 joint27 1.000000
186
+ skin 129 joint26 0.304618 joint27 0.695382
187
+ skin 130 joint27 1.000000
188
+ skin 131 joint26 0.279008 joint27 0.720992
189
+ skin 132 joint26 0.279008 joint27 0.720992
190
+ skin 133 joint26 0.262288 joint27 0.737712
191
+ skin 134 joint26 0.344660 joint27 0.655340
192
+ skin 135 joint27 1.000000
193
+ skin 136 joint27 1.000000
194
+ skin 137 joint27 1.000000
195
+ skin 138 joint27 1.000000
196
+ skin 139 joint26 0.582810 joint27 0.417190
197
+ skin 140 joint27 1.000000
198
+ skin 141 joint27 1.000000
199
+ skin 142 joint27 1.000000
200
+ skin 143 joint27 1.000000
201
+ skin 144 joint27 1.000000
202
+ skin 145 joint27 1.000000
203
+ skin 146 joint27 1.000000
204
+ skin 147 joint27 1.000000
205
+ skin 148 joint27 1.000000
206
+ skin 149 joint27 1.000000
207
+ skin 150 joint26 1.000000
208
+ skin 151 joint26 1.000000
209
+ skin 152 joint26 1.000000
210
+ skin 153 joint26 1.000000
211
+ skin 154 joint26 1.000000
212
+ skin 155 joint26 1.000000
213
+ skin 156 joint26 1.000000
214
+ skin 157 joint26 1.000000
215
+ skin 158 joint26 1.000000
216
+ skin 159 joint26 1.000000
217
+ skin 160 joint26 1.000000
218
+ skin 161 joint26 1.000000
219
+ skin 162 joint26 1.000000
220
+ skin 163 joint26 1.000000
221
+ skin 164 joint26 1.000000
222
+ skin 165 joint26 1.000000
223
+ skin 166 joint26 1.000000
224
+ skin 167 joint26 1.000000
225
+ skin 168 joint26 1.000000
226
+ skin 169 joint26 1.000000
227
+ skin 170 joint26 1.000000
228
+ skin 171 joint26 1.000000
229
+ skin 172 joint26 1.000000
230
+ skin 173 joint26 1.000000
231
+ skin 174 joint26 1.000000
232
+ skin 175 joint26 1.000000
233
+ skin 176 joint26 1.000000
234
+ skin 177 joint26 1.000000
235
+ skin 178 joint26 1.000000
236
+ skin 179 joint26 1.000000
237
+ skin 180 joint26 1.000000
238
+ skin 181 joint26 1.000000
239
+ skin 182 joint26 1.000000
240
+ skin 183 joint26 1.000000
241
+ skin 184 joint26 1.000000
242
+ skin 185 joint26 1.000000
243
+ skin 186 joint26 0.489875 joint27 0.510125
244
+ skin 187 joint26 0.411208 joint27 0.588792
245
+ skin 188 joint26 0.411208 joint27 0.588792
246
+ skin 189 joint26 0.578085 joint27 0.421915
247
+ skin 190 joint26 0.578085 joint27 0.421915
248
+ skin 191 joint26 0.587299 joint27 0.412701
249
+ skin 192 joint26 0.573509 joint27 0.426491
250
+ skin 193 joint26 0.503474 joint27 0.496526
251
+ skin 194 joint26 0.574292 joint27 0.425708
252
+ skin 195 joint26 0.445675 joint27 0.554325
253
+ skin 196 joint26 0.503474 joint27 0.496526
254
+ skin 197 joint26 0.503474 joint27 0.496526
255
+ skin 198 joint26 0.531465 joint27 0.468535
256
+ skin 199 joint26 0.531465 joint27 0.468535
257
+ skin 200 joint26 0.467883 joint27 0.532117
258
+ skin 201 joint26 0.467883 joint27 0.532117
259
+ skin 202 joint26 0.341676 joint27 0.658324
260
+ skin 203 joint26 0.542645 joint27 0.457355
261
+ skin 204 joint26 0.351702 joint27 0.648298
262
+ skin 205 joint26 0.345570 joint27 0.654430
263
+ skin 206 joint26 0.345570 joint27 0.654430
264
+ skin 207 joint26 0.368600 joint27 0.631400
265
+ skin 208 joint26 0.368600 joint27 0.631400
266
+ skin 209 joint26 0.332608 joint27 0.667392
267
+ skin 210 joint26 0.345570 joint27 0.654430
268
+ skin 211 joint26 0.331877 joint27 0.668123
269
+ skin 212 joint26 0.366395 joint27 0.633606
270
+ skin 213 joint26 0.336817 joint27 0.663183
271
+ skin 214 joint26 0.345570 joint27 0.654430
272
+ skin 215 joint26 0.345570 joint27 0.654430
273
+ skin 216 joint26 0.332608 joint27 0.667392
274
+ skin 217 joint26 0.332608 joint27 0.667392
275
+ skin 218 joint26 0.308315 joint27 0.691685
276
+ skin 219 joint26 0.297316 joint27 0.702684
277
+ skin 220 joint26 0.283284 joint27 0.716716
278
+ skin 221 joint26 0.354659 joint27 0.645341
279
+ skin 222 joint27 1.000000
280
+ skin 223 joint27 1.000000
281
+ skin 224 joint27 1.000000
282
+ skin 225 joint27 1.000000
283
+ skin 226 joint27 1.000000
284
+ skin 227 joint27 1.000000
285
+ skin 228 joint27 1.000000
286
+ skin 229 joint27 1.000000
287
+ skin 230 joint26 0.262899 joint27 0.737101
288
+ skin 231 joint26 1.000000
289
+ skin 232 joint26 1.000000
290
+ skin 233 joint26 1.000000
291
+ skin 234 joint26 1.000000
292
+ skin 235 joint26 1.000000
293
+ skin 236 joint26 1.000000
294
+ skin 237 joint26 1.000000
295
+ skin 238 joint26 1.000000
296
+ skin 239 joint26 1.000000
297
+ skin 240 joint26 1.000000
298
+ skin 241 joint26 1.000000
299
+ skin 242 joint26 1.000000
300
+ skin 243 joint26 1.000000
301
+ skin 244 joint26 1.000000
302
+ skin 245 joint26 1.000000
303
+ skin 246 joint26 1.000000
304
+ skin 247 joint26 1.000000
305
+ skin 248 joint26 1.000000
306
+ skin 249 joint26 1.000000
307
+ skin 250 joint26 1.000000
308
+ skin 251 joint26 1.000000
309
+ skin 252 joint26 1.000000
310
+ skin 253 joint26 1.000000
311
+ skin 254 joint26 1.000000
312
+ skin 255 joint26 1.000000
313
+ skin 256 joint26 1.000000
314
+ skin 257 joint26 1.000000
315
+ skin 258 joint26 1.000000
316
+ skin 259 joint26 1.000000
317
+ skin 260 joint26 1.000000
318
+ skin 261 joint26 1.000000
319
+ skin 262 joint26 1.000000
320
+ skin 263 joint26 1.000000
321
+ skin 264 joint26 1.000000
322
+ skin 265 joint26 0.594304 joint27 0.405696
323
+ skin 266 joint26 0.594304 joint27 0.405696
324
+ skin 267 joint26 0.594304 joint27 0.405696
325
+ skin 268 joint26 0.594304 joint27 0.405696
326
+ skin 269 joint26 0.531309 joint27 0.468691
327
+ skin 270 joint26 0.525044 joint27 0.474956
328
+ skin 271 joint26 0.509758 joint27 0.490242
329
+ skin 272 joint26 0.509758 joint27 0.490242
330
+ skin 273 joint26 0.534833 joint27 0.465167
331
+ skin 274 joint26 0.525044 joint27 0.474956
332
+ skin 275 joint26 0.449106 joint27 0.550894
333
+ skin 276 joint26 0.482263 joint27 0.517737
334
+ skin 277 joint26 0.482263 joint27 0.517737
335
+ skin 278 joint26 0.534833 joint27 0.465167
336
+ skin 279 joint26 0.414742 joint27 0.585258
337
+ skin 280 joint26 0.445887 joint27 0.554113
338
+ skin 281 joint26 0.445887 joint27 0.554113
339
+ skin 282 joint26 0.445887 joint27 0.554113
340
+ skin 283 joint26 0.484993 joint27 0.515007
341
+ skin 284 joint26 0.445887 joint27 0.554113
342
+ skin 285 joint26 0.542412 joint27 0.457588
343
+ skin 286 joint26 0.445887 joint27 0.554113
344
+ skin 287 joint26 0.445887 joint27 0.554113
345
+ skin 288 joint26 0.473694 joint27 0.526306
346
+ skin 289 joint26 0.411521 joint27 0.588479
347
+ skin 290 joint26 0.271567 joint27 0.728433
348
+ skin 291 joint26 0.271567 joint27 0.728433
349
+ skin 292 joint26 0.271567 joint27 0.728433
350
+ skin 293 joint26 0.430535 joint27 0.569465
351
+ skin 294 joint26 0.310750 joint27 0.689250
352
+ skin 295 joint26 0.368600 joint27 0.631400
353
+ skin 296 joint26 0.310750 joint27 0.689250
354
+ skin 297 joint26 0.310750 joint27 0.689250
355
+ skin 298 joint26 0.409007 joint27 0.590993
356
+ skin 299 joint26 0.345570 joint27 0.654430
357
+ skin 300 joint18 0.269472 joint19 0.730528
358
+ skin 301 joint18 0.555810 joint19 0.444190
359
+ skin 302 joint18 1.000000
360
+ skin 303 joint17 0.513502 joint18 0.486498
361
+ skin 304 joint17 1.000000
362
+ skin 305 joint17 1.000000
363
+ skin 306 joint17 1.000000
364
+ skin 307 joint19 1.000000
365
+ skin 308 joint19 1.000000
366
+ skin 309 joint19 1.000000
367
+ skin 310 joint18 0.352881 joint19 0.647119
368
+ skin 311 joint18 0.352881 joint19 0.647119
369
+ skin 312 joint18 0.355847 joint19 0.644153
370
+ skin 313 joint18 0.279127 joint19 0.720873
371
+ skin 314 joint19 1.000000
372
+ skin 315 joint18 0.260053 joint19 0.739947
373
+ skin 316 joint18 0.415982 joint19 0.584017
374
+ skin 317 joint18 0.732795 joint19 0.267205
375
+ skin 318 joint18 0.670333 joint19 0.329667
376
+ skin 319 joint18 0.739074 joint19 0.260926
377
+ skin 320 joint18 1.000000
378
+ skin 321 joint18 1.000000
379
+ skin 322 joint18 0.391671 joint19 0.608329
380
+ skin 323 joint18 0.391671 joint19 0.608329
381
+ skin 324 joint18 0.371018 joint19 0.628982
382
+ skin 325 joint18 0.378906 joint19 0.621094
383
+ skin 326 joint18 0.350501 joint19 0.649499
384
+ skin 327 joint17 0.333589 joint18 0.666411
385
+ skin 328 joint17 0.498117 joint18 0.501883
386
+ skin 329 joint17 0.400443 joint18 0.599557
387
+ skin 330 joint17 0.286092 joint18 0.713908
388
+ skin 331 joint17 0.286092 joint18 0.713908
389
+ skin 332 joint17 0.363211 joint18 0.636789
390
+ skin 333 joint17 0.416999 joint18 0.583001
391
+ skin 334 joint17 0.497181 joint18 0.502819
392
+ skin 335 joint17 0.332193 joint18 0.667807
393
+ skin 336 joint17 0.357914 joint18 0.642087
394
+ skin 337 joint17 0.452717 joint18 0.547283
395
+ skin 338 joint17 0.522320 joint18 0.477680
396
+ skin 339 joint17 0.563483 joint18 0.436517
397
+ skin 340 joint17 0.597026 joint18 0.402974
398
+ skin 341 joint17 0.553236 joint18 0.446764
399
+ skin 342 joint17 0.400443 joint18 0.599557
400
+ skin 343 joint17 0.400443 joint18 0.599557
401
+ skin 344 joint17 0.326355 joint18 0.673645
402
+ skin 345 joint17 0.326355 joint18 0.673645
403
+ skin 346 joint17 0.549771 joint18 0.450229
404
+ skin 347 joint17 1.000000
405
+ skin 348 joint17 1.000000
406
+ skin 349 joint17 1.000000
407
+ skin 350 joint17 1.000000
408
+ skin 351 joint17 1.000000
409
+ skin 352 joint17 0.693710 joint25 0.306290
410
+ skin 353 joint17 0.684301 joint25 0.315699
411
+ skin 354 joint17 1.000000
412
+ skin 355 joint17 1.000000
413
+ skin 356 joint17 1.000000
414
+ skin 357 joint17 1.000000
415
+ skin 358 joint17 1.000000
416
+ skin 359 joint17 1.000000
417
+ skin 360 joint17 1.000000
418
+ skin 361 joint17 1.000000
419
+ skin 362 joint17 1.000000
420
+ skin 363 joint17 1.000000
421
+ skin 364 joint17 1.000000
422
+ skin 365 joint17 1.000000
423
+ skin 366 joint17 1.000000
424
+ skin 367 joint17 1.000000
425
+ skin 368 joint17 1.000000
426
+ skin 369 joint17 1.000000
427
+ skin 370 joint17 1.000000
428
+ skin 371 joint17 1.000000
429
+ skin 372 joint17 1.000000
430
+ skin 373 joint17 1.000000
431
+ skin 374 joint17 1.000000
432
+ skin 375 joint17 1.000000
433
+ skin 376 joint17 1.000000
434
+ skin 377 joint17 1.000000
435
+ skin 378 joint17 1.000000
436
+ skin 379 joint9 0.440279 joint10 0.559721
437
+ skin 380 joint9 1.000000
438
+ skin 381 joint9 0.517533 joint12 0.482467
439
+ skin 382 joint12 1.000000
440
+ skin 383 joint12 1.000000
441
+ skin 384 joint9 0.298066 joint10 0.701934
442
+ skin 385 joint9 0.264982 joint10 0.735018
443
+ skin 386 joint9 0.301859 joint10 0.698141
444
+ skin 387 joint10 1.000000
445
+ skin 388 joint10 1.000000
446
+ skin 389 joint10 1.000000
447
+ skin 390 joint10 0.397837 joint14 0.602163
448
+ skin 391 joint9 0.374989 joint10 0.334186 joint14 0.290825
449
+ skin 392 joint9 0.315654 joint10 0.292293 joint14 0.392053
450
+ skin 393 joint9 0.211980 joint10 0.361454 joint14 0.426566
451
+ skin 394 joint9 1.000000
452
+ skin 395 joint9 0.721949 joint10 0.278051
453
+ skin 396 joint9 0.601174 joint10 0.398826
454
+ skin 397 joint9 0.687042 joint10 0.312958
455
+ skin 398 joint9 1.000000
456
+ skin 399 joint9 1.000000
457
+ skin 400 joint9 1.000000
458
+ skin 401 joint9 1.000000
459
+ skin 402 joint9 1.000000
460
+ skin 403 joint9 1.000000
461
+ skin 404 joint9 0.303862 joint12 0.696138
462
+ skin 405 joint9 0.482283 joint12 0.517717
463
+ skin 406 joint9 0.396220 joint12 0.603780
464
+ skin 407 joint9 0.609293 joint12 0.390707
465
+ skin 408 joint9 0.601014 joint12 0.398986
466
+ skin 409 joint9 0.601014 joint12 0.398986
467
+ skin 410 joint9 0.735163 joint12 0.264837
468
+ skin 411 joint9 0.723111 joint12 0.276889
469
+ skin 412 joint9 0.590930 joint12 0.409070
470
+ skin 413 joint9 0.682097 joint12 0.317903
471
+ skin 414 joint12 1.000000
472
+ skin 415 joint12 1.000000
473
+ skin 416 joint12 1.000000
474
+ skin 417 joint12 1.000000
475
+ skin 418 joint12 1.000000
476
+ skin 419 joint12 1.000000
477
+ skin 420 joint12 1.000000
478
+ skin 421 joint12 1.000000
479
+ skin 422 joint12 1.000000
480
+ skin 423 joint5 0.307426 joint12 0.692574
481
+ skin 424 joint5 0.307426 joint12 0.692574
482
+ skin 425 joint5 0.307426 joint12 0.692574
483
+ skin 426 joint12 1.000000
484
+ skin 427 joint12 1.000000
485
+ skin 428 joint12 1.000000
486
+ skin 429 joint12 1.000000
487
+ skin 430 joint12 1.000000
488
+ skin 431 joint12 1.000000
489
+ skin 432 joint12 1.000000
490
+ skin 433 joint12 1.000000
491
+ skin 434 joint12 1.000000
492
+ skin 435 joint0 1.000000
493
+ skin 436 joint0 1.000000
494
+ skin 437 joint0 1.000000
495
+ skin 438 joint1 1.000000
496
+ skin 439 joint1 1.000000
497
+ skin 440 joint0 0.297003 joint1 0.702997
498
+ skin 441 joint0 0.277447 joint1 0.722553
499
+ skin 442 joint1 1.000000
500
+ skin 443 joint1 1.000000
501
+ skin 444 joint4 0.440502 joint10 0.559498
502
+ skin 445 joint4 0.390025 joint10 0.609975
503
+ skin 446 joint4 0.390025 joint10 0.609975
504
+ skin 447 joint4 0.510094 joint10 0.489906
505
+ skin 448 joint4 0.488432 joint10 0.511568
506
+ skin 449 joint1 1.000000
507
+ skin 450 joint26 1.000000
508
+ skin 451 joint26 1.000000
509
+ skin 452 joint4 0.464918 joint10 0.535082
510
+ skin 453 joint4 0.464918 joint10 0.535082
511
+ skin 454 joint4 0.589574 joint10 0.410426
512
+ skin 455 joint4 0.628627 joint10 0.371373
513
+ skin 456 joint4 0.705784 joint10 0.294216
514
+ skin 457 joint4 0.619327 joint10 0.380673
515
+ skin 458 joint4 0.536165 joint10 0.463835
516
+ skin 459 joint2 0.333443 joint3 0.666557
517
+ skin 460 joint2 0.333443 joint3 0.666557
518
+ skin 461 joint2 0.318178 joint3 0.681822
519
+ skin 462 joint2 0.337092 joint3 0.662908
520
+ skin 463 joint2 0.323962 joint3 0.676038
521
+ skin 464 joint4 0.534786 joint10 0.465214
522
+ skin 465 joint4 0.534786 joint10 0.465214
523
+ skin 466 joint2 0.351588 joint3 0.648412
524
+ skin 467 joint2 0.351487 joint3 0.648513
525
+ skin 468 joint3 0.473782 joint4 0.526218
526
+ skin 469 joint3 0.495252 joint4 0.504748
527
+ skin 470 joint3 0.485438 joint4 0.514562
528
+ skin 471 joint3 0.472223 joint4 0.527777
529
+ skin 472 joint3 0.425934 joint4 0.574066
530
+ skin 473 joint3 0.425934 joint4 0.574066
531
+ skin 474 joint17 0.299402 joint25 0.700598
532
+ skin 475 joint25 1.000000
533
+ skin 476 joint25 1.000000
534
+ skin 477 joint25 1.000000
535
+ skin 478 joint25 1.000000
536
+ skin 479 joint17 0.263391 joint25 0.736608
537
+ skin 480 joint17 0.374888 joint25 0.625112
538
+ skin 481 joint17 0.374888 joint25 0.625112
539
+ skin 482 joint17 0.299402 joint25 0.700598
540
+ skin 483 joint25 1.000000
541
+ skin 484 joint25 1.000000
542
+ skin 485 joint25 1.000000
543
+ skin 486 joint25 1.000000
544
+ skin 487 joint25 1.000000
545
+ skin 488 joint25 1.000000
546
+ skin 489 joint25 1.000000
547
+ skin 490 joint1 1.000000
548
+ skin 491 joint3 0.409989 joint4 0.590011
549
+ skin 492 joint3 0.537938 joint4 0.462062
550
+ skin 493 joint4 0.581214 joint10 0.418786
551
+ skin 494 joint4 0.581214 joint10 0.418786
552
+ skin 495 joint3 0.716090 joint4 0.283910
553
+ skin 496 joint3 0.500416 joint4 0.499584
554
+ skin 497 joint3 0.669242 joint4 0.330758
555
+ skin 498 joint4 0.311445 joint10 0.688555
556
+ skin 499 joint4 0.311445 joint10 0.688555
557
+ skin 500 joint10 1.000000
558
+ skin 501 joint10 1.000000
559
+ skin 502 joint25 1.000000
560
+ skin 503 joint25 1.000000
561
+ skin 504 joint25 1.000000
562
+ skin 505 joint25 1.000000
563
+ skin 506 joint25 1.000000
564
+ skin 507 joint25 1.000000
565
+ skin 508 joint25 1.000000
566
+ skin 509 joint25 1.000000
567
+ skin 510 joint25 1.000000
568
+ skin 511 joint25 1.000000
569
+ skin 512 joint25 1.000000
570
+ skin 513 joint25 1.000000
571
+ skin 514 joint26 1.000000
572
+ skin 515 joint26 1.000000
573
+ skin 516 joint26 1.000000
574
+ skin 517 joint26 1.000000
575
+ skin 518 joint25 1.000000
576
+ skin 519 joint25 1.000000
577
+ skin 520 joint25 1.000000
578
+ skin 521 joint25 1.000000
579
+ skin 522 joint25 1.000000
580
+ skin 523 joint25 1.000000
581
+ skin 524 joint25 1.000000
582
+ skin 525 joint25 1.000000
583
+ skin 526 joint25 1.000000
584
+ skin 527 joint25 1.000000
585
+ skin 528 joint3 0.723415 joint4 0.276585
586
+ skin 529 joint3 0.723415 joint4 0.276585
587
+ skin 530 joint0 0.609521 joint1 0.390479
588
+ skin 531 joint0 0.609521 joint1 0.390479
589
+ skin 532 joint0 0.555045 joint1 0.444955
590
+ skin 533 joint0 0.568517 joint1 0.431483
591
+ skin 534 joint0 0.593470 joint1 0.406530
592
+ skin 535 joint25 1.000000
593
+ skin 536 joint25 1.000000
594
+ skin 537 joint25 1.000000
595
+ skin 538 joint25 1.000000
596
+ skin 539 joint25 1.000000
597
+ skin 540 joint25 1.000000
598
+ skin 541 joint25 1.000000
599
+ skin 542 joint25 1.000000
600
+ skin 543 joint25 1.000000
601
+ skin 544 joint25 1.000000
602
+ skin 545 joint0 0.570535 joint1 0.429465
603
+ skin 546 joint21 1.000000
604
+ skin 547 joint0 0.580870 joint1 0.419130
605
+ skin 548 joint3 0.633598 joint4 0.366402
606
+ skin 549 joint3 0.732891 joint4 0.267109
607
+ skin 550 joint3 0.686401 joint4 0.313599
608
+ skin 551 joint25 1.000000
609
+ skin 552 joint25 1.000000
610
+ skin 553 joint25 1.000000
611
+ skin 554 joint25 1.000000
612
+ skin 555 joint25 1.000000
613
+ skin 556 joint25 1.000000
614
+ skin 557 joint25 1.000000
615
+ skin 558 joint25 1.000000
616
+ skin 559 joint1 0.705184 joint2 0.294816
617
+ skin 560 joint1 0.705184 joint2 0.294816
618
+ skin 561 joint1 0.603850 joint2 0.396150
619
+ skin 562 joint1 0.588783 joint2 0.411217
620
+ skin 563 joint1 0.588783 joint2 0.411217
621
+ skin 564 joint1 0.418489 joint2 0.581511
622
+ skin 565 joint1 0.418489 joint2 0.581511
623
+ skin 566 joint1 0.480196 joint2 0.519803
624
+ skin 567 joint3 0.709727 joint4 0.290273
625
+ skin 568 joint3 0.684361 joint4 0.315639
626
+ skin 569 joint25 1.000000
627
+ skin 570 joint25 1.000000
628
+ skin 571 joint25 1.000000
629
+ skin 572 joint25 1.000000
630
+ skin 573 joint25 1.000000
631
+ skin 574 joint25 1.000000
632
+ skin 575 joint25 1.000000
633
+ skin 576 joint25 1.000000
634
+ skin 577 joint25 1.000000
635
+ skin 578 joint25 1.000000
636
+ skin 579 joint25 1.000000
637
+ skin 580 joint25 1.000000
638
+ skin 581 joint25 1.000000
639
+ skin 582 joint25 1.000000
640
+ skin 583 joint25 1.000000
641
+ skin 584 joint25 1.000000
642
+ skin 585 joint25 1.000000
643
+ skin 586 joint25 1.000000
644
+ skin 587 joint25 1.000000
645
+ skin 588 joint17 0.278771 joint25 0.721229
646
+ skin 589 joint25 1.000000
647
+ skin 590 joint25 1.000000
648
+ skin 591 joint25 1.000000
649
+ skin 592 joint25 1.000000
650
+ skin 593 joint25 1.000000
651
+ skin 594 joint25 1.000000
652
+ skin 595 joint25 1.000000
653
+ skin 596 joint25 1.000000
654
+ skin 597 joint25 1.000000
655
+ skin 598 joint25 1.000000
656
+ skin 599 joint25 1.000000
657
+ skin 600 joint25 1.000000
658
+ skin 601 joint25 1.000000
659
+ skin 602 joint25 1.000000
660
+ skin 603 joint25 1.000000
661
+ skin 604 joint25 1.000000
662
+ skin 605 joint25 1.000000
663
+ skin 606 joint25 1.000000
664
+ skin 607 joint25 1.000000
665
+ skin 608 joint25 1.000000
666
+ skin 609 joint25 1.000000
667
+ skin 610 joint25 1.000000
668
+ skin 611 joint25 1.000000
669
+ skin 612 joint25 1.000000
670
+ skin 613 joint25 1.000000
671
+ skin 614 joint25 1.000000
672
+ skin 615 joint25 1.000000
673
+ skin 616 joint25 1.000000
674
+ skin 617 joint1 1.000000
675
+ skin 618 joint1 1.000000
676
+ skin 619 joint1 1.000000
677
+ skin 620 joint25 1.000000
678
+ skin 621 joint1 1.000000
679
+ skin 622 joint1 0.710586 joint2 0.289414
680
+ skin 623 joint1 0.710586 joint2 0.289414
681
+ skin 624 joint25 1.000000
682
+ skin 625 joint25 1.000000
683
+ skin 626 joint25 1.000000
684
+ skin 627 joint25 1.000000
685
+ skin 628 joint25 1.000000
686
+ skin 629 joint25 1.000000
687
+ skin 630 joint25 1.000000
688
+ skin 631 joint25 1.000000
689
+ skin 632 joint25 1.000000
690
+ skin 633 joint25 1.000000
691
+ skin 634 joint25 1.000000
692
+ skin 635 joint25 1.000000
693
+ skin 636 joint25 1.000000
694
+ skin 637 joint25 1.000000
695
+ skin 638 joint25 1.000000
696
+ skin 639 joint25 1.000000
697
+ skin 640 joint25 1.000000
698
+ skin 641 joint25 1.000000
699
+ skin 642 joint25 1.000000
700
+ skin 643 joint25 1.000000
701
+ skin 644 joint25 1.000000
702
+ skin 645 joint25 1.000000
703
+ skin 646 joint25 1.000000
704
+ skin 647 joint25 1.000000
705
+ skin 648 joint25 1.000000
706
+ skin 649 joint25 1.000000
707
+ skin 650 joint25 1.000000
708
+ skin 651 joint25 1.000000
709
+ skin 652 joint25 1.000000
710
+ skin 653 joint17 0.392708 joint25 0.607292
711
+ skin 654 joint17 0.424533 joint25 0.575467
712
+ skin 655 joint17 0.597730 joint25 0.402270
713
+ skin 656 joint17 0.597730 joint25 0.402270
714
+ skin 657 joint25 1.000000
715
+ skin 658 joint25 1.000000
716
+ skin 659 joint17 0.456085 joint25 0.543915
717
+ skin 660 joint17 0.572553 joint25 0.427447
718
+ skin 661 joint17 0.572553 joint25 0.427447
719
+ skin 662 joint17 0.342221 joint25 0.657779
720
+ skin 663 joint17 0.342221 joint25 0.657779
721
+ skin 664 joint25 1.000000
722
+ skin 665 joint17 0.394259 joint25 0.605741
723
+ skin 666 joint17 0.325430 joint25 0.674570
724
+ skin 667 joint25 1.000000
725
+ skin 668 joint17 0.278771 joint25 0.721229
726
+ skin 669 joint17 0.519864 joint25 0.480136
727
+ skin 670 joint25 1.000000
728
+ skin 671 joint17 0.506601 joint25 0.493399
729
+ skin 672 joint25 1.000000
730
+ skin 673 joint17 0.506601 joint25 0.493399
731
+ skin 674 joint17 0.375782 joint25 0.624218
732
+ skin 675 joint17 0.375782 joint25 0.624218
733
+ skin 676 joint25 1.000000
734
+ skin 677 joint17 0.642754 joint25 0.357246
735
+ skin 678 joint25 1.000000
736
+ skin 679 joint17 0.597730 joint25 0.402270
737
+ skin 680 joint25 1.000000
738
+ skin 681 joint17 0.636121 joint25 0.363879
739
+ skin 682 joint17 1.000000
740
+ skin 683 joint17 1.000000
741
+ skin 684 joint17 1.000000
742
+ skin 685 joint17 1.000000
743
+ skin 686 joint12 1.000000
744
+ skin 687 joint9 0.268850 joint12 0.731150
745
+ skin 688 joint9 0.422721 joint12 0.577279
746
+ skin 689 joint12 1.000000
747
+ skin 690 joint12 1.000000
748
+ skin 691 joint12 1.000000
749
+ skin 692 joint12 1.000000
750
+ skin 693 joint12 1.000000
751
+ skin 694 joint12 1.000000
752
+ skin 695 joint12 1.000000
753
+ skin 696 joint12 1.000000
754
+ skin 697 joint1 0.334934 joint2 0.665066
755
+ skin 698 joint1 0.334934 joint2 0.665066
756
+ skin 699 joint2 0.681271 joint3 0.318729
757
+ skin 700 joint2 0.681271 joint3 0.318729
758
+ skin 701 joint3 1.000000
759
+ skin 702 joint3 1.000000
760
+ skin 703 joint4 1.000000
761
+ skin 704 joint4 1.000000
762
+ skin 705 joint1 0.729320 joint2 0.270680
763
+ skin 706 joint4 0.729840 joint10 0.270160
764
+ skin 707 joint2 0.460008 joint3 0.539992
765
+ skin 708 joint3 1.000000
766
+ skin 709 joint4 1.000000
767
+ skin 710 joint17 0.719622 joint18 0.280378
768
+ skin 711 joint17 0.662864 joint18 0.337136
769
+ skin 712 joint17 0.648905 joint18 0.351095
770
+ skin 713 joint17 0.720065 joint18 0.279935
771
+ skin 714 joint17 0.633861 joint18 0.366139
772
+ skin 715 joint17 0.633861 joint18 0.366139
773
+ skin 716 joint17 0.633861 joint18 0.366139
774
+ skin 717 joint17 1.000000
775
+ skin 718 joint17 0.670709 joint18 0.329291
776
+ skin 719 joint17 0.630847 joint18 0.369153
777
+ skin 720 joint17 0.620671 joint18 0.379329
778
+ skin 721 joint5 0.623584 joint12 0.376416
779
+ skin 722 joint5 0.623584 joint12 0.376416
780
+ skin 723 joint12 1.000000
781
+ skin 724 joint5 1.000000
782
+ skin 725 joint5 1.000000
783
+ skin 726 joint5 1.000000
784
+ skin 727 joint7 1.000000
785
+ skin 728 joint7 1.000000
786
+ skin 729 joint7 1.000000
787
+ skin 730 joint5 0.262705 joint7 0.737294
788
+ skin 731 joint5 0.262705 joint7 0.737294
789
+ skin 732 joint5 1.000000
790
+ skin 733 joint5 0.297091 joint12 0.702909
791
+ skin 734 joint5 0.387318 joint12 0.612682
792
+ skin 735 joint5 1.000000
793
+ skin 736 joint5 1.000000
794
+ skin 737 joint7 1.000000
795
+ skin 738 joint7 1.000000
796
+ skin 739 joint5 1.000000
797
+ skin 740 joint5 0.283392 joint7 0.716608
798
+ skin 741 joint5 0.624895 joint12 0.375105
799
+ skin 742 joint5 0.567655 joint7 0.432345
800
+ skin 743 joint5 0.567655 joint7 0.432345
801
+ skin 744 joint5 0.502404 joint12 0.497596
802
+ skin 745 joint5 1.000000
803
+ skin 746 joint5 1.000000
804
+ skin 747 joint5 0.283392 joint7 0.716608
805
+ skin 748 joint5 0.262705 joint7 0.737294
806
+ skin 749 joint5 0.262705 joint7 0.737294
807
+ skin 750 joint5 0.542123 joint12 0.457877
808
+ skin 751 joint5 1.000000
809
+ skin 752 joint5 1.000000
810
+ skin 753 joint5 1.000000
811
+ skin 754 joint5 1.000000
812
+ skin 755 joint5 1.000000
813
+ skin 756 joint5 1.000000
814
+ skin 757 joint5 1.000000
815
+ skin 758 joint5 1.000000
816
+ skin 759 joint5 1.000000
817
+ skin 760 joint5 0.426703 joint12 0.573297
818
+ skin 761 joint5 0.426703 joint12 0.573297
819
+ skin 762 joint5 0.572436 joint12 0.427564
820
+ skin 763 joint5 1.000000
821
+ skin 764 joint5 1.000000
822
+ skin 765 joint5 0.622857 joint7 0.377144
823
+ skin 766 joint5 0.622857 joint7 0.377144
824
+ skin 767 joint5 0.542123 joint12 0.457877
825
+ skin 768 joint5 0.432672 joint7 0.567328
826
+ skin 769 joint5 0.327598 joint7 0.672402
827
+ skin 770 joint5 0.327598 joint7 0.672402
828
+ skin 771 joint5 0.327120 joint7 0.672879
829
+ skin 772 joint5 1.000000
830
+ skin 773 joint5 1.000000
831
+ skin 774 joint5 1.000000
832
+ skin 775 joint5 1.000000
833
+ skin 776 joint5 1.000000
834
+ skin 777 joint5 1.000000
835
+ skin 778 joint5 1.000000
836
+ skin 779 joint5 1.000000
837
+ skin 780 joint7 1.000000
838
+ skin 781 joint7 1.000000
839
+ skin 782 joint5 1.000000
840
+ skin 783 joint5 1.000000
841
+ skin 784 joint5 0.622857 joint7 0.377144
842
+ skin 785 joint5 1.000000
843
+ skin 786 joint7 1.000000
844
+ skin 787 joint7 1.000000
845
+ skin 788 joint7 1.000000
846
+ skin 789 joint7 1.000000
847
+ skin 790 joint7 1.000000
848
+ skin 791 joint5 0.314957 joint7 0.685043
849
+ skin 792 joint5 0.522281 joint7 0.477719
850
+ skin 793 joint5 0.327598 joint7 0.672402
851
+ skin 794 joint5 1.000000
852
+ skin 795 joint5 1.000000
853
+ skin 796 joint5 1.000000
854
+ skin 797 joint5 0.639846 joint7 0.360154
855
+ skin 798 joint7 1.000000
856
+ skin 799 joint5 0.314957 joint7 0.685043
857
+ skin 800 joint5 0.314957 joint7 0.685043
858
+ skin 801 joint5 0.314957 joint7 0.685043
859
+ skin 802 joint5 0.626617 joint7 0.373383
860
+ skin 803 joint5 0.626617 joint7 0.373383
861
+ skin 804 joint5 1.000000
862
+ skin 805 joint5 1.000000
863
+ skin 806 joint7 1.000000
864
+ skin 807 joint7 1.000000
865
+ skin 808 joint7 1.000000
866
+ skin 809 joint7 1.000000
867
+ skin 810 joint5 0.663025 joint12 0.336975
868
+ skin 811 joint5 1.000000
869
+ skin 812 joint5 1.000000
870
+ skin 813 joint5 0.535267 joint12 0.464733
871
+ skin 814 joint15 0.303936 joint16 0.404654 joint19 0.291410
872
+ skin 815 joint15 0.241280 joint16 0.386258 joint19 0.372462
873
+ skin 816 joint14 0.580049 joint15 0.419951
874
+ skin 817 joint9 0.170790 joint14 0.420562 joint15 0.408648
875
+ skin 818 joint15 0.254544 joint16 0.470757 joint19 0.274698
876
+ skin 819 joint19 1.000000
877
+ skin 820 joint19 1.000000
878
+ skin 821 joint14 0.462144 joint15 0.537856
879
+ skin 822 joint19 1.000000
880
+ skin 823 joint19 1.000000
881
+ skin 824 joint15 0.476026 joint16 0.523974
882
+ skin 825 joint16 0.446690 joint19 0.553310
883
+ skin 826 joint15 0.493780 joint16 0.506220
884
+ skin 827 joint16 1.000000
885
+ skin 828 joint14 0.392267 joint15 0.607733
886
+ skin 829 joint10 0.210455 joint14 0.571710 joint15 0.217836
887
+ skin 830 joint10 0.482580 joint14 0.517420
888
+ skin 831 joint10 0.716107 joint14 0.283893
889
+ skin 832 joint10 1.000000
890
+ skin 833 joint10 1.000000
891
+ skin 834 joint10 1.000000
892
+ skin 835 joint10 1.000000
893
+ skin 836 joint10 1.000000
894
+ skin 837 joint10 1.000000
895
+ skin 838 joint10 1.000000
896
+ skin 839 joint10 0.704043 joint14 0.295957
897
+ skin 840 joint10 0.704043 joint14 0.295957
898
+ skin 841 joint10 0.361233 joint14 0.638767
899
+ skin 842 joint14 0.517991 joint15 0.482009
900
+ skin 843 joint14 0.564848 joint15 0.435152
901
+ skin 844 joint15 0.310412 joint16 0.399939 joint19 0.289649
902
+ skin 845 joint15 0.260031 joint16 0.422800 joint19 0.317169
903
+ skin 846 joint19 1.000000
904
+ skin 847 joint19 1.000000
905
+ skin 848 joint19 1.000000
906
+ skin 849 joint19 1.000000
907
+ skin 850 joint16 0.196783 joint19 0.316894 joint23 0.240993 joint26 0.245330
908
+ skin 851 joint16 1.000000
909
+ skin 852 joint16 1.000000
910
+ skin 853 joint16 1.000000
911
+ skin 854 joint16 1.000000
912
+ skin 855 joint16 0.681497 joint23 0.318503
913
+ skin 856 joint16 0.681497 joint23 0.318503
914
+ skin 857 joint16 1.000000
915
+ skin 858 joint16 1.000000
916
+ skin 859 joint16 1.000000
917
+ skin 860 joint16 1.000000
918
+ skin 861 joint10 0.304870 joint14 0.695130
919
+ skin 862 joint10 0.304870 joint14 0.695130
920
+ skin 863 joint10 1.000000
921
+ skin 864 joint10 1.000000
922
+ skin 865 joint16 0.320616 joint19 0.679384
923
+ skin 866 joint16 0.337449 joint19 0.662551
924
+ skin 867 joint16 0.213394 joint19 0.176749 joint23 0.441546 joint26 0.168311
925
+ skin 868 joint16 0.632870 joint23 0.367130
926
+ skin 869 joint16 0.192715 joint23 0.525958 joint26 0.281328
927
+ skin 870 joint16 1.000000
928
+ skin 871 joint1 0.701452 joint2 0.298548
929
+ skin 872 joint16 0.261527 joint23 0.527911 joint26 0.210562
930
+ skin 873 joint14 0.428442 joint15 0.571558
931
+ skin 874 joint15 1.000000
932
+ skin 875 joint14 1.000000
933
+ skin 876 joint14 1.000000
934
+ skin 877 joint10 0.371585 joint14 0.628415
935
+ skin 878 joint10 0.652504 joint14 0.347496
936
+ skin 879 joint10 1.000000
937
+ skin 880 joint10 0.343200 joint14 0.656800
938
+ skin 881 joint16 0.261211 joint23 0.414348 joint26 0.324442
939
+ skin 882 joint16 0.261211 joint23 0.414348 joint26 0.324442
940
+ skin 883 joint19 0.282850 joint23 0.265724 joint26 0.451426
941
+ skin 884 joint23 0.291824 joint26 0.708176
942
+ skin 885 joint19 0.299276 joint23 0.287839 joint26 0.412884
943
+ skin 886 joint23 0.259456 joint26 0.740544
944
+ skin 887 joint19 0.321286 joint23 0.425347 joint26 0.253368
945
+ skin 888 joint23 0.414029 joint26 0.585971
946
+ skin 889 joint23 0.594606 joint26 0.405394
947
+ skin 890 joint23 0.552699 joint26 0.447301
948
+ skin 891 joint19 0.449182 joint23 0.342301 joint26 0.208517
949
+ skin 892 joint23 0.383901 joint26 0.616099
950
+ skin 893 joint23 0.376880 joint26 0.623120
951
+ skin 894 joint16 0.152084 joint19 0.157153 joint23 0.317257 joint26 0.373506
952
+ skin 895 joint26 0.340326 joint27 0.659674
953
+ skin 896 joint26 0.340326 joint27 0.659674
954
+ skin 897 joint26 0.428823 joint27 0.571178
955
+ skin 898 joint26 0.428823 joint27 0.571178
956
+ skin 899 joint26 0.555009 joint27 0.444991
957
+ skin 900 joint26 0.555009 joint27 0.444991
958
+ skin 901 joint26 0.508948 joint27 0.491052
959
+ skin 902 joint26 0.508948 joint27 0.491052
960
+ skin 903 joint26 0.617482 joint27 0.382518
961
+ skin 904 joint26 0.617482 joint27 0.382518
962
+ skin 905 joint26 0.516741 joint27 0.483259
963
+ skin 906 joint26 0.516741 joint27 0.483259
964
+ skin 907 joint26 0.429731 joint27 0.570269
965
+ skin 908 joint26 0.429731 joint27 0.570269
966
+ skin 909 joint26 0.366213 joint27 0.633787
967
+ skin 910 joint26 0.366213 joint27 0.633787
968
+ skin 911 joint26 0.389980 joint27 0.610020
969
+ skin 912 joint26 0.429731 joint27 0.570269
970
+ skin 913 joint26 0.431648 joint27 0.568352
971
+ skin 914 joint26 0.547279 joint27 0.452721
972
+ skin 915 joint26 0.547279 joint27 0.452721
973
+ skin 916 joint26 0.561141 joint27 0.438860
974
+ skin 917 joint26 0.429731 joint27 0.570269
975
+ skin 918 joint26 0.429731 joint27 0.570269
976
+ skin 919 joint26 0.709676 joint27 0.290324
977
+ skin 920 joint26 0.652862 joint27 0.347138
978
+ skin 921 joint26 1.000000
979
+ skin 922 joint26 1.000000
980
+ skin 923 joint26 1.000000
981
+ skin 924 joint26 1.000000
982
+ skin 925 joint26 1.000000
983
+ skin 926 joint26 1.000000
984
+ skin 927 joint26 0.709490 joint27 0.290510
985
+ skin 928 joint26 0.721677 joint27 0.278323
986
+ skin 929 joint26 0.627424 joint27 0.372576
987
+ skin 930 joint26 0.696599 joint27 0.303402
988
+ skin 931 joint26 0.709676 joint27 0.290324
989
+ skin 932 joint26 1.000000
990
+ skin 933 joint26 0.453910 joint27 0.546090
991
+ skin 934 joint26 0.655447 joint27 0.344553
992
+ skin 935 joint26 0.510799 joint27 0.489201
993
+ skin 936 joint26 0.510799 joint27 0.489201
994
+ skin 937 joint26 0.655447 joint27 0.344553
995
+ skin 938 joint26 0.721718 joint27 0.278282
996
+ skin 939 joint26 0.718285 joint27 0.281715
997
+ skin 940 joint26 1.000000
998
+ skin 941 joint26 0.721677 joint27 0.278323
999
+ skin 942 joint26 1.000000
1000
+ skin 943 joint26 1.000000
1001
+ skin 944 joint23 0.329100 joint26 0.670900
1002
+ skin 945 joint26 1.000000
1003
+ skin 946 joint26 0.460415 joint27 0.539585
1004
+ skin 947 joint26 0.492852 joint27 0.507148
1005
+ skin 948 joint26 0.492852 joint27 0.507148
1006
+ skin 949 joint26 0.452410 joint27 0.547590
1007
+ skin 950 joint26 0.449106 joint27 0.550894
1008
+ skin 951 joint26 0.449106 joint27 0.550894
1009
+ skin 952 joint26 0.422634 joint27 0.577366
1010
+ skin 953 joint26 0.471994 joint27 0.528006
1011
+ skin 954 joint26 0.471994 joint27 0.528006
1012
+ skin 955 joint26 0.359096 joint27 0.640904
1013
+ skin 956 joint26 0.429929 joint27 0.570071
1014
+ skin 957 joint26 0.429929 joint27 0.570071
1015
+ skin 958 joint26 0.272441 joint27 0.727559
1016
+ skin 959 joint26 0.349046 joint27 0.650954
1017
+ skin 960 joint26 0.349046 joint27 0.650954
1018
+ skin 961 joint26 0.288604 joint27 0.711396
1019
+ skin 962 joint26 0.336817 joint27 0.663183
1020
+ skin 963 joint26 0.336817 joint27 0.663183
1021
+ skin 964 joint26 0.267951 joint27 0.732049
1022
+ skin 965 joint27 1.000000
1023
+ skin 966 joint27 1.000000
1024
+ skin 967 joint4 0.314888 joint10 0.685112
1025
+ skin 968 joint27 1.000000
1026
+ skin 969 joint27 1.000000
1027
+ skin 970 joint26 0.260790 joint27 0.739210
1028
+ skin 971 joint26 0.263186 joint27 0.736814
1029
+ skin 972 joint27 1.000000
1030
+ skin 973 joint27 1.000000
1031
+ skin 974 joint27 1.000000
1032
+ skin 975 joint27 1.000000
1033
+ skin 976 joint26 0.361323 joint27 0.638677
1034
+ skin 977 joint26 0.330256 joint27 0.669744
1035
+ skin 978 joint26 0.380756 joint27 0.619244
1036
+ skin 979 joint26 0.318050 joint27 0.681950
1037
+ skin 980 joint27 1.000000
1038
+ skin 981 joint26 0.323312 joint27 0.676688
1039
+ skin 982 joint27 1.000000
1040
+ skin 983 joint27 1.000000
1041
+ skin 984 joint26 0.421836 joint27 0.578164
1042
+ skin 985 joint26 0.487007 joint27 0.512993
1043
+ skin 986 joint26 1.000000
1044
+ skin 987 joint26 1.000000
1045
+ skin 988 joint26 1.000000
1046
+ skin 989 joint26 0.737932 joint27 0.262068
1047
+ skin 990 joint26 0.697724 joint27 0.302276
1048
+ skin 991 joint26 0.697724 joint27 0.302276
1049
+ skin 992 joint26 0.737932 joint27 0.262068
1050
+ skin 993 joint26 0.737932 joint27 0.262068
1051
+ skin 994 joint26 0.523969 joint27 0.476031
1052
+ skin 995 joint26 1.000000
1053
+ skin 996 joint26 1.000000
1054
+ skin 997 joint26 1.000000
1055
+ skin 998 joint26 1.000000
1056
+ skin 999 joint26 1.000000
1057
+ skin 1000 joint26 1.000000
1058
+ skin 1001 joint26 1.000000
1059
+ skin 1002 joint26 1.000000
1060
+ skin 1003 joint26 1.000000
1061
+ skin 1004 joint26 1.000000
1062
+ skin 1005 joint26 1.000000
1063
+ skin 1006 joint26 1.000000
1064
+ skin 1007 joint26 1.000000
1065
+ skin 1008 joint26 1.000000
1066
+ skin 1009 joint26 1.000000
1067
+ skin 1010 joint26 1.000000
1068
+ skin 1011 joint26 1.000000
1069
+ skin 1012 joint26 1.000000
1070
+ skin 1013 joint26 1.000000
1071
+ skin 1014 joint26 1.000000
1072
+ skin 1015 joint26 1.000000
1073
+ skin 1016 joint26 1.000000
1074
+ skin 1017 joint26 1.000000
1075
+ skin 1018 joint26 1.000000
1076
+ skin 1019 joint26 1.000000
1077
+ skin 1020 joint26 1.000000
1078
+ skin 1021 joint26 1.000000
1079
+ skin 1022 joint26 1.000000
1080
+ skin 1023 joint26 1.000000
1081
+ skin 1024 joint26 1.000000
1082
+ skin 1025 joint26 1.000000
1083
+ skin 1026 joint26 1.000000
1084
+ skin 1027 joint26 1.000000
1085
+ skin 1028 joint26 1.000000
1086
+ skin 1029 joint26 1.000000
1087
+ skin 1030 joint26 1.000000
1088
+ skin 1031 joint26 1.000000
1089
+ skin 1032 joint26 1.000000
1090
+ skin 1033 joint26 1.000000
1091
+ skin 1034 joint26 1.000000
1092
+ skin 1035 joint26 1.000000
1093
+ skin 1036 joint23 0.321400 joint26 0.678600
1094
+ skin 1037 joint23 0.321400 joint26 0.678600
1095
+ skin 1038 joint26 1.000000
1096
+ skin 1039 joint26 1.000000
1097
+ skin 1040 joint26 1.000000
1098
+ skin 1041 joint26 1.000000
1099
+ skin 1042 joint26 1.000000
1100
+ skin 1043 joint26 1.000000
1101
+ skin 1044 joint26 1.000000
1102
+ skin 1045 joint26 1.000000
1103
+ skin 1046 joint26 1.000000
1104
+ skin 1047 joint26 1.000000
1105
+ skin 1048 joint26 1.000000
1106
+ skin 1049 joint26 1.000000
1107
+ skin 1050 joint26 1.000000
1108
+ skin 1051 joint26 1.000000
1109
+ skin 1052 joint26 1.000000
1110
+ skin 1053 joint26 1.000000
1111
+ skin 1054 joint26 1.000000
1112
+ skin 1055 joint26 1.000000
1113
+ skin 1056 joint26 1.000000
1114
+ skin 1057 joint26 1.000000
1115
+ skin 1058 joint26 1.000000
1116
+ skin 1059 joint26 1.000000
1117
+ skin 1060 joint26 1.000000
1118
+ skin 1061 joint26 1.000000
1119
+ skin 1062 joint26 1.000000
1120
+ skin 1063 joint26 1.000000
1121
+ skin 1064 joint26 1.000000
1122
+ skin 1065 joint26 1.000000
1123
+ skin 1066 joint26 1.000000
1124
+ skin 1067 joint26 1.000000
1125
+ skin 1068 joint26 1.000000
1126
+ skin 1069 joint26 1.000000
1127
+ skin 1070 joint26 1.000000
1128
+ skin 1071 joint26 1.000000
1129
+ skin 1072 joint26 1.000000
1130
+ skin 1073 joint26 1.000000
1131
+ skin 1074 joint26 1.000000
1132
+ skin 1075 joint26 1.000000
1133
+ skin 1076 joint26 1.000000
1134
+ skin 1077 joint26 1.000000
1135
+ skin 1078 joint26 1.000000
1136
+ skin 1079 joint26 1.000000
1137
+ skin 1080 joint26 1.000000
1138
+ skin 1081 joint26 1.000000
1139
+ skin 1082 joint26 1.000000
1140
+ skin 1083 joint26 1.000000
1141
+ skin 1084 joint26 1.000000
1142
+ skin 1085 joint26 1.000000
1143
+ skin 1086 joint26 0.534833 joint27 0.465167
1144
+ skin 1087 joint26 0.489875 joint27 0.510125
1145
+ skin 1088 joint26 0.417111 joint27 0.582889
1146
+ skin 1089 joint26 0.380163 joint27 0.619837
1147
+ skin 1090 joint26 0.283284 joint27 0.716716
1148
+ skin 1091 joint26 0.368588 joint27 0.631412
1149
+ skin 1092 joint26 0.352180 joint27 0.647820
1150
+ skin 1093 joint27 1.000000
1151
+ skin 1094 joint27 1.000000
1152
+ skin 1095 joint10 1.000000
1153
+ skin 1096 joint10 1.000000
1154
+ skin 1097 joint10 1.000000
1155
+ skin 1098 joint4 0.341420 joint10 0.658580
1156
+ skin 1099 joint4 0.291967 joint10 0.708033
1157
+ skin 1100 joint4 0.353504 joint10 0.646496
1158
+ skin 1101 joint4 0.375471 joint10 0.624529
1159
+ skin 1102 joint4 0.416264 joint10 0.583736
1160
+ skin 1103 joint4 0.432829 joint10 0.567171
1161
+ skin 1104 joint4 1.000000
1162
+ skin 1105 joint4 1.000000
1163
+ skin 1106 joint4 1.000000
1164
+ skin 1107 joint4 1.000000
1165
+ skin 1108 joint4 1.000000
1166
+ skin 1109 joint4 1.000000
1167
+ skin 1110 joint3 1.000000
1168
+ skin 1111 joint3 1.000000
1169
+ skin 1112 joint3 1.000000
1170
+ skin 1113 joint3 1.000000
1171
+ skin 1114 joint3 1.000000
1172
+ skin 1115 joint3 1.000000
1173
+ skin 1116 joint3 1.000000
1174
+ skin 1117 joint4 0.674664 joint10 0.325336
1175
+ skin 1118 joint2 0.448711 joint3 0.551289
1176
+ skin 1119 joint2 0.638053 joint3 0.361947
1177
+ skin 1120 joint2 0.576739 joint3 0.423261
1178
+ skin 1121 joint2 0.641299 joint3 0.358701
1179
+ skin 1122 joint2 0.616238 joint3 0.383762
1180
+ skin 1123 joint2 1.000000
1181
+ skin 1124 joint1 0.312720 joint2 0.687280
1182
+ skin 1125 joint1 0.320231 joint2 0.679769
1183
+ skin 1126 joint1 0.392069 joint2 0.607931
1184
+ skin 1127 joint1 0.401082 joint2 0.598918
1185
+ skin 1128 joint1 0.398395 joint2 0.601605
1186
+ skin 1129 joint26 0.644344 joint27 0.355656
1187
+ skin 1130 joint26 0.335487 joint27 0.664513
1188
+ skin 1131 joint27 1.000000
1189
+ skin 1132 joint27 1.000000
1190
+ skin 1133 joint27 1.000000
1191
+ skin 1134 joint27 1.000000
1192
+ skin 1135 joint27 1.000000
1193
+ skin 1136 joint27 1.000000
1194
+ skin 1137 joint27 1.000000
1195
+ skin 1138 joint23 0.270642 joint26 0.729358
1196
+ skin 1139 joint23 0.397271 joint26 0.602729
1197
+ skin 1140 joint23 0.397271 joint26 0.602729
1198
+ skin 1141 joint0 0.357060 joint1 0.642940
1199
+ skin 1142 joint0 0.357060 joint1 0.642940
1200
+ skin 1143 joint16 0.523305 joint23 0.476695
1201
+ skin 1144 joint10 0.655261 joint14 0.344739
1202
+ skin 1145 joint10 0.655261 joint14 0.344739
1203
+ skin 1146 joint10 0.655261 joint14 0.344739
1204
+ skin 1147 joint10 0.655261 joint14 0.344739
1205
+ skin 1148 joint14 0.644779 joint15 0.355221
1206
+ skin 1149 joint14 0.644779 joint15 0.355221
1207
+ skin 1150 joint10 1.000000
1208
+ skin 1151 joint10 1.000000
1209
+ skin 1152 joint15 0.477703 joint16 0.522297
1210
+ skin 1153 joint15 0.477703 joint16 0.522297
1211
+ skin 1154 joint15 0.522779 joint16 0.477221
1212
+ skin 1155 joint0 0.372524 joint1 0.627476
1213
+ skin 1156 joint0 0.425253 joint1 0.574747
1214
+ skin 1157 joint0 0.389312 joint1 0.610688
1215
+ skin 1158 joint0 0.353121 joint1 0.646879
1216
+ skin 1159 joint0 0.394841 joint1 0.605159
1217
+ skin 1160 joint0 0.371566 joint1 0.628435
1218
+ skin 1161 joint0 1.000000
1219
+ skin 1162 joint0 1.000000
1220
+ skin 1163 joint0 1.000000
1221
+ skin 1164 joint0 1.000000
1222
+ skin 1165 joint0 1.000000
1223
+ skin 1166 joint0 1.000000
1224
+ skin 1167 joint0 1.000000
1225
+ skin 1168 joint0 1.000000
1226
+ skin 1169 joint21 1.000000
1227
+ skin 1170 joint4 0.722660 joint10 0.277340
1228
+ skin 1171 joint4 0.722660 joint10 0.277340
1229
+ skin 1172 joint4 0.712179 joint10 0.287821
1230
+ skin 1173 joint4 1.000000
1231
+ skin 1174 joint4 1.000000
1232
+ skin 1175 joint4 0.672691 joint10 0.327309
1233
+ skin 1176 joint4 0.388605 joint10 0.611395
1234
+ skin 1177 joint4 0.388605 joint10 0.611395
1235
+ skin 1178 joint0 1.000000
1236
+ skin 1179 joint0 1.000000
1237
+ skin 1180 joint0 1.000000
1238
+ skin 1181 joint0 1.000000
1239
+ skin 1182 joint0 1.000000
1240
+ skin 1183 joint0 1.000000
1241
+ skin 1184 joint0 1.000000
1242
+ skin 1185 joint0 1.000000
1243
+ skin 1186 joint4 0.720787 joint10 0.279213
1244
+ skin 1187 joint10 1.000000
1245
+ skin 1188 joint10 1.000000
1246
+ skin 1189 joint0 1.000000
1247
+ skin 1190 joint0 1.000000
1248
+ skin 1191 joint0 1.000000
1249
+ skin 1192 joint10 1.000000
1250
+ skin 1193 joint10 1.000000
1251
+ skin 1194 joint4 0.307987 joint10 0.692013
1252
+ skin 1195 joint4 0.307987 joint10 0.692013
1253
+ skin 1196 joint10 1.000000
1254
+ skin 1197 joint10 1.000000
1255
+ skin 1198 joint10 1.000000
1256
+ skin 1199 joint26 1.000000
1257
+ skin 1200 joint27 1.000000
1258
+ skin 1201 joint26 0.345570 joint27 0.654430
1259
+ skin 1202 joint0 1.000000
1260
+ skin 1203 joint0 1.000000
1261
+ skin 1204 joint0 1.000000
1262
+ skin 1205 joint0 1.000000
1263
+ skin 1206 joint0 1.000000
1264
+ skin 1207 joint0 1.000000
1265
+ skin 1208 joint0 1.000000
1266
+ skin 1209 joint0 1.000000
1267
+ skin 1210 joint4 0.277297 joint10 0.722703
1268
+ skin 1211 joint4 0.277297 joint10 0.722703
1269
+ skin 1212 joint3 0.346174 joint4 0.653826
1270
+ skin 1213 joint4 0.282176 joint10 0.717824
1271
+ skin 1214 joint10 1.000000
1272
+ skin 1215 joint10 1.000000
1273
+ skin 1216 joint10 1.000000
1274
+ skin 1217 joint0 1.000000
1275
+ skin 1218 joint0 1.000000
1276
+ skin 1219 joint0 1.000000
1277
+ skin 1220 joint0 1.000000
1278
+ skin 1221 joint0 1.000000
1279
+ skin 1222 joint0 1.000000
1280
+ skin 1223 joint0 1.000000
1281
+ skin 1224 joint0 1.000000
1282
+ skin 1225 joint0 1.000000
1283
+ skin 1226 joint10 1.000000
1284
+ skin 1227 joint10 1.000000
1285
+ skin 1228 joint10 1.000000
1286
+ skin 1229 joint10 1.000000
1287
+ skin 1230 joint10 1.000000
1288
+ skin 1231 joint10 1.000000
1289
+ skin 1232 joint4 0.277297 joint10 0.722703
1290
+ skin 1233 joint4 0.277297 joint10 0.722703
1291
+ skin 1234 joint10 0.605729 joint14 0.394271
1292
+ skin 1235 joint10 0.605729 joint14 0.394271
1293
+ skin 1236 joint10 1.000000
1294
+ skin 1237 joint0 1.000000
1295
+ skin 1238 joint0 1.000000
1296
+ skin 1239 joint0 1.000000
1297
+ skin 1240 joint0 1.000000
1298
+ skin 1241 joint0 1.000000
1299
+ skin 1242 joint0 1.000000
1300
+ skin 1243 joint0 1.000000
1301
+ skin 1244 joint0 1.000000
1302
+ skin 1245 joint0 1.000000
1303
+ skin 1246 joint0 1.000000
1304
+ skin 1247 joint0 1.000000
1305
+ skin 1248 joint0 1.000000
1306
+ skin 1249 joint0 1.000000
1307
+ skin 1250 joint0 1.000000
1308
+ skin 1251 joint0 1.000000
1309
+ skin 1252 joint0 1.000000
1310
+ skin 1253 joint9 0.497636 joint10 0.502364
1311
+ skin 1254 joint9 0.588465 joint10 0.411535
1312
+ skin 1255 joint9 0.596825 joint10 0.403175
1313
+ skin 1256 joint9 0.659147 joint10 0.340853
1314
+ skin 1257 joint9 0.602217 joint10 0.397783
1315
+ skin 1258 joint9 0.497023 joint10 0.502977
1316
+ skin 1259 joint9 0.410688 joint10 0.589312
1317
+ skin 1260 joint9 0.410688 joint10 0.589312
1318
+ skin 1261 joint9 0.411937 joint10 0.588063
1319
+ skin 1262 joint9 0.432107 joint10 0.567893
1320
+ skin 1263 joint9 0.333960 joint10 0.666040
1321
+ skin 1264 joint9 1.000000
1322
+ skin 1265 joint9 0.583790 joint10 0.416210
1323
+ skin 1266 joint9 0.284442 joint10 0.415526 joint14 0.300032
1324
+ skin 1267 joint10 0.355315 joint14 0.644685
1325
+ skin 1268 joint14 1.000000
1326
+ skin 1269 joint14 1.000000
1327
+ skin 1270 joint9 0.364712 joint12 0.635287
1328
+ skin 1271 joint12 1.000000
1329
+ skin 1272 joint12 1.000000
1330
+ skin 1273 joint12 1.000000
1331
+ skin 1274 joint5 0.327975 joint12 0.672025
1332
+ skin 1275 joint5 1.000000
1333
+ skin 1276 joint5 0.262705 joint7 0.737294
1334
+ skin 1277 joint5 0.262705 joint7 0.737294
1335
+ skin 1278 joint5 0.314957 joint7 0.685043
1336
+ skin 1279 joint5 0.626617 joint7 0.373383
1337
+ skin 1280 joint5 1.000000
1338
+ skin 1281 joint5 1.000000
1339
+ skin 1282 joint14 0.740006 joint15 0.259994
1340
+ skin 1283 joint14 0.740006 joint15 0.259994
1341
+ skin 1284 joint14 0.740006 joint15 0.259994
1342
+ skin 1285 joint10 0.609301 joint14 0.390699
1343
+ skin 1286 joint10 0.609301 joint14 0.390699
1344
+ skin 1287 joint14 0.732643 joint15 0.267357
1345
+ skin 1288 joint14 0.732643 joint15 0.267357
1346
+ skin 1289 joint14 0.609158 joint15 0.390842
1347
+ skin 1290 joint14 1.000000
1348
+ skin 1291 joint14 1.000000
1349
+ skin 1292 joint14 0.441384 joint15 0.558616
1350
+ skin 1293 joint14 0.441384 joint15 0.558616
1351
+ skin 1294 joint10 0.307690 joint14 0.692310
1352
+ skin 1295 joint10 0.307690 joint14 0.692310
1353
+ skin 1296 joint15 0.678402 joint16 0.321598
1354
+ skin 1297 joint15 0.678402 joint16 0.321598
1355
+ skin 1298 joint14 0.354270 joint15 0.645730
1356
+ skin 1299 joint14 0.354270 joint15 0.645730
1357
+ skin 1300 joint14 0.468554 joint15 0.531446
1358
+ skin 1301 joint14 0.468554 joint15 0.531446
1359
+ skin 1302 joint14 0.337236 joint15 0.662764
1360
+ skin 1303 joint15 0.604828 joint16 0.395172
1361
+ skin 1304 joint15 0.604828 joint16 0.395172
1362
+ skin 1305 joint15 0.468997 joint16 0.531003
1363
+ skin 1306 joint15 0.468997 joint16 0.531003
1364
+ skin 1307 joint15 0.621293 joint16 0.378707
1365
+ skin 1308 joint15 0.621293 joint16 0.378707
1366
+ skin 1309 joint15 0.501356 joint16 0.498644
1367
+ skin 1310 joint15 0.489442 joint16 0.510558
1368
+ skin 1311 joint15 0.489442 joint16 0.510558
1369
+ skin 1312 joint15 0.494413 joint16 0.505587
1370
+ skin 1313 joint15 0.494413 joint16 0.505587
1371
+ skin 1314 joint15 0.671568 joint16 0.328432
1372
+ skin 1315 joint15 0.630327 joint16 0.369673
1373
+ skin 1316 joint14 0.234044 joint15 0.500354 joint16 0.265602
1374
+ skin 1317 joint14 0.234044 joint15 0.500354 joint16 0.265602
1375
+ skin 1318 joint14 0.169148 joint15 0.426135 joint16 0.404717
1376
+ skin 1319 joint14 0.233113 joint15 0.434403 joint16 0.332484
1377
+ skin 1320 joint14 0.164375 joint15 0.440071 joint16 0.395554
1378
+ skin 1321 joint15 0.409824 joint16 0.423990 joint19 0.166186
1379
+ skin 1322 joint14 0.371171 joint15 0.628829
1380
+ skin 1323 joint14 0.371171 joint15 0.628829
1381
+ skin 1324 joint15 0.335650 joint16 0.664350
1382
+ skin 1325 joint15 0.335650 joint16 0.664350
1383
+ skin 1326 joint15 0.414315 joint16 0.585685
1384
+ skin 1327 joint15 0.414315 joint16 0.585685
1385
+ skin 1328 joint15 0.354073 joint16 0.645927
1386
+ skin 1329 joint15 0.570233 joint16 0.429766
1387
+ skin 1330 joint16 0.626967 joint19 0.373033
1388
+ skin 1331 joint16 0.626967 joint19 0.373033
1389
+ skin 1332 joint15 0.476026 joint16 0.523974
1390
+ skin 1333 joint15 0.476026 joint16 0.523974
1391
+ skin 1334 joint16 1.000000
1392
+ skin 1335 joint16 1.000000
1393
+ skin 1336 joint16 0.706441 joint19 0.293559
1394
+ skin 1337 joint16 0.706441 joint19 0.293559
1395
+ skin 1338 joint16 0.678127 joint19 0.321873
1396
+ skin 1339 joint15 0.530587 joint16 0.469413
1397
+ skin 1340 joint16 1.000000
1398
+ skin 1341 joint16 1.000000
1399
+ skin 1342 joint16 1.000000
1400
+ skin 1343 joint16 1.000000
1401
+ skin 1344 joint16 0.429639 joint19 0.570361
1402
+ skin 1345 joint16 0.429639 joint19 0.570361
1403
+ skin 1346 joint16 0.651058 joint19 0.348942
1404
+ skin 1347 joint16 0.446690 joint19 0.553310
1405
+ skin 1348 joint16 0.446690 joint19 0.553310
1406
+ skin 1349 joint16 0.519165 joint19 0.480835
1407
+ skin 1350 joint16 0.519165 joint19 0.480835
1408
+ skin 1351 joint16 0.374344 joint19 0.163412 joint23 0.318485 joint26 0.143758
1409
+ skin 1352 joint16 0.374344 joint19 0.163412 joint23 0.318485 joint26 0.143758
1410
+ skin 1353 joint16 0.277572 joint23 0.485865 joint26 0.236562
1411
+ skin 1354 joint16 0.277572 joint23 0.485865 joint26 0.236562
1412
+ skin 1355 joint16 0.579823 joint23 0.420177
1413
+ skin 1356 joint23 0.577908 joint26 0.422092
1414
+ skin 1357 joint23 0.577908 joint26 0.422092
1415
+ skin 1358 joint16 0.451703 joint19 0.548297
1416
+ skin 1359 joint16 0.451703 joint19 0.548297
1417
+ skin 1360 joint16 0.213394 joint19 0.176749 joint23 0.441546 joint26 0.168311
1418
+ skin 1361 joint16 0.213394 joint19 0.176749 joint23 0.441546 joint26 0.168311
1419
+ skin 1362 joint23 0.470448 joint26 0.529552
1420
+ skin 1363 joint23 0.470448 joint26 0.529552
1421
+ skin 1364 joint16 0.213287 joint23 0.569547 joint26 0.217166
1422
+ skin 1365 joint16 0.495001 joint19 0.504999
1423
+ skin 1366 joint16 0.495001 joint19 0.504999
1424
+ skin 1367 joint23 0.670548 joint26 0.329452
1425
+ skin 1368 joint23 0.670548 joint26 0.329452
1426
+ skin 1369 joint16 0.213394 joint19 0.176749 joint23 0.441546 joint26 0.168311
1427
+ skin 1370 joint16 0.213394 joint19 0.176749 joint23 0.441546 joint26 0.168311
1428
+ skin 1371 joint14 1.000000
1429
+ skin 1372 joint14 1.000000
1430
+ skin 1373 joint14 1.000000
1431
+ skin 1374 joint14 1.000000
1432
+ skin 1375 joint14 1.000000
1433
+ skin 1376 joint14 1.000000
1434
+ skin 1377 joint14 1.000000
1435
+ skin 1378 joint10 0.592796 joint14 0.407204
1436
+ skin 1379 joint10 0.592796 joint14 0.407204
1437
+ skin 1380 joint10 0.373890 joint14 0.626110
1438
+ skin 1381 joint10 0.373890 joint14 0.626110
1439
+ skin 1382 joint10 0.459169 joint14 0.540831
1440
+ skin 1383 joint14 1.000000
1441
+ skin 1384 joint14 1.000000
1442
+ skin 1385 joint10 1.000000
1443
+ skin 1386 joint10 1.000000
1444
+ skin 1387 joint10 0.396467 joint14 0.603533
1445
+ skin 1388 joint10 0.396467 joint14 0.603533
1446
+ skin 1389 joint4 0.392436 joint10 0.607564
1447
+ skin 1390 joint4 0.392436 joint10 0.607564
1448
+ skin 1391 joint4 0.416232 joint10 0.583768
1449
+ skin 1392 joint4 0.416232 joint10 0.583768
1450
+ skin 1393 joint4 1.000000
1451
+ skin 1394 joint4 1.000000
1452
+ skin 1395 joint4 0.518651 joint10 0.481349
1453
+ skin 1396 joint4 0.518651 joint10 0.481349
1454
+ skin 1397 joint4 1.000000
1455
+ skin 1398 joint4 1.000000
1456
+ skin 1399 joint4 1.000000
1457
+ skin 1400 joint4 0.683539 joint10 0.316461
1458
+ skin 1401 joint4 0.683539 joint10 0.316461
1459
+ skin 1402 joint3 0.385450 joint4 0.614550
1460
+ skin 1403 joint3 0.385450 joint4 0.614550
1461
+ skin 1404 joint4 1.000000
1462
+ skin 1405 joint4 1.000000
1463
+ skin 1406 joint4 0.563483 joint10 0.436517
1464
+ skin 1407 joint4 0.563483 joint10 0.436517
1465
+ skin 1408 joint4 1.000000
1466
+ skin 1409 joint4 1.000000
1467
+ skin 1410 joint3 0.664683 joint4 0.335317
1468
+ skin 1411 joint3 0.664683 joint4 0.335317
1469
+ skin 1412 joint4 1.000000
1470
+ skin 1413 joint4 1.000000
1471
+ skin 1414 joint3 0.419656 joint4 0.580344
1472
+ skin 1415 joint3 0.419656 joint4 0.580344
1473
+ skin 1416 joint4 1.000000
1474
+ skin 1417 joint3 0.419656 joint4 0.580344
1475
+ skin 1418 joint3 0.500416 joint4 0.499584
1476
+ skin 1419 joint3 0.500416 joint4 0.499584
1477
+ skin 1420 joint1 1.000000
1478
+ skin 1421 joint1 1.000000
1479
+ skin 1422 joint3 0.500849 joint4 0.499151
1480
+ skin 1423 joint3 0.419656 joint4 0.580344
1481
+ skin 1424 joint3 0.419656 joint4 0.580344
1482
+ skin 1425 joint3 0.626239 joint4 0.373761
1483
+ skin 1426 joint3 0.626239 joint4 0.373761
1484
+ skin 1427 joint2 1.000000
1485
+ skin 1428 joint3 1.000000
1486
+ skin 1429 joint3 1.000000
1487
+ skin 1430 joint3 1.000000
1488
+ skin 1431 joint3 0.701723 joint4 0.298276
1489
+ skin 1432 joint3 0.701723 joint4 0.298276
1490
+ skin 1433 joint3 1.000000
1491
+ skin 1434 joint3 1.000000
1492
+ skin 1435 joint3 1.000000
1493
+ skin 1436 joint3 1.000000
1494
+ skin 1437 joint3 1.000000
1495
+ skin 1438 joint3 1.000000
1496
+ skin 1439 joint3 1.000000
1497
+ skin 1440 joint3 1.000000
1498
+ skin 1441 joint2 0.448711 joint3 0.551289
1499
+ skin 1442 joint3 1.000000
1500
+ skin 1443 joint3 1.000000
1501
+ skin 1444 joint3 1.000000
1502
+ skin 1445 joint3 1.000000
1503
+ skin 1446 joint1 1.000000
1504
+ skin 1447 joint3 1.000000
1505
+ skin 1448 joint3 1.000000
1506
+ skin 1449 joint3 1.000000
1507
+ skin 1450 joint2 0.392916 joint3 0.607085
1508
+ skin 1451 joint3 1.000000
1509
+ skin 1452 joint2 0.372074 joint3 0.627926
1510
+ skin 1453 joint2 0.372074 joint3 0.627926
1511
+ skin 1454 joint2 0.372074 joint3 0.627926
1512
+ skin 1455 joint2 0.392916 joint3 0.607085
1513
+ skin 1456 joint2 0.392916 joint3 0.607085
1514
+ skin 1457 joint2 0.392916 joint3 0.607085
1515
+ skin 1458 joint2 0.607263 joint3 0.392737
1516
+ skin 1459 joint2 0.653432 joint3 0.346568
1517
+ skin 1460 joint2 0.653432 joint3 0.346568
1518
+ skin 1461 joint2 0.653432 joint3 0.346568
1519
+ skin 1462 joint2 0.635557 joint3 0.364443
1520
+ skin 1463 joint2 0.635557 joint3 0.364443
1521
+ skin 1464 joint2 0.635557 joint3 0.364443
1522
+ skin 1465 joint1 0.458386 joint2 0.541614
1523
+ skin 1466 joint1 0.458386 joint2 0.541614
1524
+ skin 1467 joint2 1.000000
1525
+ skin 1468 joint3 1.000000
1526
+ skin 1469 joint3 1.000000
1527
+ skin 1470 joint3 1.000000
1528
+ skin 1471 joint2 1.000000
1529
+ skin 1472 joint2 1.000000
1530
+ skin 1473 joint1 1.000000
1531
+ skin 1474 joint1 1.000000
1532
+ skin 1475 joint1 1.000000
1533
+ skin 1476 joint1 0.267844 joint2 0.732156
1534
+ skin 1477 joint1 0.267844 joint2 0.732156
1535
+ skin 1478 joint3 0.716090 joint4 0.283910
1536
+ skin 1479 joint3 0.716090 joint4 0.283910
1537
+ skin 1480 joint1 0.458386 joint2 0.541614
1538
+ skin 1481 joint3 0.533163 joint4 0.466837
1539
+ skin 1482 joint2 1.000000
1540
+ skin 1483 joint2 1.000000
1541
+ skin 1484 joint1 0.267145 joint2 0.732855
1542
+ skin 1485 joint1 0.300941 joint2 0.699059
1543
+ skin 1486 joint1 0.275501 joint2 0.724499
1544
+ skin 1487 joint1 0.271336 joint2 0.728664
1545
+ skin 1488 joint1 0.271336 joint2 0.728664
1546
+ skin 1489 joint1 1.000000
1547
+ skin 1490 joint1 1.000000
1548
+ skin 1491 joint1 1.000000
1549
+ skin 1492 joint1 1.000000
1550
+ skin 1493 joint1 1.000000
1551
+ skin 1494 joint1 1.000000
1552
+ skin 1495 joint1 1.000000
1553
+ skin 1496 joint0 1.000000
1554
+ skin 1497 joint0 0.377451 joint1 0.622549
1555
+ skin 1498 joint0 0.377451 joint1 0.622549
1556
+ skin 1499 joint0 0.377451 joint1 0.622549
1557
+ skin 1500 joint0 0.350257 joint1 0.649743
1558
+ skin 1501 joint0 0.350257 joint1 0.649743
1559
+ skin 1502 joint0 0.617050 joint1 0.382950
1560
+ skin 1503 joint0 0.580870 joint1 0.419130
1561
+ skin 1504 joint0 0.580870 joint1 0.419130
1562
+ skin 1505 joint0 0.580870 joint1 0.419130
1563
+ skin 1506 joint0 1.000000
1564
+ skin 1507 joint0 1.000000
1565
+ skin 1508 joint0 1.000000
1566
+ skin 1509 joint20 0.570479 joint21 0.429521
1567
+ skin 1510 joint0 1.000000
1568
+ skin 1511 joint0 1.000000
1569
+ skin 1512 joint0 1.000000
1570
+ skin 1513 joint0 1.000000
1571
+ skin 1514 joint0 1.000000
1572
+ skin 1515 joint0 1.000000
1573
+ skin 1516 joint0 1.000000
1574
+ skin 1517 joint21 1.000000
1575
+ skin 1518 joint22 0.599594 joint24 0.400406
1576
+ skin 1519 joint22 0.733306 joint24 0.266694
1577
+ skin 1520 joint22 0.733306 joint24 0.266694
1578
+ skin 1521 joint20 0.715764 joint21 0.284236
1579
+ skin 1522 joint20 0.646850 joint21 0.353150
1580
+ skin 1523 joint20 0.556838 joint21 0.443162
1581
+ skin 1524 joint20 0.481111 joint21 0.518889
1582
+ skin 1525 joint20 0.481111 joint21 0.518889
1583
+ skin 1526 joint20 0.414032 joint21 0.585968
1584
+ skin 1527 joint20 0.363934 joint21 0.636066
1585
+ skin 1528 joint20 0.390984 joint21 0.609016
1586
+ skin 1529 joint20 0.396577 joint21 0.603423
1587
+ skin 1530 joint20 0.503268 joint21 0.496732
1588
+ skin 1531 joint21 1.000000
1589
+ skin 1532 joint20 0.294558 joint21 0.705442
1590
+ skin 1533 joint21 1.000000
1591
+ skin 1534 joint21 1.000000
1592
+ skin 1535 joint21 1.000000
1593
+ skin 1536 joint20 0.320115 joint21 0.679885
1594
+ skin 1537 joint20 0.320115 joint21 0.679885
1595
+ skin 1538 joint20 0.521212 joint21 0.478788
1596
+ skin 1539 joint20 0.519126 joint21 0.480874
1597
+ skin 1540 joint20 0.400135 joint21 0.599865
1598
+ skin 1541 joint21 1.000000
1599
+ skin 1542 joint21 0.634182 joint22 0.365818
1600
+ skin 1543 joint21 0.482324 joint22 0.517676
1601
+ skin 1544 joint21 0.604701 joint22 0.395299
1602
+ skin 1545 joint21 0.604701 joint22 0.395299
1603
+ skin 1546 joint21 0.652862 joint22 0.347138
1604
+ skin 1547 joint21 1.000000
1605
+ skin 1548 joint21 0.738959 joint22 0.261041
1606
+ skin 1549 joint21 1.000000
1607
+ skin 1550 joint21 1.000000
1608
+ skin 1551 joint21 0.616759 joint22 0.383241
1609
+ skin 1552 joint21 0.611662 joint22 0.388338
1610
+ skin 1553 joint21 0.531557 joint22 0.468443
1611
+ skin 1554 joint21 0.537278 joint22 0.462722
1612
+ skin 1555 joint21 0.375682 joint22 0.624318
1613
+ skin 1556 joint21 0.468762 joint22 0.531238
1614
+ skin 1557 joint21 0.468762 joint22 0.531238
1615
+ skin 1558 joint21 0.482324 joint22 0.517676
1616
+ skin 1559 joint22 1.000000
1617
+ skin 1560 joint21 0.332516 joint22 0.667484
1618
+ skin 1561 joint22 0.680615 joint24 0.319385
1619
+ skin 1562 joint22 0.451232 joint24 0.548768
1620
+ skin 1563 joint22 0.311131 joint24 0.688869
1621
+ skin 1564 joint22 0.311131 joint24 0.688869
1622
+ skin 1565 joint22 0.436032 joint24 0.563968
1623
+ skin 1566 joint22 0.412096 joint24 0.587904
1624
+ skin 1567 joint22 0.506767 joint24 0.493233
1625
+ skin 1568 joint22 0.707959 joint24 0.292041
1626
+ skin 1569 joint22 0.707959 joint24 0.292041
1627
+ skin 1570 joint22 0.707959 joint24 0.292041
1628
+ skin 1571 joint22 0.733306 joint24 0.266694
1629
+ skin 1572 joint22 0.680615 joint24 0.319385
1630
+ skin 1573 joint22 0.680615 joint24 0.319385
1631
+ skin 1574 joint22 0.553404 joint24 0.446596
1632
+ skin 1575 joint22 0.553404 joint24 0.446596
1633
+ skin 1576 joint22 0.589640 joint24 0.410360
1634
+ skin 1577 joint22 0.589640 joint24 0.410360
1635
+ skin 1578 joint22 0.589640 joint24 0.410360
1636
+ skin 1579 joint22 0.561199 joint24 0.438801
1637
+ skin 1580 joint22 0.561199 joint24 0.438801
1638
+ skin 1581 joint22 0.561199 joint24 0.438801
1639
+ skin 1582 joint22 0.576066 joint24 0.423934
1640
+ skin 1583 joint22 0.576066 joint24 0.423934
1641
+ skin 1584 joint22 1.000000
1642
+ skin 1585 joint22 1.000000
1643
+ skin 1586 joint22 1.000000
1644
+ skin 1587 joint22 1.000000
1645
+ skin 1588 joint22 1.000000
1646
+ skin 1589 joint22 1.000000
1647
+ skin 1590 joint22 1.000000
1648
+ skin 1591 joint22 1.000000
1649
+ skin 1592 joint22 1.000000
1650
+ skin 1593 joint10 0.577050 joint11 0.422950
1651
+ skin 1594 joint11 1.000000
1652
+ skin 1595 joint11 0.290575 joint13 0.709425
1653
+ skin 1596 joint13 1.000000
1654
+ skin 1597 joint13 1.000000
1655
+ skin 1598 joint10 0.680577 joint11 0.319423
1656
+ skin 1599 joint10 0.681571 joint11 0.318429
1657
+ skin 1600 joint10 0.700064 joint11 0.299936
1658
+ skin 1601 joint10 1.000000
1659
+ skin 1602 joint10 0.658223 joint11 0.341777
1660
+ skin 1603 joint10 0.658223 joint11 0.341777
1661
+ skin 1604 joint10 0.437121 joint11 0.171487 joint14 0.391392
1662
+ skin 1605 joint10 0.424377 joint11 0.276536 joint14 0.299087
1663
+ skin 1606 joint10 0.363619 joint11 0.347571 joint14 0.288810
1664
+ skin 1607 joint10 0.355567 joint11 0.246112 joint14 0.398321
1665
+ skin 1608 joint11 1.000000
1666
+ skin 1609 joint10 0.333022 joint11 0.666978
1667
+ skin 1610 joint10 0.361863 joint11 0.638137
1668
+ skin 1611 joint10 0.335154 joint11 0.664846
1669
+ skin 1612 joint11 1.000000
1670
+ skin 1613 joint11 1.000000
1671
+ skin 1614 joint11 1.000000
1672
+ skin 1615 joint11 1.000000
1673
+ skin 1616 joint11 1.000000
1674
+ skin 1617 joint11 1.000000
1675
+ skin 1618 joint13 1.000000
1676
+ skin 1619 joint13 1.000000
1677
+ skin 1620 joint11 0.369040 joint13 0.630960
1678
+ skin 1621 joint13 1.000000
1679
+ skin 1622 joint11 0.333712 joint13 0.666288
1680
+ skin 1623 joint11 0.333712 joint13 0.666288
1681
+ skin 1624 joint13 1.000000
1682
+ skin 1625 joint11 0.620660 joint13 0.379340
1683
+ skin 1626 joint11 0.445168 joint13 0.554832
1684
+ skin 1627 joint11 0.416899 joint13 0.583101
1685
+ skin 1628 joint13 1.000000
1686
+ skin 1629 joint13 1.000000
1687
+ skin 1630 joint13 1.000000
1688
+ skin 1631 joint13 1.000000
1689
+ skin 1632 joint13 1.000000
1690
+ skin 1633 joint13 1.000000
1691
+ skin 1634 joint13 1.000000
1692
+ skin 1635 joint6 0.320629 joint13 0.679371
1693
+ skin 1636 joint6 0.320629 joint13 0.679371
1694
+ skin 1637 joint13 1.000000
1695
+ skin 1638 joint13 1.000000
1696
+ skin 1639 joint13 1.000000
1697
+ skin 1640 joint6 0.276059 joint13 0.723941
1698
+ skin 1641 joint6 0.276059 joint13 0.723941
1699
+ skin 1642 joint6 0.276059 joint13 0.723941
1700
+ skin 1643 joint13 1.000000
1701
+ skin 1644 joint13 1.000000
1702
+ skin 1645 joint13 1.000000
1703
+ skin 1646 joint13 1.000000
1704
+ skin 1647 joint13 1.000000
1705
+ skin 1648 joint13 1.000000
1706
+ skin 1649 joint0 1.000000
1707
+ skin 1650 joint0 0.262984 joint1 0.737016
1708
+ skin 1651 joint1 1.000000
1709
+ skin 1652 joint1 1.000000
1710
+ skin 1653 joint0 0.260180 joint1 0.739820
1711
+ skin 1654 joint4 0.512587 joint10 0.487413
1712
+ skin 1655 joint4 0.406819 joint10 0.593181
1713
+ skin 1656 joint4 0.435487 joint10 0.564513
1714
+ skin 1657 joint1 1.000000
1715
+ skin 1658 joint4 0.615079 joint10 0.384921
1716
+ skin 1659 joint4 0.603936 joint10 0.396064
1717
+ skin 1660 joint4 0.614773 joint10 0.385227
1718
+ skin 1661 joint4 0.602348 joint10 0.397652
1719
+ skin 1662 joint4 0.489159 joint10 0.510841
1720
+ skin 1663 joint2 0.411935 joint3 0.588065
1721
+ skin 1664 joint2 0.417499 joint3 0.582501
1722
+ skin 1665 joint2 0.417499 joint3 0.582501
1723
+ skin 1666 joint4 0.521773 joint10 0.478227
1724
+ skin 1667 joint4 0.521773 joint10 0.478227
1725
+ skin 1668 joint2 0.322339 joint3 0.677661
1726
+ skin 1669 joint2 0.406704 joint3 0.593296
1727
+ skin 1670 joint3 0.420692 joint4 0.579308
1728
+ skin 1671 joint3 0.400532 joint4 0.599468
1729
+ skin 1672 joint3 0.433178 joint4 0.566822
1730
+ skin 1673 joint3 0.405745 joint4 0.594255
1731
+ skin 1674 joint24 1.000000
1732
+ skin 1675 joint24 1.000000
1733
+ skin 1676 joint24 1.000000
1734
+ skin 1677 joint24 1.000000
1735
+ skin 1678 joint24 1.000000
1736
+ skin 1679 joint24 1.000000
1737
+ skin 1680 joint24 1.000000
1738
+ skin 1681 joint24 1.000000
1739
+ skin 1682 joint24 1.000000
1740
+ skin 1683 joint24 1.000000
1741
+ skin 1684 joint24 1.000000
1742
+ skin 1685 joint24 1.000000
1743
+ skin 1686 joint24 1.000000
1744
+ skin 1687 joint24 1.000000
1745
+ skin 1688 joint24 1.000000
1746
+ skin 1689 joint24 1.000000
1747
+ skin 1690 joint1 1.000000
1748
+ skin 1691 joint3 0.361145 joint4 0.638855
1749
+ skin 1692 joint4 0.521773 joint10 0.478227
1750
+ skin 1693 joint4 0.521773 joint10 0.478227
1751
+ skin 1694 joint3 0.614084 joint4 0.385916
1752
+ skin 1695 joint3 0.382379 joint4 0.617621
1753
+ skin 1696 joint4 0.283513 joint10 0.716487
1754
+ skin 1697 joint10 1.000000
1755
+ skin 1698 joint10 1.000000
1756
+ skin 1699 joint24 1.000000
1757
+ skin 1700 joint24 1.000000
1758
+ skin 1701 joint24 1.000000
1759
+ skin 1702 joint24 1.000000
1760
+ skin 1703 joint24 1.000000
1761
+ skin 1704 joint24 1.000000
1762
+ skin 1705 joint24 1.000000
1763
+ skin 1706 joint24 1.000000
1764
+ skin 1707 joint24 1.000000
1765
+ skin 1708 joint24 1.000000
1766
+ skin 1709 joint24 1.000000
1767
+ skin 1710 joint24 1.000000
1768
+ skin 1711 joint24 1.000000
1769
+ skin 1712 joint24 1.000000
1770
+ skin 1713 joint24 1.000000
1771
+ skin 1714 joint24 1.000000
1772
+ skin 1715 joint24 1.000000
1773
+ skin 1716 joint24 1.000000
1774
+ skin 1717 joint24 1.000000
1775
+ skin 1718 joint24 1.000000
1776
+ skin 1719 joint24 1.000000
1777
+ skin 1720 joint24 1.000000
1778
+ skin 1721 joint0 0.711223 joint1 0.288777
1779
+ skin 1722 joint0 0.639444 joint1 0.360556
1780
+ skin 1723 joint0 0.540201 joint1 0.459799
1781
+ skin 1724 joint24 1.000000
1782
+ skin 1725 joint24 1.000000
1783
+ skin 1726 joint24 1.000000
1784
+ skin 1727 joint24 1.000000
1785
+ skin 1728 joint24 1.000000
1786
+ skin 1729 joint24 1.000000
1787
+ skin 1730 joint24 1.000000
1788
+ skin 1731 joint24 1.000000
1789
+ skin 1732 joint24 1.000000
1790
+ skin 1733 joint24 1.000000
1791
+ skin 1734 joint0 0.623245 joint1 0.376755
1792
+ skin 1735 joint0 0.556052 joint1 0.443948
1793
+ skin 1736 joint3 0.652752 joint4 0.347248
1794
+ skin 1737 joint3 0.579789 joint4 0.420211
1795
+ skin 1738 joint3 0.706025 joint4 0.293975
1796
+ skin 1739 joint24 1.000000
1797
+ skin 1740 joint24 1.000000
1798
+ skin 1741 joint24 1.000000
1799
+ skin 1742 joint24 1.000000
1800
+ skin 1743 joint24 1.000000
1801
+ skin 1744 joint24 1.000000
1802
+ skin 1745 joint24 1.000000
1803
+ skin 1746 joint24 1.000000
1804
+ skin 1747 joint1 0.604500 joint2 0.395500
1805
+ skin 1748 joint1 0.624055 joint2 0.375945
1806
+ skin 1749 joint1 0.621038 joint2 0.378963
1807
+ skin 1750 joint1 0.542092 joint2 0.457908
1808
+ skin 1751 joint1 0.379593 joint2 0.620407
1809
+ skin 1752 joint1 0.555733 joint2 0.444267
1810
+ skin 1753 joint3 0.710241 joint4 0.289759
1811
+ skin 1754 joint3 0.620826 joint4 0.379174
1812
+ skin 1755 joint24 1.000000
1813
+ skin 1756 joint24 1.000000
1814
+ skin 1757 joint24 1.000000
1815
+ skin 1758 joint24 1.000000
1816
+ skin 1759 joint24 1.000000
1817
+ skin 1760 joint24 1.000000
1818
+ skin 1761 joint24 1.000000
1819
+ skin 1762 joint24 1.000000
1820
+ skin 1763 joint24 1.000000
1821
+ skin 1764 joint24 1.000000
1822
+ skin 1765 joint24 1.000000
1823
+ skin 1766 joint24 1.000000
1824
+ skin 1767 joint24 1.000000
1825
+ skin 1768 joint24 1.000000
1826
+ skin 1769 joint24 1.000000
1827
+ skin 1770 joint24 1.000000
1828
+ skin 1771 joint24 1.000000
1829
+ skin 1772 joint24 1.000000
1830
+ skin 1773 joint24 1.000000
1831
+ skin 1774 joint24 1.000000
1832
+ skin 1775 joint24 1.000000
1833
+ skin 1776 joint24 1.000000
1834
+ skin 1777 joint24 1.000000
1835
+ skin 1778 joint24 1.000000
1836
+ skin 1779 joint24 1.000000
1837
+ skin 1780 joint24 1.000000
1838
+ skin 1781 joint24 1.000000
1839
+ skin 1782 joint24 1.000000
1840
+ skin 1783 joint24 1.000000
1841
+ skin 1784 joint24 1.000000
1842
+ skin 1785 joint24 1.000000
1843
+ skin 1786 joint24 1.000000
1844
+ skin 1787 joint24 1.000000
1845
+ skin 1788 joint24 1.000000
1846
+ skin 1789 joint24 1.000000
1847
+ skin 1790 joint24 1.000000
1848
+ skin 1791 joint24 1.000000
1849
+ skin 1792 joint24 1.000000
1850
+ skin 1793 joint24 1.000000
1851
+ skin 1794 joint24 1.000000
1852
+ skin 1795 joint24 1.000000
1853
+ skin 1796 joint24 1.000000
1854
+ skin 1797 joint24 1.000000
1855
+ skin 1798 joint24 1.000000
1856
+ skin 1799 joint24 1.000000
1857
+ skin 1800 joint24 1.000000
1858
+ skin 1801 joint24 1.000000
1859
+ skin 1802 joint24 1.000000
1860
+ skin 1803 joint1 1.000000
1861
+ skin 1804 joint24 1.000000
1862
+ skin 1805 joint1 1.000000
1863
+ skin 1806 joint1 1.000000
1864
+ skin 1807 joint1 1.000000
1865
+ skin 1808 joint24 1.000000
1866
+ skin 1809 joint24 1.000000
1867
+ skin 1810 joint24 1.000000
1868
+ skin 1811 joint24 1.000000
1869
+ skin 1812 joint24 1.000000
1870
+ skin 1813 joint24 1.000000
1871
+ skin 1814 joint24 1.000000
1872
+ skin 1815 joint24 1.000000
1873
+ skin 1816 joint24 1.000000
1874
+ skin 1817 joint24 1.000000
1875
+ skin 1818 joint24 1.000000
1876
+ skin 1819 joint24 1.000000
1877
+ skin 1820 joint24 1.000000
1878
+ skin 1821 joint24 1.000000
1879
+ skin 1822 joint24 1.000000
1880
+ skin 1823 joint24 1.000000
1881
+ skin 1824 joint24 1.000000
1882
+ skin 1825 joint24 1.000000
1883
+ skin 1826 joint24 1.000000
1884
+ skin 1827 joint24 1.000000
1885
+ skin 1828 joint24 1.000000
1886
+ skin 1829 joint24 1.000000
1887
+ skin 1830 joint24 1.000000
1888
+ skin 1831 joint24 1.000000
1889
+ skin 1832 joint24 1.000000
1890
+ skin 1833 joint24 1.000000
1891
+ skin 1834 joint24 1.000000
1892
+ skin 1835 joint24 1.000000
1893
+ skin 1836 joint24 1.000000
1894
+ skin 1837 joint22 0.464755 joint24 0.535245
1895
+ skin 1838 joint22 0.422253 joint24 0.577747
1896
+ skin 1839 joint22 0.484273 joint24 0.515727
1897
+ skin 1840 joint22 0.484273 joint24 0.515727
1898
+ skin 1841 joint24 1.000000
1899
+ skin 1842 joint24 1.000000
1900
+ skin 1843 joint24 1.000000
1901
+ skin 1844 joint24 1.000000
1902
+ skin 1845 joint24 1.000000
1903
+ skin 1846 joint24 1.000000
1904
+ skin 1847 joint24 1.000000
1905
+ skin 1848 joint24 1.000000
1906
+ skin 1849 joint24 1.000000
1907
+ skin 1850 joint22 0.389717 joint24 0.610283
1908
+ skin 1851 joint24 1.000000
1909
+ skin 1852 joint24 1.000000
1910
+ skin 1853 joint24 1.000000
1911
+ skin 1854 joint24 1.000000
1912
+ skin 1855 joint24 1.000000
1913
+ skin 1856 joint24 1.000000
1914
+ skin 1857 joint24 1.000000
1915
+ skin 1858 joint24 1.000000
1916
+ skin 1859 joint24 1.000000
1917
+ skin 1860 joint24 1.000000
1918
+ skin 1861 joint24 1.000000
1919
+ skin 1862 joint24 1.000000
1920
+ skin 1863 joint22 0.402314 joint24 0.597686
1921
+ skin 1864 joint24 1.000000
1922
+ skin 1865 joint24 1.000000
1923
+ skin 1866 joint22 0.312778 joint24 0.687222
1924
+ skin 1867 joint22 0.445781 joint24 0.554219
1925
+ skin 1868 joint22 0.599594 joint24 0.400406
1926
+ skin 1869 joint22 0.517124 joint24 0.482876
1927
+ skin 1870 joint13 1.000000
1928
+ skin 1871 joint13 1.000000
1929
+ skin 1872 joint13 1.000000
1930
+ skin 1873 joint13 1.000000
1931
+ skin 1874 joint13 1.000000
1932
+ skin 1875 joint13 1.000000
1933
+ skin 1876 joint13 1.000000
1934
+ skin 1877 joint13 1.000000
1935
+ skin 1878 joint13 1.000000
1936
+ skin 1879 joint13 1.000000
1937
+ skin 1880 joint13 1.000000
1938
+ skin 1881 joint1 1.000000
1939
+ skin 1882 joint4 0.627569 joint10 0.372431
1940
+ skin 1883 joint21 0.349019 joint22 0.650981
1941
+ skin 1884 joint22 1.000000
1942
+ skin 1885 joint22 1.000000
1943
+ skin 1886 joint22 1.000000
1944
+ skin 1887 joint22 1.000000
1945
+ skin 1888 joint22 1.000000
1946
+ skin 1889 joint22 1.000000
1947
+ skin 1890 joint22 1.000000
1948
+ skin 1891 joint22 1.000000
1949
+ skin 1892 joint21 0.289746 joint22 0.710254
1950
+ skin 1893 joint21 0.331204 joint22 0.668796
1951
+ skin 1894 joint6 0.338228 joint13 0.661772
1952
+ skin 1895 joint6 0.338228 joint13 0.661772
1953
+ skin 1896 joint6 0.283203 joint13 0.716797
1954
+ skin 1897 joint6 0.278910 joint8 0.721090
1955
+ skin 1898 joint6 0.278910 joint8 0.721090
1956
+ skin 1899 joint8 1.000000
1957
+ skin 1900 joint8 1.000000
1958
+ skin 1901 joint8 1.000000
1959
+ skin 1902 joint8 1.000000
1960
+ skin 1903 joint8 1.000000
1961
+ skin 1904 joint8 1.000000
1962
+ skin 1905 joint6 0.539860 joint8 0.460140
1963
+ skin 1906 joint6 0.444216 joint13 0.555784
1964
+ skin 1907 joint6 0.582688 joint13 0.417312
1965
+ skin 1908 joint6 0.476989 joint8 0.523011
1966
+ skin 1909 joint6 0.476989 joint8 0.523011
1967
+ skin 1910 joint8 1.000000
1968
+ skin 1911 joint8 1.000000
1969
+ skin 1912 joint6 0.388587 joint8 0.611413
1970
+ skin 1913 joint8 1.000000
1971
+ skin 1914 joint6 1.000000
1972
+ skin 1915 joint8 1.000000
1973
+ skin 1916 joint8 1.000000
1974
+ skin 1917 joint6 0.620252 joint13 0.379748
1975
+ skin 1918 joint6 0.521744 joint8 0.478256
1976
+ skin 1919 joint6 0.476989 joint8 0.523011
1977
+ skin 1920 joint8 1.000000
1978
+ skin 1921 joint8 1.000000
1979
+ skin 1922 joint8 1.000000
1980
+ skin 1923 joint6 0.471003 joint13 0.528997
1981
+ skin 1924 joint6 1.000000
1982
+ skin 1925 joint6 0.725595 joint8 0.274405
1983
+ skin 1926 joint6 0.725595 joint8 0.274405
1984
+ skin 1927 joint6 1.000000
1985
+ skin 1928 joint6 1.000000
1986
+ skin 1929 joint6 1.000000
1987
+ skin 1930 joint6 1.000000
1988
+ skin 1931 joint6 1.000000
1989
+ skin 1932 joint6 1.000000
1990
+ skin 1933 joint6 0.663092 joint13 0.336908
1991
+ skin 1934 joint6 0.663092 joint13 0.336908
1992
+ skin 1935 joint6 0.639587 joint13 0.360413
1993
+ skin 1936 joint6 0.639587 joint13 0.360413
1994
+ skin 1937 joint6 1.000000
1995
+ skin 1938 joint6 0.644948 joint8 0.355052
1996
+ skin 1939 joint6 0.644948 joint8 0.355052
1997
+ skin 1940 joint6 1.000000
1998
+ skin 1941 joint6 0.360567 joint8 0.639433
1999
+ skin 1942 joint8 1.000000
2000
+ skin 1943 joint8 1.000000
2001
+ skin 1944 joint6 0.305065 joint8 0.694935
2002
+ skin 1945 joint6 1.000000
2003
+ skin 1946 joint6 1.000000
2004
+ skin 1947 joint6 0.668396 joint8 0.331604
2005
+ skin 1948 joint6 1.000000
2006
+ skin 1949 joint6 0.668396 joint8 0.331604
2007
+ skin 1950 joint6 1.000000
2008
+ skin 1951 joint6 0.541735 joint8 0.458265
2009
+ skin 1952 joint6 1.000000
2010
+ skin 1953 joint8 1.000000
2011
+ skin 1954 joint8 1.000000
2012
+ skin 1955 joint6 0.720830 joint8 0.279170
2013
+ skin 1956 joint6 0.720830 joint8 0.279170
2014
+ skin 1957 joint6 0.668396 joint8 0.331604
2015
+ skin 1958 joint6 1.000000
2016
+ skin 1959 joint8 1.000000
2017
+ skin 1960 joint8 1.000000
2018
+ skin 1961 joint8 1.000000
2019
+ skin 1962 joint8 1.000000
2020
+ skin 1963 joint8 1.000000
2021
+ skin 1964 joint8 1.000000
2022
+ skin 1965 joint6 0.435757 joint8 0.564243
2023
+ skin 1966 joint6 0.265798 joint8 0.734202
2024
+ skin 1967 joint6 0.731046 joint8 0.268954
2025
+ skin 1968 joint6 1.000000
2026
+ skin 1969 joint6 0.691361 joint8 0.308639
2027
+ skin 1970 joint8 1.000000
2028
+ skin 1971 joint8 1.000000
2029
+ skin 1972 joint8 1.000000
2030
+ skin 1973 joint8 1.000000
2031
+ skin 1974 joint8 1.000000
2032
+ skin 1975 joint6 0.403771 joint8 0.596229
2033
+ skin 1976 joint6 0.403771 joint8 0.596229
2034
+ skin 1977 joint8 1.000000
2035
+ skin 1978 joint8 1.000000
2036
+ skin 1979 joint8 1.000000
2037
+ skin 1980 joint8 1.000000
2038
+ skin 1981 joint6 0.625494 joint13 0.374506
2039
+ skin 1982 joint6 0.625494 joint13 0.374506
2040
+ skin 1983 joint6 0.613941 joint13 0.386059
2041
+ skin 1984 joint6 0.692873 joint13 0.307127
2042
+ skin 1985 joint15 0.368591 joint16 0.631409
2043
+ skin 1986 joint15 0.387886 joint16 0.612114
2044
+ skin 1987 joint10 0.224626 joint14 0.487000 joint15 0.288373
2045
+ skin 1988 joint11 0.266462 joint14 0.375855 joint15 0.357684
2046
+ skin 1989 joint15 0.381174 joint16 0.618826
2047
+ skin 1990 joint16 0.332754 joint20 0.348070 joint21 0.319176
2048
+ skin 1991 joint16 0.193539 joint20 0.486649 joint21 0.319812
2049
+ skin 1992 joint14 0.465451 joint15 0.534549
2050
+ skin 1993 joint20 1.000000
2051
+ skin 1994 joint20 1.000000
2052
+ skin 1995 joint15 0.508063 joint16 0.491937
2053
+ skin 1996 joint16 0.732862 joint20 0.267138
2054
+ skin 1997 joint15 0.556579 joint16 0.443421
2055
+ skin 1998 joint15 0.351211 joint16 0.648789
2056
+ skin 1999 joint14 0.456892 joint15 0.543108
2057
+ skin 2000 joint10 0.257995 joint14 0.549432 joint15 0.192572
2058
+ skin 2001 joint10 0.648769 joint14 0.351231
2059
+ skin 2002 joint10 0.722845 joint11 0.277155
2060
+ skin 2003 joint10 1.000000
2061
+ skin 2004 joint10 1.000000
2062
+ skin 2005 joint10 0.728952 joint11 0.271048
2063
+ skin 2006 joint10 1.000000
2064
+ skin 2007 joint10 1.000000
2065
+ skin 2008 joint10 1.000000
2066
+ skin 2009 joint10 1.000000
2067
+ skin 2010 joint10 1.000000
2068
+ skin 2011 joint10 1.000000
2069
+ skin 2012 joint10 0.459242 joint14 0.540758
2070
+ skin 2013 joint10 0.208439 joint14 0.497395 joint15 0.294166
2071
+ skin 2014 joint10 0.218886 joint14 0.510845 joint15 0.270269
2072
+ skin 2015 joint15 0.390695 joint16 0.609305
2073
+ skin 2016 joint15 0.454478 joint16 0.545522
2074
+ skin 2017 joint16 0.366870 joint20 0.248091 joint21 0.385039
2075
+ skin 2018 joint20 0.446168 joint21 0.553832
2076
+ skin 2019 joint16 0.195849 joint20 0.426099 joint21 0.378052
2077
+ skin 2020 joint16 0.195849 joint20 0.426099 joint21 0.378052
2078
+ skin 2021 joint16 0.238347 joint20 0.401600 joint21 0.168452 joint23 0.191602
2079
+ skin 2022 joint16 0.628525 joint20 0.371475
2080
+ skin 2023 joint16 0.347705 joint20 0.652295
2081
+ skin 2024 joint16 0.206324 joint20 0.445057 joint23 0.348619
2082
+ skin 2025 joint16 0.559325 joint23 0.440675
2083
+ skin 2026 joint16 0.327765 joint23 0.672235
2084
+ skin 2027 joint16 1.000000
2085
+ skin 2028 joint1 1.000000
2086
+ skin 2029 joint14 0.415117 joint15 0.584883
2087
+ skin 2030 joint14 1.000000
2088
+ skin 2031 joint10 0.456116 joint14 0.543884
2089
+ skin 2032 joint10 0.634234 joint14 0.365766
2090
+ skin 2033 joint10 1.000000
2091
+ skin 2034 joint10 0.667443 joint14 0.332557
2092
+ skin 2035 joint20 0.368826 joint23 0.298808 joint26 0.332366
2093
+ skin 2036 joint20 0.191632 joint23 0.282758 joint26 0.525610
2094
+ skin 2037 joint20 1.000000
2095
+ skin 2038 joint20 0.315841 joint23 0.277438 joint26 0.406722
2096
+ skin 2039 joint20 0.430585 joint23 0.387954 joint26 0.181460
2097
+ skin 2040 joint23 0.450581 joint26 0.549419
2098
+ skin 2041 joint23 0.658962 joint26 0.341038
2099
+ skin 2042 joint23 0.619674 joint26 0.380326
2100
+ skin 2043 joint23 0.560156 joint26 0.439845
2101
+ skin 2044 joint20 0.734746 joint23 0.265254
2102
+ skin 2045 joint20 0.404175 joint23 0.329071 joint26 0.266754
2103
+ skin 2046 joint23 0.369979 joint26 0.630021
2104
+ skin 2047 joint16 0.179946 joint20 0.220658 joint23 0.332837 joint26 0.266560
2105
+ skin 2048 joint27 1.000000
2106
+ skin 2049 joint27 1.000000
2107
+ skin 2050 joint26 0.308360 joint27 0.691640
2108
+ skin 2051 joint26 0.308360 joint27 0.691640
2109
+ skin 2052 joint26 0.449192 joint27 0.550808
2110
+ skin 2053 joint26 0.449192 joint27 0.550808
2111
+ skin 2054 joint26 0.532866 joint27 0.467134
2112
+ skin 2055 joint26 0.532866 joint27 0.467134
2113
+ skin 2056 joint26 0.470288 joint27 0.529712
2114
+ skin 2057 joint26 0.470288 joint27 0.529712
2115
+ skin 2058 joint26 0.394216 joint27 0.605784
2116
+ skin 2059 joint26 0.394216 joint27 0.605784
2117
+ skin 2060 joint26 0.266494 joint27 0.733506
2118
+ skin 2061 joint26 0.266494 joint27 0.733506
2119
+ skin 2062 joint27 1.000000
2120
+ skin 2063 joint27 1.000000
2121
+ skin 2064 joint27 1.000000
2122
+ skin 2065 joint27 1.000000
2123
+ skin 2066 joint27 1.000000
2124
+ skin 2067 joint26 0.390937 joint27 0.609063
2125
+ skin 2068 joint26 0.390937 joint27 0.609063
2126
+ skin 2069 joint26 0.390937 joint27 0.609063
2127
+ skin 2070 joint26 0.355879 joint27 0.644121
2128
+ skin 2071 joint27 1.000000
2129
+ skin 2072 joint26 0.595508 joint27 0.404492
2130
+ skin 2073 joint26 0.575541 joint27 0.424459
2131
+ skin 2074 joint26 1.000000
2132
+ skin 2075 joint26 1.000000
2133
+ skin 2076 joint26 1.000000
2134
+ skin 2077 joint26 1.000000
2135
+ skin 2078 joint26 0.632559 joint27 0.367441
2136
+ skin 2079 joint26 1.000000
2137
+ skin 2080 joint26 0.587610 joint27 0.412390
2138
+ skin 2081 joint26 0.587610 joint27 0.412390
2139
+ skin 2082 joint26 0.555829 joint27 0.444171
2140
+ skin 2083 joint26 0.562486 joint27 0.437514
2141
+ skin 2084 joint26 0.595508 joint27 0.404492
2142
+ skin 2085 joint26 1.000000
2143
+ skin 2086 joint26 0.270800 joint27 0.729200
2144
+ skin 2087 joint26 0.483579 joint27 0.516421
2145
+ skin 2088 joint26 0.332141 joint27 0.667859
2146
+ skin 2089 joint26 0.332141 joint27 0.667859
2147
+ skin 2090 joint26 0.431245 joint27 0.568755
2148
+ skin 2091 joint26 0.587235 joint27 0.412765
2149
+ skin 2092 joint26 0.578489 joint27 0.421511
2150
+ skin 2093 joint26 0.670144 joint27 0.329856
2151
+ skin 2094 joint26 0.612061 joint27 0.387939
2152
+ skin 2095 joint26 1.000000
2153
+ skin 2096 joint26 1.000000
2154
+ skin 2097 joint23 0.259785 joint26 0.740215
2155
+ skin 2098 joint26 1.000000
2156
+ skin 2099 joint27 1.000000
2157
+ skin 2100 joint27 1.000000
2158
+ skin 2101 joint27 1.000000
2159
+ skin 2102 joint27 1.000000
2160
+ skin 2103 joint27 1.000000
2161
+ skin 2104 joint27 1.000000
2162
+ skin 2105 joint27 1.000000
2163
+ skin 2106 joint27 1.000000
2164
+ skin 2107 joint27 1.000000
2165
+ skin 2108 joint27 1.000000
2166
+ skin 2109 joint27 1.000000
2167
+ skin 2110 joint27 1.000000
2168
+ skin 2111 joint27 1.000000
2169
+ skin 2112 joint27 1.000000
2170
+ skin 2113 joint27 1.000000
2171
+ skin 2114 joint27 1.000000
2172
+ skin 2115 joint27 1.000000
2173
+ skin 2116 joint27 1.000000
2174
+ skin 2117 joint27 1.000000
2175
+ skin 2118 joint27 1.000000
2176
+ skin 2119 joint27 1.000000
2177
+ skin 2120 joint27 1.000000
2178
+ skin 2121 joint27 1.000000
2179
+ skin 2122 joint27 1.000000
2180
+ skin 2123 joint27 1.000000
2181
+ skin 2124 joint27 1.000000
2182
+ skin 2125 joint27 1.000000
2183
+ skin 2126 joint27 1.000000
2184
+ skin 2127 joint27 1.000000
2185
+ skin 2128 joint27 1.000000
2186
+ skin 2129 joint27 1.000000
2187
+ skin 2130 joint27 1.000000
2188
+ skin 2131 joint27 1.000000
2189
+ skin 2132 joint26 1.000000
2190
+ skin 2133 joint26 1.000000
2191
+ skin 2134 joint26 0.725130 joint27 0.274870
2192
+ skin 2135 joint26 0.731262 joint27 0.268738
2193
+ skin 2136 joint26 0.400097 joint27 0.599903
2194
+ skin 2137 joint26 0.400097 joint27 0.599903
2195
+ skin 2138 joint26 0.608601 joint27 0.391399
2196
+ skin 2139 joint26 0.608601 joint27 0.391399
2197
+ skin 2140 joint26 0.449899 joint27 0.550101
2198
+ skin 2141 joint26 1.000000
2199
+ skin 2142 joint26 1.000000
2200
+ skin 2143 joint26 1.000000
2201
+ skin 2144 joint26 1.000000
2202
+ skin 2145 joint26 1.000000
2203
+ skin 2146 joint26 1.000000
2204
+ skin 2147 joint26 1.000000
2205
+ skin 2148 joint26 1.000000
2206
+ skin 2149 joint26 1.000000
2207
+ skin 2150 joint26 1.000000
2208
+ skin 2151 joint26 1.000000
2209
+ skin 2152 joint26 1.000000
2210
+ skin 2153 joint26 1.000000
2211
+ skin 2154 joint26 1.000000
2212
+ skin 2155 joint26 1.000000
2213
+ skin 2156 joint26 1.000000
2214
+ skin 2157 joint26 1.000000
2215
+ skin 2158 joint26 1.000000
2216
+ skin 2159 joint26 1.000000
2217
+ skin 2160 joint26 1.000000
2218
+ skin 2161 joint26 1.000000
2219
+ skin 2162 joint26 1.000000
2220
+ skin 2163 joint26 1.000000
2221
+ skin 2164 joint26 1.000000
2222
+ skin 2165 joint26 1.000000
2223
+ skin 2166 joint26 1.000000
2224
+ skin 2167 joint26 1.000000
2225
+ skin 2168 joint26 1.000000
2226
+ skin 2169 joint26 1.000000
2227
+ skin 2170 joint26 1.000000
2228
+ skin 2171 joint26 1.000000
2229
+ skin 2172 joint26 1.000000
2230
+ skin 2173 joint26 1.000000
2231
+ skin 2174 joint26 1.000000
2232
+ skin 2175 joint23 0.285930 joint26 0.714070
2233
+ skin 2176 joint26 1.000000
2234
+ skin 2177 joint26 1.000000
2235
+ skin 2178 joint26 1.000000
2236
+ skin 2179 joint26 1.000000
2237
+ skin 2180 joint26 1.000000
2238
+ skin 2181 joint26 1.000000
2239
+ skin 2182 joint26 1.000000
2240
+ skin 2183 joint26 1.000000
2241
+ skin 2184 joint26 1.000000
2242
+ skin 2185 joint26 1.000000
2243
+ skin 2186 joint26 1.000000
2244
+ skin 2187 joint26 1.000000
2245
+ skin 2188 joint26 1.000000
2246
+ skin 2189 joint26 1.000000
2247
+ skin 2190 joint26 1.000000
2248
+ skin 2191 joint26 1.000000
2249
+ skin 2192 joint26 1.000000
2250
+ skin 2193 joint26 1.000000
2251
+ skin 2194 joint26 1.000000
2252
+ skin 2195 joint26 1.000000
2253
+ skin 2196 joint26 1.000000
2254
+ skin 2197 joint26 1.000000
2255
+ skin 2198 joint26 1.000000
2256
+ skin 2199 joint26 1.000000
2257
+ skin 2200 joint26 1.000000
2258
+ skin 2201 joint26 0.682304 joint27 0.317696
2259
+ skin 2202 joint26 0.660284 joint27 0.339716
2260
+ skin 2203 joint26 1.000000
2261
+ skin 2204 joint26 0.690844 joint27 0.309156
2262
+ skin 2205 joint26 0.352197 joint27 0.647803
2263
+ skin 2206 joint26 0.417139 joint27 0.582862
2264
+ skin 2207 joint26 0.446003 joint27 0.553997
2265
+ skin 2208 joint26 0.292975 joint27 0.707025
2266
+ skin 2209 joint27 1.000000
2267
+ skin 2210 joint26 0.395154 joint27 0.604846
2268
+ skin 2211 joint27 1.000000
2269
+ skin 2212 joint10 1.000000
2270
+ skin 2213 joint4 0.308849 joint10 0.691151
2271
+ skin 2214 joint4 0.299881 joint10 0.700119
2272
+ skin 2215 joint4 0.348096 joint10 0.651904
2273
+ skin 2216 joint4 0.377994 joint10 0.622006
2274
+ skin 2217 joint4 0.332323 joint10 0.667677
2275
+ skin 2218 joint4 0.395164 joint10 0.604836
2276
+ skin 2219 joint4 1.000000
2277
+ skin 2220 joint4 1.000000
2278
+ skin 2221 joint4 1.000000
2279
+ skin 2222 joint4 1.000000
2280
+ skin 2223 joint4 1.000000
2281
+ skin 2224 joint4 1.000000
2282
+ skin 2225 joint3 1.000000
2283
+ skin 2226 joint3 1.000000
2284
+ skin 2227 joint3 1.000000
2285
+ skin 2228 joint3 1.000000
2286
+ skin 2229 joint2 0.272448 joint3 0.727553
2287
+ skin 2230 joint3 1.000000
2288
+ skin 2231 joint3 1.000000
2289
+ skin 2232 joint2 0.460008 joint3 0.539992
2290
+ skin 2233 joint2 0.574443 joint3 0.425557
2291
+ skin 2234 joint2 0.598345 joint3 0.401654
2292
+ skin 2235 joint2 0.718878 joint3 0.281122
2293
+ skin 2236 joint2 0.698598 joint3 0.301402
2294
+ skin 2237 joint2 0.688397 joint3 0.311602
2295
+ skin 2238 joint1 0.285785 joint2 0.714215
2296
+ skin 2239 joint1 0.259390 joint2 0.740610
2297
+ skin 2240 joint1 0.286925 joint2 0.713075
2298
+ skin 2241 joint1 0.370112 joint2 0.629888
2299
+ skin 2242 joint1 0.341143 joint2 0.658857
2300
+ skin 2243 joint16 1.000000
2301
+ skin 2244 joint16 1.000000
2302
+ skin 2245 joint0 0.334089 joint1 0.665911
2303
+ skin 2246 joint0 0.348027 joint1 0.651973
2304
+ skin 2247 joint0 0.398704 joint1 0.601296
2305
+ skin 2248 joint0 0.398704 joint1 0.601296
2306
+ skin 2249 joint0 0.394841 joint1 0.605159
2307
+ skin 2250 joint0 0.367642 joint1 0.632358
2308
+ skin 2251 joint0 1.000000
2309
+ skin 2252 joint0 1.000000
2310
+ skin 2253 joint0 1.000000
2311
+ skin 2254 joint0 1.000000
2312
+ skin 2255 joint0 1.000000
2313
+ skin 2256 joint0 1.000000
2314
+ skin 2257 joint4 0.660916 joint10 0.339084
2315
+ skin 2258 joint4 0.705222 joint10 0.294778
2316
+ skin 2259 joint4 0.715013 joint10 0.284987
2317
+ skin 2260 joint4 0.662616 joint10 0.337384
2318
+ skin 2261 joint4 0.299916 joint10 0.700084
2319
+ skin 2262 joint4 0.299916 joint10 0.700084
2320
+ skin 2263 joint0 1.000000
2321
+ skin 2264 joint0 1.000000
2322
+ skin 2265 joint0 1.000000
2323
+ skin 2266 joint0 1.000000
2324
+ skin 2267 joint0 1.000000
2325
+ skin 2268 joint0 1.000000
2326
+ skin 2269 joint4 0.705712 joint10 0.294288
2327
+ skin 2270 joint10 1.000000
2328
+ skin 2271 joint10 1.000000
2329
+ skin 2272 joint0 1.000000
2330
+ skin 2273 joint0 1.000000
2331
+ skin 2274 joint0 1.000000
2332
+ skin 2275 joint10 1.000000
2333
+ skin 2276 joint10 1.000000
2334
+ skin 2277 joint4 0.327294 joint10 0.672706
2335
+ skin 2278 joint4 0.327294 joint10 0.672706
2336
+ skin 2279 joint10 1.000000
2337
+ skin 2280 joint10 1.000000
2338
+ skin 2281 joint10 1.000000
2339
+ skin 2282 joint26 0.455303 joint27 0.544697
2340
+ skin 2283 joint0 1.000000
2341
+ skin 2284 joint0 1.000000
2342
+ skin 2285 joint0 1.000000
2343
+ skin 2286 joint0 1.000000
2344
+ skin 2287 joint0 1.000000
2345
+ skin 2288 joint0 1.000000
2346
+ skin 2289 joint10 1.000000
2347
+ skin 2290 joint10 1.000000
2348
+ skin 2291 joint4 1.000000
2349
+ skin 2292 joint4 0.340051 joint10 0.659949
2350
+ skin 2293 joint10 1.000000
2351
+ skin 2294 joint10 1.000000
2352
+ skin 2295 joint10 1.000000
2353
+ skin 2296 joint0 1.000000
2354
+ skin 2297 joint0 1.000000
2355
+ skin 2298 joint0 1.000000
2356
+ skin 2299 joint0 1.000000
2357
+ skin 2300 joint0 1.000000
2358
+ skin 2301 joint0 1.000000
2359
+ skin 2302 joint0 1.000000
2360
+ skin 2303 joint10 1.000000
2361
+ skin 2304 joint10 1.000000
2362
+ skin 2305 joint10 1.000000
2363
+ skin 2306 joint10 1.000000
2364
+ skin 2307 joint10 0.682966 joint14 0.317034
2365
+ skin 2308 joint10 0.682966 joint14 0.317034
2366
+ skin 2309 joint4 0.294522 joint10 0.705478
2367
+ skin 2310 joint4 0.294522 joint10 0.705478
2368
+ skin 2311 joint10 0.642192 joint14 0.357808
2369
+ skin 2312 joint10 0.642192 joint14 0.357808
2370
+ skin 2313 joint10 1.000000
2371
+ skin 2314 joint0 1.000000
2372
+ skin 2315 joint0 1.000000
2373
+ skin 2316 joint0 1.000000
2374
+ skin 2317 joint0 1.000000
2375
+ skin 2318 joint0 1.000000
2376
+ skin 2319 joint0 1.000000
2377
+ skin 2320 joint0 1.000000
2378
+ skin 2321 joint0 1.000000
2379
+ skin 2322 joint0 1.000000
2380
+ skin 2323 joint0 1.000000
2381
+ skin 2324 joint10 0.530595 joint11 0.469405
2382
+ skin 2325 joint10 0.421398 joint11 0.578602
2383
+ skin 2326 joint10 0.387369 joint11 0.437670 joint14 0.174962
2384
+ skin 2327 joint10 0.481600 joint11 0.518400
2385
+ skin 2328 joint10 0.400061 joint11 0.599939
2386
+ skin 2329 joint10 0.508254 joint11 0.491746
2387
+ skin 2330 joint10 0.581836 joint11 0.418164
2388
+ skin 2331 joint10 0.581836 joint11 0.418164
2389
+ skin 2332 joint10 0.604378 joint11 0.395622
2390
+ skin 2333 joint10 0.634854 joint11 0.365146
2391
+ skin 2334 joint10 0.664536 joint11 0.335464
2392
+ skin 2335 joint11 1.000000
2393
+ skin 2336 joint10 0.279371 joint11 0.720629
2394
+ skin 2337 joint10 0.544400 joint11 0.455600
2395
+ skin 2338 joint10 0.504158 joint14 0.495842
2396
+ skin 2339 joint10 0.300614 joint14 0.699386
2397
+ skin 2340 joint11 0.274838 joint13 0.725162
2398
+ skin 2341 joint13 1.000000
2399
+ skin 2342 joint13 1.000000
2400
+ skin 2343 joint13 1.000000
2401
+ skin 2344 joint6 0.517713 joint13 0.482287
2402
+ skin 2345 joint6 0.539860 joint8 0.460140
2403
+ skin 2346 joint8 1.000000
2404
+ skin 2347 joint8 1.000000
2405
+ skin 2348 joint8 1.000000
2406
+ skin 2349 joint8 1.000000
2407
+ skin 2350 joint6 0.493220 joint13 0.506780
2408
+ skin 2351 joint14 0.604608 joint15 0.395392
2409
+ skin 2352 joint14 0.604608 joint15 0.395392
2410
+ skin 2353 joint10 0.678775 joint14 0.321225
2411
+ skin 2354 joint10 0.678775 joint14 0.321225
2412
+ skin 2355 joint14 0.714992 joint15 0.285008
2413
+ skin 2356 joint14 0.714992 joint15 0.285008
2414
+ skin 2357 joint14 1.000000
2415
+ skin 2358 joint14 1.000000
2416
+ skin 2359 joint14 0.475019 joint15 0.524981
2417
+ skin 2360 joint14 0.475019 joint15 0.524981
2418
+ skin 2361 joint10 0.350061 joint14 0.649939
2419
+ skin 2362 joint10 0.350061 joint14 0.649939
2420
+ skin 2363 joint14 0.198327 joint15 0.563025 joint16 0.238648
2421
+ skin 2364 joint14 0.198327 joint15 0.563025 joint16 0.238648
2422
+ skin 2365 joint14 0.369765 joint15 0.630235
2423
+ skin 2366 joint14 0.369765 joint15 0.630235
2424
+ skin 2367 joint14 0.538558 joint15 0.461442
2425
+ skin 2368 joint14 0.538558 joint15 0.461442
2426
+ skin 2369 joint14 0.399673 joint15 0.600327
2427
+ skin 2370 joint15 0.665318 joint16 0.334682
2428
+ skin 2371 joint15 0.665318 joint16 0.334682
2429
+ skin 2372 joint15 0.550099 joint16 0.449901
2430
+ skin 2373 joint15 0.550099 joint16 0.449901
2431
+ skin 2374 joint14 0.209828 joint15 0.552618 joint16 0.237554
2432
+ skin 2375 joint14 0.209828 joint15 0.552618 joint16 0.237554
2433
+ skin 2376 joint15 0.653134 joint16 0.346867
2434
+ skin 2377 joint15 0.537078 joint16 0.462922
2435
+ skin 2378 joint15 0.537078 joint16 0.462922
2436
+ skin 2379 joint15 0.603984 joint16 0.396016
2437
+ skin 2380 joint15 0.603984 joint16 0.396016
2438
+ skin 2381 joint15 0.682686 joint16 0.317314
2439
+ skin 2382 joint14 0.227709 joint15 0.416470 joint16 0.355820
2440
+ skin 2383 joint14 0.264255 joint15 0.417174 joint16 0.318572
2441
+ skin 2384 joint15 0.489548 joint16 0.510452
2442
+ skin 2385 joint15 0.537250 joint16 0.462750
2443
+ skin 2386 joint14 0.376300 joint15 0.623700
2444
+ skin 2387 joint14 0.376300 joint15 0.623700
2445
+ skin 2388 joint15 0.413000 joint16 0.587000
2446
+ skin 2389 joint15 0.413000 joint16 0.587000
2447
+ skin 2390 joint15 0.521173 joint16 0.478827
2448
+ skin 2391 joint15 0.521173 joint16 0.478827
2449
+ skin 2392 joint15 0.418003 joint16 0.581997
2450
+ skin 2393 joint15 0.654284 joint16 0.345716
2451
+ skin 2394 joint15 0.346536 joint16 0.653464
2452
+ skin 2395 joint15 0.346536 joint16 0.653464
2453
+ skin 2396 joint15 0.447089 joint16 0.552911
2454
+ skin 2397 joint15 0.447089 joint16 0.552911
2455
+ skin 2398 joint15 0.402224 joint16 0.597777
2456
+ skin 2399 joint15 0.402224 joint16 0.597777
2457
+ skin 2400 joint15 0.269685 joint16 0.730315
2458
+ skin 2401 joint15 0.269685 joint16 0.730315
2459
+ skin 2402 joint15 0.334696 joint16 0.665304
2460
+ skin 2403 joint15 0.560017 joint16 0.439983
2461
+ skin 2404 joint16 1.000000
2462
+ skin 2405 joint16 1.000000
2463
+ skin 2406 joint16 0.738790 joint20 0.261210
2464
+ skin 2407 joint16 0.738790 joint20 0.261210
2465
+ skin 2408 joint16 0.689273 joint20 0.310727
2466
+ skin 2409 joint16 0.689273 joint20 0.310727
2467
+ skin 2410 joint16 0.732793 joint20 0.267207
2468
+ skin 2411 joint16 0.732862 joint20 0.267138
2469
+ skin 2412 joint16 0.732862 joint20 0.267138
2470
+ skin 2413 joint16 0.572043 joint20 0.427957
2471
+ skin 2414 joint16 0.572043 joint20 0.427957
2472
+ skin 2415 joint16 0.430138 joint20 0.244822 joint23 0.325040
2473
+ skin 2416 joint16 0.430138 joint20 0.244822 joint23 0.325040
2474
+ skin 2417 joint16 0.290111 joint23 0.519334 joint26 0.190555
2475
+ skin 2418 joint16 0.290111 joint23 0.519334 joint26 0.190555
2476
+ skin 2419 joint16 0.443305 joint20 0.267189 joint23 0.289506
2477
+ skin 2420 joint16 0.209819 joint20 0.162981 joint23 0.445164 joint26 0.182037
2478
+ skin 2421 joint16 0.209819 joint20 0.162981 joint23 0.445164 joint26 0.182037
2479
+ skin 2422 joint16 0.689273 joint20 0.310727
2480
+ skin 2423 joint16 0.689273 joint20 0.310727
2481
+ skin 2424 joint16 0.243890 joint20 0.368583 joint23 0.387527
2482
+ skin 2425 joint16 0.243890 joint20 0.368583 joint23 0.387527
2483
+ skin 2426 joint23 0.700229 joint26 0.299771
2484
+ skin 2427 joint23 0.700229 joint26 0.299771
2485
+ skin 2428 joint23 0.691404 joint26 0.308596
2486
+ skin 2429 joint16 0.377554 joint20 0.408089 joint23 0.214357
2487
+ skin 2430 joint16 0.377554 joint20 0.408089 joint23 0.214357
2488
+ skin 2431 joint23 0.714060 joint26 0.285940
2489
+ skin 2432 joint23 0.714060 joint26 0.285940
2490
+ skin 2433 joint16 0.242225 joint20 0.278370 joint23 0.479405
2491
+ skin 2434 joint16 0.242225 joint20 0.278370 joint23 0.479405
2492
+ skin 2435 joint10 0.302753 joint14 0.697247
2493
+ skin 2436 joint14 1.000000
2494
+ skin 2437 joint14 1.000000
2495
+ skin 2438 joint10 0.282953 joint14 0.717047
2496
+ skin 2439 joint10 0.282953 joint14 0.717047
2497
+ skin 2440 joint10 0.624089 joint14 0.375911
2498
+ skin 2441 joint10 0.624089 joint14 0.375911
2499
+ skin 2442 joint10 0.502827 joint14 0.497173
2500
+ skin 2443 joint10 0.502827 joint14 0.497173
2501
+ skin 2444 joint10 0.567102 joint14 0.432898
2502
+ skin 2445 joint10 0.314389 joint14 0.685611
2503
+ skin 2446 joint10 0.314389 joint14 0.685611
2504
+ skin 2447 joint10 1.000000
2505
+ skin 2448 joint10 1.000000
2506
+ skin 2449 joint10 0.615498 joint14 0.384502
2507
+ skin 2450 joint10 0.615498 joint14 0.384502
2508
+ skin 2451 joint4 0.372509 joint10 0.627491
2509
+ skin 2452 joint4 0.372509 joint10 0.627491
2510
+ skin 2453 joint4 0.484312 joint10 0.515688
2511
+ skin 2454 joint4 0.484312 joint10 0.515688
2512
+ skin 2455 joint4 1.000000
2513
+ skin 2456 joint4 1.000000
2514
+ skin 2457 joint4 0.478780 joint10 0.521220
2515
+ skin 2458 joint4 0.478780 joint10 0.521220
2516
+ skin 2459 joint4 1.000000
2517
+ skin 2460 joint4 1.000000
2518
+ skin 2461 joint4 1.000000
2519
+ skin 2462 joint4 0.679538 joint10 0.320462
2520
+ skin 2463 joint4 0.679538 joint10 0.320462
2521
+ skin 2464 joint3 0.458504 joint4 0.541496
2522
+ skin 2465 joint3 0.458504 joint4 0.541496
2523
+ skin 2466 joint4 1.000000
2524
+ skin 2467 joint4 0.620606 joint10 0.379394
2525
+ skin 2468 joint4 0.478780 joint10 0.521220
2526
+ skin 2469 joint4 0.478780 joint10 0.521220
2527
+ skin 2470 joint4 1.000000
2528
+ skin 2471 joint4 1.000000
2529
+ skin 2472 joint3 0.567504 joint4 0.432496
2530
+ skin 2473 joint3 0.567504 joint4 0.432496
2531
+ skin 2474 joint4 1.000000
2532
+ skin 2475 joint4 1.000000
2533
+ skin 2476 joint3 0.385261 joint4 0.614739
2534
+ skin 2477 joint3 0.385261 joint4 0.614739
2535
+ skin 2478 joint4 1.000000
2536
+ skin 2479 joint3 0.281768 joint4 0.718232
2537
+ skin 2480 joint3 0.499582 joint4 0.500418
2538
+ skin 2481 joint3 0.499582 joint4 0.500418
2539
+ skin 2482 joint3 0.467837 joint4 0.532163
2540
+ skin 2483 joint3 0.405691 joint4 0.594309
2541
+ skin 2484 joint3 0.405691 joint4 0.594309
2542
+ skin 2485 joint3 0.586866 joint4 0.413133
2543
+ skin 2486 joint3 0.586866 joint4 0.413133
2544
+ skin 2487 joint2 1.000000
2545
+ skin 2488 joint3 0.710428 joint4 0.289572
2546
+ skin 2489 joint3 0.710428 joint4 0.289572
2547
+ skin 2490 joint3 0.710428 joint4 0.289572
2548
+ skin 2491 joint3 0.710428 joint4 0.289572
2549
+ skin 2492 joint3 1.000000
2550
+ skin 2493 joint3 1.000000
2551
+ skin 2494 joint3 1.000000
2552
+ skin 2495 joint3 1.000000
2553
+ skin 2496 joint3 1.000000
2554
+ skin 2497 joint3 1.000000
2555
+ skin 2498 joint2 0.520283 joint3 0.479717
2556
+ skin 2499 joint3 1.000000
2557
+ skin 2500 joint2 0.297081 joint3 0.702919
2558
+ skin 2501 joint2 0.297081 joint3 0.702919
2559
+ skin 2502 joint2 0.297081 joint3 0.702919
2560
+ skin 2503 joint2 0.262371 joint3 0.737629
2561
+ skin 2504 joint2 0.262371 joint3 0.737629
2562
+ skin 2505 joint2 0.262371 joint3 0.737629
2563
+ skin 2506 joint2 0.314470 joint3 0.685530
2564
+ skin 2507 joint2 0.262371 joint3 0.737629
2565
+ skin 2508 joint2 0.536357 joint3 0.463643
2566
+ skin 2509 joint2 0.536357 joint3 0.463643
2567
+ skin 2510 joint2 0.536357 joint3 0.463643
2568
+ skin 2511 joint2 0.520283 joint3 0.479717
2569
+ skin 2512 joint2 0.520283 joint3 0.479717
2570
+ skin 2513 joint2 0.520283 joint3 0.479717
2571
+ skin 2514 joint2 1.000000
2572
+ skin 2515 joint2 1.000000
2573
+ skin 2516 joint2 1.000000
2574
+ skin 2517 joint2 1.000000
2575
+ skin 2518 joint2 1.000000
2576
+ skin 2519 joint2 1.000000
2577
+ skin 2520 joint2 1.000000
2578
+ skin 2521 joint1 0.555733 joint2 0.444267
2579
+ skin 2522 joint1 0.555733 joint2 0.444267
2580
+ skin 2523 joint2 1.000000
2581
+ skin 2524 joint3 1.000000
2582
+ skin 2525 joint3 1.000000
2583
+ skin 2526 joint3 1.000000
2584
+ skin 2527 joint2 1.000000
2585
+ skin 2528 joint2 1.000000
2586
+ skin 2529 joint1 1.000000
2587
+ skin 2530 joint1 1.000000
2588
+ skin 2531 joint1 1.000000
2589
+ skin 2532 joint2 1.000000
2590
+ skin 2533 joint2 1.000000
2591
+ skin 2534 joint3 0.591929 joint4 0.408071
2592
+ skin 2535 joint3 0.591929 joint4 0.408071
2593
+ skin 2536 joint1 0.420984 joint2 0.579016
2594
+ skin 2537 joint3 0.385261 joint4 0.614739
2595
+ skin 2538 joint2 1.000000
2596
+ skin 2539 joint2 0.721764 joint3 0.278236
2597
+ skin 2540 joint2 1.000000
2598
+ skin 2541 joint2 1.000000
2599
+ skin 2542 joint2 1.000000
2600
+ skin 2543 joint1 1.000000
2601
+ skin 2544 joint1 1.000000
2602
+ skin 2545 joint1 1.000000
2603
+ skin 2546 joint0 0.350257 joint1 0.649743
2604
+ skin 2547 joint0 0.350257 joint1 0.649743
2605
+ skin 2548 joint0 0.350257 joint1 0.649743
2606
+ skin 2549 joint0 0.436462 joint1 0.563538
2607
+ skin 2550 joint0 0.436462 joint1 0.563538
2608
+ skin 2551 joint0 0.436462 joint1 0.563538
2609
+ skin 2552 joint4 0.376020 joint10 0.623980
2610
+ skin 2553 joint4 0.376020 joint10 0.623980
2611
+ skin 2554 joint14 0.604608 joint15 0.395392
animation/inputs/fish/first_frames/render_back.png ADDED
animation/inputs/fish/first_frames/render_front.png ADDED
animation/inputs/fish/first_frames/render_left.png ADDED
animation/inputs/fish/first_frames/render_right.png ADDED
animation/inputs/fish/input.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:eba1a2f8795f76240ab03b35916a9d11f674b5084bf954dbe58a231eb4f77fa5
3
+ size 2167626
animation/inputs/fish/objs/fish_texture.png ADDED

Git LFS Details

  • SHA256: 0c3f3829e5bde51f08f0255bf938e672e547199447cb004a01a25fb062a777ef
  • Pointer size: 132 Bytes
  • Size of remote file: 1.68 MB
animation/inputs/fish/objs/material.mtl ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ newmtl fish_texture
2
+ Ka 1 1 1
3
+ Kd 1 1 1
4
+ Ks 0 0 0
5
+ Ns 10
6
+ illum 2
7
+ map_Kd fish_texture.png
8
+
animation/inputs/fish/objs/mesh.obj ADDED
The diff for this file is too large to render. See raw diff
 
animation/inputs/fish/objs/rig.txt ADDED
@@ -0,0 +1,1204 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ joints joint0 -0.02241507 -0.00288021 0.00819102
2
+ joints joint1 -0.01895133 -0.00703823 0.00957575
3
+ joints joint2 -0.01548758 -0.01120387 0.01165381
4
+ joints joint3 -0.01132956 -0.01813137 0.02066127
5
+ joints joint4 -0.00093451 -0.02991115 0.00611201
6
+ joints joint5 -0.00093451 -0.02783596 0.01927653
7
+ joints joint6 -0.00093451 -0.01950466 0.00125971
8
+ joints joint7 -0.00093451 -0.01674282 -0.00289068
9
+ joints joint8 -0.00093451 -0.01189052 -0.00705633
10
+ joints joint9 -0.00024119 -0.01950466 0.01442519
11
+ joints joint10 -0.00024119 -0.01189052 0.01511851
12
+ joints joint11 0.00114450 -0.00288021 0.03243342
13
+ joints joint12 0.00114450 -0.00288021 0.03521052
14
+ joints joint13 0.00114450 0.00196446 0.01581088
15
+ joints joint14 0.00253019 0.01028050 0.01511851
16
+ joints joint15 0.00460825 0.01859654 0.02758876
17
+ joints joint16 0.00460825 0.02136601 0.01373234
18
+ joints joint17 0.00460825 0.04284276 -0.00012121
19
+ joints joint18 0.00460825 0.04769505 0.02066127
20
+ joints joint19 0.00530252 0.02136601 0.02967158
21
+ joints joint20 0.00599298 0.02413548 0.03106013
22
+ joints joint21 0.00599298 0.02967442 0.01234666
23
+ joints joint22 0.00599298 0.04006566 0.00472346
24
+ joints joint23 0.00599298 0.04354466 0.01511851
25
+ joints joint24 0.00668726 0.03799046 0.01096049
26
+ joints joint25 0.01084146 -0.01881801 0.02135554
27
+ joints joint26 0.01569376 -0.01327907 0.01165381
28
+ joints joint27 0.01985178 -0.00981533 0.00957575
29
+ joints joint28 0.02400217 -0.00703823 0.00819102
30
+ root joint9
31
+ hier joint9 joint6
32
+ hier joint9 joint4
33
+ hier joint9 joint10
34
+ hier joint9 joint5
35
+ hier joint9 joint3
36
+ hier joint9 joint25
37
+ hier joint6 joint7
38
+ hier joint10 joint26
39
+ hier joint10 joint2
40
+ hier joint10 joint13
41
+ hier joint10 joint11
42
+ hier joint7 joint8
43
+ hier joint26 joint27
44
+ hier joint2 joint1
45
+ hier joint13 joint14
46
+ hier joint11 joint12
47
+ hier joint27 joint28
48
+ hier joint1 joint0
49
+ hier joint14 joint16
50
+ hier joint14 joint15
51
+ hier joint16 joint21
52
+ hier joint15 joint19
53
+ hier joint21 joint24
54
+ hier joint19 joint20
55
+ hier joint24 joint22
56
+ hier joint24 joint23
57
+ hier joint22 joint17
58
+ hier joint23 joint18
59
+ skin 0 joint21 0.262297 joint23 0.365876 joint24 0.371826
60
+ skin 1 joint23 1.000000
61
+ skin 2 joint23 1.000000
62
+ skin 3 joint28 1.000000
63
+ skin 4 joint28 1.000000
64
+ skin 5 joint28 1.000000
65
+ skin 6 joint18 1.000000
66
+ skin 7 joint18 1.000000
67
+ skin 8 joint18 1.000000
68
+ skin 9 joint8 1.000000
69
+ skin 10 joint8 1.000000
70
+ skin 11 joint8 1.000000
71
+ skin 12 joint22 1.000000
72
+ skin 13 joint21 0.425780 joint22 0.272057 joint24 0.302163
73
+ skin 14 joint22 1.000000
74
+ skin 15 joint17 1.000000
75
+ skin 16 joint17 1.000000
76
+ skin 17 joint17 1.000000
77
+ skin 18 joint23 0.664864 joint24 0.335136
78
+ skin 19 joint23 1.000000
79
+ skin 20 joint24 1.000000
80
+ skin 21 joint8 1.000000
81
+ skin 22 joint8 1.000000
82
+ skin 23 joint8 1.000000
83
+ skin 24 joint9 1.000000
84
+ skin 25 joint4 0.680850 joint5 0.319150
85
+ skin 26 joint4 1.000000
86
+ skin 27 joint9 1.000000
87
+ skin 28 joint9 1.000000
88
+ skin 29 joint5 1.000000
89
+ skin 30 joint4 0.562491 joint5 0.437509
90
+ skin 31 joint9 1.000000
91
+ skin 32 joint9 1.000000
92
+ skin 33 joint7 0.727924 joint8 0.272076
93
+ skin 34 joint7 0.716745 joint8 0.283255
94
+ skin 35 joint7 1.000000
95
+ skin 36 joint7 1.000000
96
+ skin 37 joint7 0.727924 joint8 0.272076
97
+ skin 38 joint7 1.000000
98
+ skin 39 joint7 0.716745 joint8 0.283255
99
+ skin 40 joint7 0.727924 joint8 0.272076
100
+ skin 41 joint7 0.356090 joint8 0.643911
101
+ skin 42 joint10 0.478152 joint11 0.288492 joint12 0.233357
102
+ skin 43 joint10 0.478152 joint11 0.288492 joint12 0.233357
103
+ skin 44 joint12 1.000000
104
+ skin 45 joint10 0.214828 joint11 0.332789 joint12 0.205216 joint13 0.247167
105
+ skin 46 joint13 0.690154 joint14 0.309846
106
+ skin 47 joint11 0.583502 joint12 0.416498
107
+ skin 48 joint20 1.000000
108
+ skin 49 joint20 1.000000
109
+ skin 50 joint20 1.000000
110
+ skin 51 joint13 0.567822 joint14 0.432178
111
+ skin 52 joint14 1.000000
112
+ skin 53 joint13 0.186613 joint14 0.383197 joint15 0.430190
113
+ skin 54 joint20 1.000000
114
+ skin 55 joint20 1.000000
115
+ skin 56 joint20 1.000000
116
+ skin 57 joint28 1.000000
117
+ skin 58 joint9 1.000000
118
+ skin 59 joint9 0.426263 joint10 0.279269 joint11 0.294468
119
+ skin 60 joint9 0.426263 joint10 0.279269 joint11 0.294468
120
+ skin 61 joint9 0.690532 joint10 0.309468
121
+ skin 62 joint9 0.208503 joint10 0.330417 joint11 0.240938 joint12 0.220142
122
+ skin 63 joint9 0.426263 joint10 0.279269 joint11 0.294468
123
+ skin 64 joint28 1.000000
124
+ skin 65 joint28 1.000000
125
+ skin 66 joint28 1.000000
126
+ skin 67 joint26 1.000000
127
+ skin 68 joint26 1.000000
128
+ skin 69 joint26 1.000000
129
+ skin 70 joint9 1.000000
130
+ skin 71 joint9 1.000000
131
+ skin 72 joint9 1.000000
132
+ skin 73 joint21 0.251236 joint23 0.430250 joint24 0.318514
133
+ skin 74 joint23 1.000000
134
+ skin 75 joint23 1.000000
135
+ skin 76 joint0 1.000000
136
+ skin 77 joint0 1.000000
137
+ skin 78 joint0 1.000000
138
+ skin 79 joint18 1.000000
139
+ skin 80 joint18 1.000000
140
+ skin 81 joint18 1.000000
141
+ skin 82 joint8 1.000000
142
+ skin 83 joint22 1.000000
143
+ skin 84 joint22 1.000000
144
+ skin 85 joint21 0.261513 joint22 0.477951 joint24 0.260536
145
+ skin 86 joint17 1.000000
146
+ skin 87 joint17 1.000000
147
+ skin 88 joint17 0.645273 joint22 0.354727
148
+ skin 89 joint23 1.000000
149
+ skin 90 joint24 1.000000
150
+ skin 91 joint23 1.000000
151
+ skin 92 joint8 1.000000
152
+ skin 93 joint9 1.000000
153
+ skin 94 joint4 1.000000
154
+ skin 95 joint4 1.000000
155
+ skin 96 joint9 1.000000
156
+ skin 97 joint5 1.000000
157
+ skin 98 joint9 1.000000
158
+ skin 99 joint4 1.000000
159
+ skin 100 joint9 1.000000
160
+ skin 101 joint9 1.000000
161
+ skin 102 joint7 0.727924 joint8 0.272076
162
+ skin 103 joint7 1.000000
163
+ skin 104 joint7 1.000000
164
+ skin 105 joint7 0.727924 joint8 0.272076
165
+ skin 106 joint7 0.727924 joint8 0.272076
166
+ skin 107 joint10 1.000000
167
+ skin 108 joint10 0.478152 joint11 0.288492 joint12 0.233357
168
+ skin 109 joint10 0.170328 joint11 0.321706 joint12 0.223083 joint13 0.284883
169
+ skin 110 joint11 0.583502 joint12 0.416498
170
+ skin 111 joint13 0.690154 joint14 0.309846
171
+ skin 112 joint20 1.000000
172
+ skin 113 joint13 0.578767 joint14 0.421233
173
+ skin 114 joint13 0.386634 joint14 0.368246 joint15 0.245120
174
+ skin 115 joint14 1.000000
175
+ skin 116 joint20 1.000000
176
+ skin 117 joint20 1.000000
177
+ skin 118 joint0 1.000000
178
+ skin 119 joint9 1.000000
179
+ skin 120 joint9 0.426263 joint10 0.279269 joint11 0.294468
180
+ skin 121 joint9 0.426263 joint10 0.279269 joint11 0.294468
181
+ skin 122 joint9 1.000000
182
+ skin 123 joint9 0.208503 joint10 0.330417 joint11 0.240938 joint12 0.220142
183
+ skin 124 joint9 0.426263 joint10 0.279269 joint11 0.294468
184
+ skin 125 joint2 0.537824 joint9 0.462176
185
+ skin 126 joint2 1.000000
186
+ skin 127 joint2 1.000000
187
+ skin 128 joint2 1.000000
188
+ skin 129 joint2 1.000000
189
+ skin 130 joint0 1.000000
190
+ skin 131 joint0 1.000000
191
+ skin 132 joint0 1.000000
192
+ skin 133 joint2 1.000000
193
+ skin 134 joint2 1.000000
194
+ skin 135 joint2 1.000000
195
+ skin 136 joint9 1.000000
196
+ skin 137 joint9 1.000000
197
+ skin 138 joint9 1.000000
198
+ skin 139 joint26 1.000000
199
+ skin 140 joint26 1.000000
200
+ skin 141 joint26 1.000000
201
+ skin 142 joint9 0.375908 joint26 0.624092
202
+ skin 143 joint11 0.271511 joint12 0.728489
203
+ skin 144 joint12 1.000000
204
+ skin 145 joint10 0.205166 joint11 0.449742 joint12 0.345092
205
+ skin 146 joint10 0.205166 joint11 0.449742 joint12 0.345092
206
+ skin 147 joint10 0.205166 joint11 0.449742 joint12 0.345092
207
+ skin 148 joint11 0.271511 joint12 0.728489
208
+ skin 149 joint11 0.271511 joint12 0.728489
209
+ skin 150 joint10 0.267198 joint11 0.441405 joint12 0.291397
210
+ skin 151 joint12 1.000000
211
+ skin 152 joint10 0.267198 joint11 0.441405 joint12 0.291397
212
+ skin 153 joint11 0.271511 joint12 0.728489
213
+ skin 154 joint10 0.205166 joint11 0.449742 joint12 0.345092
214
+ skin 155 joint25 1.000000
215
+ skin 156 joint25 1.000000
216
+ skin 157 joint25 1.000000
217
+ skin 158 joint25 1.000000
218
+ skin 159 joint25 1.000000
219
+ skin 160 joint25 1.000000
220
+ skin 161 joint25 1.000000
221
+ skin 162 joint25 1.000000
222
+ skin 163 joint25 1.000000
223
+ skin 164 joint25 1.000000
224
+ skin 165 joint25 1.000000
225
+ skin 166 joint25 1.000000
226
+ skin 167 joint25 1.000000
227
+ skin 168 joint25 1.000000
228
+ skin 169 joint25 1.000000
229
+ skin 170 joint25 1.000000
230
+ skin 171 joint25 1.000000
231
+ skin 172 joint25 1.000000
232
+ skin 173 joint25 1.000000
233
+ skin 174 joint25 1.000000
234
+ skin 175 joint25 1.000000
235
+ skin 176 joint25 1.000000
236
+ skin 177 joint3 1.000000
237
+ skin 178 joint3 1.000000
238
+ skin 179 joint3 1.000000
239
+ skin 180 joint3 1.000000
240
+ skin 181 joint3 1.000000
241
+ skin 182 joint3 1.000000
242
+ skin 183 joint3 1.000000
243
+ skin 184 joint3 1.000000
244
+ skin 185 joint3 1.000000
245
+ skin 186 joint3 1.000000
246
+ skin 187 joint3 1.000000
247
+ skin 188 joint3 1.000000
248
+ skin 189 joint3 1.000000
249
+ skin 190 joint3 1.000000
250
+ skin 191 joint3 1.000000
251
+ skin 192 joint3 1.000000
252
+ skin 193 joint3 1.000000
253
+ skin 194 joint3 1.000000
254
+ skin 195 joint3 1.000000
255
+ skin 196 joint3 1.000000
256
+ skin 197 joint3 1.000000
257
+ skin 198 joint3 1.000000
258
+ skin 199 joint9 0.694518 joint10 0.305482
259
+ skin 200 joint9 1.000000
260
+ skin 201 joint10 1.000000
261
+ skin 202 joint10 1.000000
262
+ skin 203 joint9 0.603015 joint25 0.396985
263
+ skin 204 joint9 1.000000
264
+ skin 205 joint9 0.397865 joint25 0.602135
265
+ skin 206 joint25 1.000000
266
+ skin 207 joint9 1.000000
267
+ skin 208 joint5 1.000000
268
+ skin 209 joint14 0.675239 joint16 0.324761
269
+ skin 210 joint14 0.721331 joint16 0.278669
270
+ skin 211 joint16 0.588517 joint21 0.411483
271
+ skin 212 joint16 0.574832 joint21 0.425168
272
+ skin 213 joint16 0.242048 joint21 0.505221 joint24 0.252731
273
+ skin 214 joint16 0.212593 joint21 0.512866 joint24 0.274541
274
+ skin 215 joint21 0.373133 joint23 0.180209 joint24 0.446658
275
+ skin 216 joint10 0.737821 joint13 0.262179
276
+ skin 217 joint10 0.698837 joint13 0.301163
277
+ skin 218 joint18 0.295758 joint23 0.704242
278
+ skin 219 joint18 0.595656 joint23 0.404344
279
+ skin 220 joint18 0.680603 joint23 0.319397
280
+ skin 221 joint18 1.000000
281
+ skin 222 joint9 1.000000
282
+ skin 223 joint9 1.000000
283
+ skin 224 joint9 1.000000
284
+ skin 225 joint9 1.000000
285
+ skin 226 joint10 0.685158 joint13 0.314842
286
+ skin 227 joint10 0.660655 joint13 0.339345
287
+ skin 228 joint10 1.000000
288
+ skin 229 joint10 1.000000
289
+ skin 230 joint14 0.206046 joint16 0.516888 joint21 0.277066
290
+ skin 231 joint14 1.000000
291
+ skin 232 joint14 0.710628 joint16 0.289372
292
+ skin 233 joint16 0.574550 joint21 0.425450
293
+ skin 234 joint21 0.638922 joint24 0.361078
294
+ skin 235 joint16 0.193716 joint21 0.543759 joint24 0.262526
295
+ skin 236 joint21 0.473811 joint24 0.526189
296
+ skin 237 joint21 0.443432 joint22 0.194031 joint24 0.362537
297
+ skin 238 joint21 0.259270 joint24 0.740730
298
+ skin 239 joint21 0.174437 joint22 0.470058 joint24 0.355505
299
+ skin 240 joint24 1.000000
300
+ skin 241 joint22 0.445350 joint24 0.554650
301
+ skin 242 joint24 1.000000
302
+ skin 243 joint22 0.508803 joint24 0.491197
303
+ skin 244 joint22 0.727923 joint24 0.272077
304
+ skin 245 joint22 1.000000
305
+ skin 246 joint22 1.000000
306
+ skin 247 joint10 0.715887 joint13 0.284113
307
+ skin 248 joint10 1.000000
308
+ skin 249 joint10 1.000000
309
+ skin 250 joint10 0.693259 joint13 0.306741
310
+ skin 251 joint16 0.547463 joint21 0.452537
311
+ skin 252 joint14 1.000000
312
+ skin 253 joint14 0.699422 joint16 0.300578
313
+ skin 254 joint16 0.561545 joint21 0.438455
314
+ skin 255 joint16 0.206677 joint21 0.508607 joint24 0.284716
315
+ skin 256 joint16 0.242048 joint21 0.505221 joint24 0.252731
316
+ skin 257 joint21 0.289230 joint23 0.294837 joint24 0.415933
317
+ skin 258 joint21 0.203666 joint23 0.428347 joint24 0.367986
318
+ skin 259 joint23 0.651283 joint24 0.348717
319
+ skin 260 joint23 0.651133 joint24 0.348867
320
+ skin 261 joint18 0.702936 joint23 0.297064
321
+ skin 262 joint18 1.000000
322
+ skin 263 joint18 1.000000
323
+ skin 264 joint18 1.000000
324
+ skin 265 joint18 1.000000
325
+ skin 266 joint18 1.000000
326
+ skin 267 joint18 1.000000
327
+ skin 268 joint18 1.000000
328
+ skin 269 joint23 1.000000
329
+ skin 270 joint23 1.000000
330
+ skin 271 joint24 1.000000
331
+ skin 272 joint24 1.000000
332
+ skin 273 joint22 1.000000
333
+ skin 274 joint22 1.000000
334
+ skin 275 joint17 1.000000
335
+ skin 276 joint17 1.000000
336
+ skin 277 joint17 1.000000
337
+ skin 278 joint17 1.000000
338
+ skin 279 joint17 1.000000
339
+ skin 280 joint17 1.000000
340
+ skin 281 joint17 0.515771 joint22 0.484229
341
+ skin 282 joint17 1.000000
342
+ skin 283 joint22 1.000000
343
+ skin 284 joint22 1.000000
344
+ skin 285 joint21 0.352148 joint22 0.349603 joint24 0.298248
345
+ skin 286 joint21 0.372905 joint22 0.323083 joint24 0.304011
346
+ skin 287 joint21 0.677182 joint24 0.322818
347
+ skin 288 joint21 0.691543 joint24 0.308457
348
+ skin 289 joint16 0.569784 joint21 0.430216
349
+ skin 290 joint16 0.526272 joint21 0.473728
350
+ skin 291 joint14 0.705448 joint16 0.294552
351
+ skin 292 joint14 0.591743 joint16 0.408257
352
+ skin 293 joint10 1.000000
353
+ skin 294 joint10 1.000000
354
+ skin 295 joint10 1.000000
355
+ skin 296 joint10 0.728167 joint13 0.271833
356
+ skin 297 joint9 1.000000
357
+ skin 298 joint9 0.729531 joint10 0.270469
358
+ skin 299 joint4 1.000000
359
+ skin 300 joint9 1.000000
360
+ skin 301 joint9 1.000000
361
+ skin 302 joint4 1.000000
362
+ skin 303 joint4 1.000000
363
+ skin 304 joint4 1.000000
364
+ skin 305 joint4 1.000000
365
+ skin 306 joint4 1.000000
366
+ skin 307 joint5 1.000000
367
+ skin 308 joint5 1.000000
368
+ skin 309 joint5 1.000000
369
+ skin 310 joint5 1.000000
370
+ skin 311 joint9 1.000000
371
+ skin 312 joint9 1.000000
372
+ skin 313 joint9 1.000000
373
+ skin 314 joint9 1.000000
374
+ skin 315 joint9 1.000000
375
+ skin 316 joint9 1.000000
376
+ skin 317 joint23 0.615999 joint24 0.384001
377
+ skin 318 joint23 0.650847 joint24 0.349153
378
+ skin 319 joint23 0.718173 joint24 0.281827
379
+ skin 320 joint22 1.000000
380
+ skin 321 joint17 0.451022 joint22 0.548978
381
+ skin 322 joint17 1.000000
382
+ skin 323 joint17 1.000000
383
+ skin 324 joint9 0.262200 joint26 0.737800
384
+ skin 325 joint9 1.000000
385
+ skin 326 joint4 1.000000
386
+ skin 327 joint9 1.000000
387
+ skin 328 joint9 1.000000
388
+ skin 329 joint9 1.000000
389
+ skin 330 joint9 1.000000
390
+ skin 331 joint10 1.000000
391
+ skin 332 joint9 0.375908 joint26 0.624092
392
+ skin 333 joint9 0.645738 joint10 0.354262
393
+ skin 334 joint10 1.000000
394
+ skin 335 joint10 0.632309 joint13 0.367691
395
+ skin 336 joint10 0.655192 joint13 0.344809
396
+ skin 337 joint16 0.570315 joint21 0.429685
397
+ skin 338 joint14 1.000000
398
+ skin 339 joint14 0.660557 joint16 0.339443
399
+ skin 340 joint16 0.569784 joint21 0.430216
400
+ skin 341 joint21 0.660712 joint24 0.339288
401
+ skin 342 joint21 0.675866 joint24 0.324134
402
+ skin 343 joint21 0.395294 joint22 0.263171 joint24 0.341535
403
+ skin 344 joint22 0.652752 joint24 0.347248
404
+ skin 345 joint22 1.000000
405
+ skin 346 joint22 1.000000
406
+ skin 347 joint9 1.000000
407
+ skin 348 joint9 1.000000
408
+ skin 349 joint9 1.000000
409
+ skin 350 joint9 1.000000
410
+ skin 351 joint9 1.000000
411
+ skin 352 joint9 1.000000
412
+ skin 353 joint9 1.000000
413
+ skin 354 joint9 1.000000
414
+ skin 355 joint9 1.000000
415
+ skin 356 joint9 1.000000
416
+ skin 357 joint9 1.000000
417
+ skin 358 joint9 1.000000
418
+ skin 359 joint9 1.000000
419
+ skin 360 joint9 1.000000
420
+ skin 361 joint9 1.000000
421
+ skin 362 joint4 1.000000
422
+ skin 363 joint4 1.000000
423
+ skin 364 joint4 1.000000
424
+ skin 365 joint5 1.000000
425
+ skin 366 joint5 1.000000
426
+ skin 367 joint5 1.000000
427
+ skin 368 joint5 1.000000
428
+ skin 369 joint4 0.292918 joint5 0.707082
429
+ skin 370 joint4 0.680850 joint5 0.319150
430
+ skin 371 joint9 1.000000
431
+ skin 372 joint9 1.000000
432
+ skin 373 joint4 0.562491 joint5 0.437509
433
+ skin 374 joint9 1.000000
434
+ skin 375 joint5 1.000000
435
+ skin 376 joint5 1.000000
436
+ skin 377 joint9 1.000000
437
+ skin 378 joint9 1.000000
438
+ skin 379 joint9 1.000000
439
+ skin 380 joint9 1.000000
440
+ skin 381 joint9 1.000000
441
+ skin 382 joint5 1.000000
442
+ skin 383 joint4 1.000000
443
+ skin 384 joint9 1.000000
444
+ skin 385 joint9 1.000000
445
+ skin 386 joint4 0.292918 joint5 0.707082
446
+ skin 387 joint5 1.000000
447
+ skin 388 joint9 1.000000
448
+ skin 389 joint9 1.000000
449
+ skin 390 joint9 1.000000
450
+ skin 391 joint5 1.000000
451
+ skin 392 joint9 1.000000
452
+ skin 393 joint9 1.000000
453
+ skin 394 joint9 1.000000
454
+ skin 395 joint9 1.000000
455
+ skin 396 joint9 1.000000
456
+ skin 397 joint9 1.000000
457
+ skin 398 joint9 1.000000
458
+ skin 399 joint9 1.000000
459
+ skin 400 joint9 1.000000
460
+ skin 401 joint9 1.000000
461
+ skin 402 joint9 1.000000
462
+ skin 403 joint9 1.000000
463
+ skin 404 joint9 1.000000
464
+ skin 405 joint9 1.000000
465
+ skin 406 joint9 1.000000
466
+ skin 407 joint9 1.000000
467
+ skin 408 joint9 1.000000
468
+ skin 409 joint9 1.000000
469
+ skin 410 joint9 1.000000
470
+ skin 411 joint9 1.000000
471
+ skin 412 joint9 1.000000
472
+ skin 413 joint9 1.000000
473
+ skin 414 joint9 1.000000
474
+ skin 415 joint9 1.000000
475
+ skin 416 joint9 1.000000
476
+ skin 417 joint9 1.000000
477
+ skin 418 joint9 1.000000
478
+ skin 419 joint9 1.000000
479
+ skin 420 joint9 1.000000
480
+ skin 421 joint9 1.000000
481
+ skin 422 joint9 1.000000
482
+ skin 423 joint9 1.000000
483
+ skin 424 joint9 1.000000
484
+ skin 425 joint9 1.000000
485
+ skin 426 joint6 0.282354 joint9 0.717646
486
+ skin 427 joint9 1.000000
487
+ skin 428 joint9 1.000000
488
+ skin 429 joint9 1.000000
489
+ skin 430 joint9 1.000000
490
+ skin 431 joint6 0.282354 joint9 0.717646
491
+ skin 432 joint6 1.000000
492
+ skin 433 joint6 0.371620 joint7 0.628380
493
+ skin 434 joint9 1.000000
494
+ skin 435 joint6 0.692325 joint9 0.307675
495
+ skin 436 joint6 0.440112 joint7 0.559888
496
+ skin 437 joint7 1.000000
497
+ skin 438 joint6 0.329658 joint7 0.670342
498
+ skin 439 joint7 1.000000
499
+ skin 440 joint7 0.599154 joint8 0.400846
500
+ skin 441 joint7 1.000000
501
+ skin 442 joint7 0.268704 joint8 0.731296
502
+ skin 443 joint8 1.000000
503
+ skin 444 joint7 1.000000
504
+ skin 445 joint8 1.000000
505
+ skin 446 joint8 1.000000
506
+ skin 447 joint7 0.340589 joint8 0.659411
507
+ skin 448 joint8 1.000000
508
+ skin 449 joint8 1.000000
509
+ skin 450 joint8 1.000000
510
+ skin 451 joint10 0.474217 joint13 0.525783
511
+ skin 452 joint10 0.303360 joint13 0.696640
512
+ skin 453 joint10 0.323897 joint13 0.676103
513
+ skin 454 joint13 1.000000
514
+ skin 455 joint10 0.373846 joint13 0.626154
515
+ skin 456 joint10 0.715887 joint13 0.284113
516
+ skin 457 joint13 1.000000
517
+ skin 458 joint10 0.322595 joint13 0.677405
518
+ skin 459 joint13 1.000000
519
+ skin 460 joint10 0.321339 joint13 0.678661
520
+ skin 461 joint10 0.363426 joint13 0.636574
521
+ skin 462 joint14 1.000000
522
+ skin 463 joint14 1.000000
523
+ skin 464 joint14 1.000000
524
+ skin 465 joint14 1.000000
525
+ skin 466 joint14 1.000000
526
+ skin 467 joint14 1.000000
527
+ skin 468 joint14 1.000000
528
+ skin 469 joint14 1.000000
529
+ skin 470 joint14 1.000000
530
+ skin 471 joint13 0.738273 joint14 0.261727
531
+ skin 472 joint13 0.734905 joint14 0.265095
532
+ skin 473 joint13 0.650703 joint14 0.349297
533
+ skin 474 joint13 0.616660 joint14 0.383340
534
+ skin 475 joint13 0.581995 joint14 0.418005
535
+ skin 476 joint13 1.000000
536
+ skin 477 joint13 1.000000
537
+ skin 478 joint13 0.594157 joint14 0.405843
538
+ skin 479 joint13 0.702545 joint14 0.297455
539
+ skin 480 joint13 1.000000
540
+ skin 481 joint13 1.000000
541
+ skin 482 joint13 0.673040 joint14 0.326960
542
+ skin 483 joint13 0.697584 joint14 0.302416
543
+ skin 484 joint13 1.000000
544
+ skin 485 joint13 1.000000
545
+ skin 486 joint13 0.726238 joint14 0.273762
546
+ skin 487 joint13 0.661546 joint14 0.338454
547
+ skin 488 joint13 0.690067 joint14 0.309933
548
+ skin 489 joint13 1.000000
549
+ skin 490 joint13 1.000000
550
+ skin 491 joint9 1.000000
551
+ skin 492 joint9 1.000000
552
+ skin 493 joint9 1.000000
553
+ skin 494 joint9 1.000000
554
+ skin 495 joint5 1.000000
555
+ skin 496 joint9 1.000000
556
+ skin 497 joint5 1.000000
557
+ skin 498 joint5 1.000000
558
+ skin 499 joint9 1.000000
559
+ skin 500 joint9 1.000000
560
+ skin 501 joint9 1.000000
561
+ skin 502 joint10 1.000000
562
+ skin 503 joint10 0.715887 joint13 0.284113
563
+ skin 504 joint10 0.205166 joint11 0.449742 joint12 0.345092
564
+ skin 505 joint10 0.205166 joint11 0.449742 joint12 0.345092
565
+ skin 506 joint10 0.205166 joint11 0.449742 joint12 0.345092
566
+ skin 507 joint10 0.373846 joint13 0.626154
567
+ skin 508 joint13 1.000000
568
+ skin 509 joint10 0.715887 joint13 0.284113
569
+ skin 510 joint10 0.205166 joint11 0.449742 joint12 0.345092
570
+ skin 511 joint13 0.583229 joint14 0.416771
571
+ skin 512 joint13 0.535044 joint14 0.464956
572
+ skin 513 joint13 0.600756 joint14 0.399244
573
+ skin 514 joint13 0.542939 joint14 0.457061
574
+ skin 515 joint13 0.581995 joint14 0.418005
575
+ skin 516 joint13 0.613381 joint14 0.386619
576
+ skin 517 joint13 0.473555 joint14 0.526445
577
+ skin 518 joint13 0.512948 joint14 0.487052
578
+ skin 519 joint13 0.604574 joint14 0.395426
579
+ skin 520 joint20 1.000000
580
+ skin 521 joint20 1.000000
581
+ skin 522 joint14 1.000000
582
+ skin 523 joint16 0.547463 joint21 0.452537
583
+ skin 524 joint15 0.393240 joint19 0.210277 joint20 0.396483
584
+ skin 525 joint15 1.000000
585
+ skin 526 joint14 1.000000
586
+ skin 527 joint15 1.000000
587
+ skin 528 joint15 0.362388 joint20 0.637612
588
+ skin 529 joint19 1.000000
589
+ skin 530 joint19 1.000000
590
+ skin 531 joint19 1.000000
591
+ skin 532 joint19 1.000000
592
+ skin 533 joint20 1.000000
593
+ skin 534 joint20 1.000000
594
+ skin 535 joint15 1.000000
595
+ skin 536 joint15 1.000000
596
+ skin 537 joint13 0.690067 joint14 0.309933
597
+ skin 538 joint13 0.567822 joint14 0.432178
598
+ skin 539 joint13 0.186613 joint14 0.383197 joint15 0.430190
599
+ skin 540 joint15 1.000000
600
+ skin 541 joint13 0.186613 joint14 0.383197 joint15 0.430190
601
+ skin 542 joint15 1.000000
602
+ skin 543 joint19 1.000000
603
+ skin 544 joint19 1.000000
604
+ skin 545 joint20 1.000000
605
+ skin 546 joint20 1.000000
606
+ skin 547 joint20 1.000000
607
+ skin 548 joint20 1.000000
608
+ skin 549 joint20 1.000000
609
+ skin 550 joint20 1.000000
610
+ skin 551 joint8 1.000000
611
+ skin 552 joint8 1.000000
612
+ skin 553 joint7 0.356090 joint8 0.643911
613
+ skin 554 joint6 0.560591 joint7 0.439409
614
+ skin 555 joint9 1.000000
615
+ skin 556 joint9 0.690532 joint10 0.309468
616
+ skin 557 joint9 1.000000
617
+ skin 558 joint9 1.000000
618
+ skin 559 joint9 1.000000
619
+ skin 560 joint9 1.000000
620
+ skin 561 joint9 1.000000
621
+ skin 562 joint9 1.000000
622
+ skin 563 joint9 1.000000
623
+ skin 564 joint9 1.000000
624
+ skin 565 joint9 0.385334 joint26 0.614666
625
+ skin 566 joint9 0.399137 joint10 0.249145 joint26 0.351717
626
+ skin 567 joint9 0.399137 joint10 0.249145 joint26 0.351717
627
+ skin 568 joint9 0.262200 joint26 0.737800
628
+ skin 569 joint26 1.000000
629
+ skin 570 joint9 0.215381 joint10 0.382661 joint26 0.401958
630
+ skin 571 joint9 0.262200 joint26 0.737800
631
+ skin 572 joint9 0.385334 joint26 0.614666
632
+ skin 573 joint26 1.000000
633
+ skin 574 joint26 1.000000
634
+ skin 575 joint26 1.000000
635
+ skin 576 joint26 1.000000
636
+ skin 577 joint26 0.713933 joint27 0.286067
637
+ skin 578 joint26 1.000000
638
+ skin 579 joint26 0.646180 joint27 0.353820
639
+ skin 580 joint28 1.000000
640
+ skin 581 joint26 1.000000
641
+ skin 582 joint26 0.709178 joint27 0.290822
642
+ skin 583 joint26 0.675012 joint27 0.324988
643
+ skin 584 joint28 1.000000
644
+ skin 585 joint26 0.703568 joint27 0.296432
645
+ skin 586 joint27 1.000000
646
+ skin 587 joint27 1.000000
647
+ skin 588 joint27 1.000000
648
+ skin 589 joint27 1.000000
649
+ skin 590 joint27 1.000000
650
+ skin 591 joint27 1.000000
651
+ skin 592 joint27 1.000000
652
+ skin 593 joint27 1.000000
653
+ skin 594 joint28 1.000000
654
+ skin 595 joint28 1.000000
655
+ skin 596 joint28 1.000000
656
+ skin 597 joint28 1.000000
657
+ skin 598 joint28 1.000000
658
+ skin 599 joint28 1.000000
659
+ skin 600 joint28 1.000000
660
+ skin 601 joint28 1.000000
661
+ skin 602 joint26 0.675012 joint27 0.324988
662
+ skin 603 joint27 1.000000
663
+ skin 604 joint28 1.000000
664
+ skin 605 joint9 0.375908 joint26 0.624092
665
+ skin 606 joint9 0.728602 joint10 0.271398
666
+ skin 607 joint10 1.000000
667
+ skin 608 joint10 1.000000
668
+ skin 609 joint9 1.000000
669
+ skin 610 joint3 1.000000
670
+ skin 611 joint3 1.000000
671
+ skin 612 joint9 1.000000
672
+ skin 613 joint9 1.000000
673
+ skin 614 joint5 1.000000
674
+ skin 615 joint9 1.000000
675
+ skin 616 joint14 0.702236 joint16 0.297764
676
+ skin 617 joint14 0.227175 joint16 0.451183 joint21 0.321642
677
+ skin 618 joint16 0.582119 joint21 0.417881
678
+ skin 619 joint14 0.685442 joint16 0.314558
679
+ skin 620 joint16 0.275828 joint21 0.486825 joint24 0.237347
680
+ skin 621 joint21 0.338346 joint23 0.270485 joint24 0.391169
681
+ skin 622 joint16 0.273324 joint21 0.489760 joint24 0.236916
682
+ skin 623 joint10 0.670372 joint13 0.329629
683
+ skin 624 joint10 0.642745 joint13 0.357255
684
+ skin 625 joint18 0.668339 joint23 0.331660
685
+ skin 626 joint18 0.450729 joint23 0.549271
686
+ skin 627 joint18 1.000000
687
+ skin 628 joint18 1.000000
688
+ skin 629 joint9 1.000000
689
+ skin 630 joint9 1.000000
690
+ skin 631 joint9 1.000000
691
+ skin 632 joint9 1.000000
692
+ skin 633 joint10 0.639283 joint13 0.360717
693
+ skin 634 joint10 1.000000
694
+ skin 635 joint10 1.000000
695
+ skin 636 joint10 0.681133 joint13 0.318867
696
+ skin 637 joint16 0.551804 joint21 0.448196
697
+ skin 638 joint16 0.541026 joint21 0.458974
698
+ skin 639 joint14 0.641115 joint16 0.358885
699
+ skin 640 joint14 0.663113 joint16 0.336887
700
+ skin 641 joint16 0.181038 joint21 0.493535 joint24 0.325427
701
+ skin 642 joint21 0.604101 joint24 0.395899
702
+ skin 643 joint21 0.461364 joint24 0.538636
703
+ skin 644 joint21 0.357057 joint22 0.261946 joint24 0.380998
704
+ skin 645 joint24 1.000000
705
+ skin 646 joint22 0.675702 joint24 0.324298
706
+ skin 647 joint24 1.000000
707
+ skin 648 joint22 0.537869 joint24 0.462131
708
+ skin 649 joint24 1.000000
709
+ skin 650 joint22 0.442868 joint24 0.557132
710
+ skin 651 joint22 0.510160 joint24 0.489840
711
+ skin 652 joint22 1.000000
712
+ skin 653 joint22 1.000000
713
+ skin 654 joint10 1.000000
714
+ skin 655 joint10 0.677829 joint13 0.322171
715
+ skin 656 joint10 1.000000
716
+ skin 657 joint10 1.000000
717
+ skin 658 joint16 0.362043 joint21 0.466512 joint24 0.171445
718
+ skin 659 joint14 0.639190 joint16 0.360810
719
+ skin 660 joint14 1.000000
720
+ skin 661 joint16 0.229313 joint21 0.508014 joint24 0.262674
721
+ skin 662 joint21 0.389153 joint23 0.243379 joint24 0.367469
722
+ skin 663 joint23 0.691928 joint24 0.308071
723
+ skin 664 joint18 1.000000
724
+ skin 665 joint18 1.000000
725
+ skin 666 joint18 1.000000
726
+ skin 667 joint18 1.000000
727
+ skin 668 joint23 1.000000
728
+ skin 669 joint22 1.000000
729
+ skin 670 joint22 1.000000
730
+ skin 671 joint24 1.000000
731
+ skin 672 joint17 1.000000
732
+ skin 673 joint17 1.000000
733
+ skin 674 joint17 1.000000
734
+ skin 675 joint17 1.000000
735
+ skin 676 joint17 1.000000
736
+ skin 677 joint17 1.000000
737
+ skin 678 joint17 0.457205 joint22 0.542795
738
+ skin 679 joint17 1.000000
739
+ skin 680 joint22 1.000000
740
+ skin 681 joint22 1.000000
741
+ skin 682 joint21 0.497599 joint22 0.200865 joint24 0.301536
742
+ skin 683 joint21 0.372905 joint22 0.323083 joint24 0.304011
743
+ skin 684 joint16 0.228620 joint21 0.528135 joint24 0.243245
744
+ skin 685 joint21 0.691543 joint24 0.308457
745
+ skin 686 joint16 0.587257 joint21 0.412743
746
+ skin 687 joint16 0.526272 joint21 0.473728
747
+ skin 688 joint14 0.662990 joint16 0.337010
748
+ skin 689 joint14 0.591743 joint16 0.408257
749
+ skin 690 joint10 1.000000
750
+ skin 691 joint10 0.674454 joint13 0.325546
751
+ skin 692 joint10 1.000000
752
+ skin 693 joint10 1.000000
753
+ skin 694 joint9 1.000000
754
+ skin 695 joint9 1.000000
755
+ skin 696 joint4 1.000000
756
+ skin 697 joint9 1.000000
757
+ skin 698 joint9 1.000000
758
+ skin 699 joint4 1.000000
759
+ skin 700 joint4 1.000000
760
+ skin 701 joint5 1.000000
761
+ skin 702 joint5 1.000000
762
+ skin 703 joint9 1.000000
763
+ skin 704 joint9 1.000000
764
+ skin 705 joint9 1.000000
765
+ skin 706 joint23 0.723264 joint24 0.276736
766
+ skin 707 joint23 1.000000
767
+ skin 708 joint23 1.000000
768
+ skin 709 joint22 1.000000
769
+ skin 710 joint17 0.404049 joint22 0.595951
770
+ skin 711 joint17 0.418287 joint22 0.581713
771
+ skin 712 joint17 1.000000
772
+ skin 713 joint2 0.694080 joint9 0.305920
773
+ skin 714 joint9 1.000000
774
+ skin 715 joint4 1.000000
775
+ skin 716 joint9 1.000000
776
+ skin 717 joint9 1.000000
777
+ skin 718 joint9 1.000000
778
+ skin 719 joint9 1.000000
779
+ skin 720 joint10 1.000000
780
+ skin 721 joint10 1.000000
781
+ skin 722 joint9 0.611840 joint10 0.388160
782
+ skin 723 joint2 0.537824 joint9 0.462176
783
+ skin 724 joint10 0.650893 joint13 0.349107
784
+ skin 725 joint10 0.587039 joint13 0.412961
785
+ skin 726 joint16 0.545183 joint21 0.454817
786
+ skin 727 joint16 0.558118 joint21 0.441882
787
+ skin 728 joint14 0.685706 joint16 0.314294
788
+ skin 729 joint14 0.649977 joint16 0.350023
789
+ skin 730 joint16 0.215473 joint21 0.505594 joint24 0.278933
790
+ skin 731 joint21 0.635847 joint24 0.364153
791
+ skin 732 joint21 0.345232 joint22 0.356821 joint24 0.297947
792
+ skin 733 joint22 1.000000
793
+ skin 734 joint22 1.000000
794
+ skin 735 joint22 1.000000
795
+ skin 736 joint9 1.000000
796
+ skin 737 joint9 1.000000
797
+ skin 738 joint9 1.000000
798
+ skin 739 joint9 1.000000
799
+ skin 740 joint9 1.000000
800
+ skin 741 joint9 1.000000
801
+ skin 742 joint9 1.000000
802
+ skin 743 joint9 1.000000
803
+ skin 744 joint9 1.000000
804
+ skin 745 joint9 1.000000
805
+ skin 746 joint9 1.000000
806
+ skin 747 joint9 1.000000
807
+ skin 748 joint9 1.000000
808
+ skin 749 joint9 1.000000
809
+ skin 750 joint4 1.000000
810
+ skin 751 joint5 1.000000
811
+ skin 752 joint4 0.546934 joint5 0.453066
812
+ skin 753 joint4 1.000000
813
+ skin 754 joint5 1.000000
814
+ skin 755 joint5 1.000000
815
+ skin 756 joint5 1.000000
816
+ skin 757 joint5 1.000000
817
+ skin 758 joint4 1.000000
818
+ skin 759 joint4 1.000000
819
+ skin 760 joint9 1.000000
820
+ skin 761 joint9 1.000000
821
+ skin 762 joint9 1.000000
822
+ skin 763 joint9 1.000000
823
+ skin 764 joint5 1.000000
824
+ skin 765 joint5 1.000000
825
+ skin 766 joint9 1.000000
826
+ skin 767 joint9 1.000000
827
+ skin 768 joint9 1.000000
828
+ skin 769 joint9 1.000000
829
+ skin 770 joint5 1.000000
830
+ skin 771 joint9 1.000000
831
+ skin 772 joint9 1.000000
832
+ skin 773 joint4 0.546934 joint5 0.453066
833
+ skin 774 joint5 1.000000
834
+ skin 775 joint9 1.000000
835
+ skin 776 joint9 1.000000
836
+ skin 777 joint5 1.000000
837
+ skin 778 joint9 1.000000
838
+ skin 779 joint9 1.000000
839
+ skin 780 joint9 1.000000
840
+ skin 781 joint5 1.000000
841
+ skin 782 joint9 1.000000
842
+ skin 783 joint9 1.000000
843
+ skin 784 joint9 1.000000
844
+ skin 785 joint9 1.000000
845
+ skin 786 joint9 1.000000
846
+ skin 787 joint9 1.000000
847
+ skin 788 joint9 1.000000
848
+ skin 789 joint9 1.000000
849
+ skin 790 joint9 1.000000
850
+ skin 791 joint9 1.000000
851
+ skin 792 joint9 1.000000
852
+ skin 793 joint9 1.000000
853
+ skin 794 joint9 1.000000
854
+ skin 795 joint9 1.000000
855
+ skin 796 joint9 1.000000
856
+ skin 797 joint9 1.000000
857
+ skin 798 joint9 1.000000
858
+ skin 799 joint9 1.000000
859
+ skin 800 joint9 1.000000
860
+ skin 801 joint9 1.000000
861
+ skin 802 joint9 1.000000
862
+ skin 803 joint9 1.000000
863
+ skin 804 joint9 1.000000
864
+ skin 805 joint9 1.000000
865
+ skin 806 joint9 1.000000
866
+ skin 807 joint9 1.000000
867
+ skin 808 joint9 1.000000
868
+ skin 809 joint9 1.000000
869
+ skin 810 joint9 1.000000
870
+ skin 811 joint9 1.000000
871
+ skin 812 joint6 0.315529 joint9 0.684471
872
+ skin 813 joint9 1.000000
873
+ skin 814 joint9 1.000000
874
+ skin 815 joint9 1.000000
875
+ skin 816 joint9 1.000000
876
+ skin 817 joint6 0.607192 joint7 0.392808
877
+ skin 818 joint6 1.000000
878
+ skin 819 joint6 0.315529 joint9 0.684471
879
+ skin 820 joint6 0.692325 joint9 0.307675
880
+ skin 821 joint9 1.000000
881
+ skin 822 joint7 1.000000
882
+ skin 823 joint6 0.425269 joint7 0.574731
883
+ skin 824 joint6 0.329658 joint7 0.670342
884
+ skin 825 joint7 0.696263 joint8 0.303737
885
+ skin 826 joint7 1.000000
886
+ skin 827 joint7 1.000000
887
+ skin 828 joint7 0.391699 joint8 0.608301
888
+ skin 829 joint7 0.396205 joint8 0.603795
889
+ skin 830 joint7 1.000000
890
+ skin 831 joint8 1.000000
891
+ skin 832 joint8 1.000000
892
+ skin 833 joint7 0.340589 joint8 0.659411
893
+ skin 834 joint8 1.000000
894
+ skin 835 joint8 1.000000
895
+ skin 836 joint8 1.000000
896
+ skin 837 joint10 0.317720 joint13 0.682280
897
+ skin 838 joint10 0.268468 joint13 0.731532
898
+ skin 839 joint13 1.000000
899
+ skin 840 joint13 1.000000
900
+ skin 841 joint10 1.000000
901
+ skin 842 joint10 0.435552 joint13 0.564448
902
+ skin 843 joint10 0.324518 joint13 0.675481
903
+ skin 844 joint13 1.000000
904
+ skin 845 joint10 0.285953 joint13 0.714047
905
+ skin 846 joint10 0.272896 joint13 0.727104
906
+ skin 847 joint10 0.305642 joint13 0.694358
907
+ skin 848 joint14 1.000000
908
+ skin 849 joint14 1.000000
909
+ skin 850 joint14 1.000000
910
+ skin 851 joint13 0.270947 joint14 0.729053
911
+ skin 852 joint14 1.000000
912
+ skin 853 joint14 1.000000
913
+ skin 854 joint14 1.000000
914
+ skin 855 joint14 1.000000
915
+ skin 856 joint14 1.000000
916
+ skin 857 joint13 1.000000
917
+ skin 858 joint13 0.698907 joint14 0.301093
918
+ skin 859 joint13 0.650703 joint14 0.349297
919
+ skin 860 joint13 0.734905 joint14 0.265095
920
+ skin 861 joint13 0.650524 joint14 0.349476
921
+ skin 862 joint13 0.605069 joint14 0.394931
922
+ skin 863 joint13 0.713076 joint14 0.286924
923
+ skin 864 joint13 1.000000
924
+ skin 865 joint13 0.664489 joint14 0.335511
925
+ skin 866 joint13 0.671822 joint14 0.328178
926
+ skin 867 joint13 1.000000
927
+ skin 868 joint13 1.000000
928
+ skin 869 joint13 0.650472 joint14 0.349528
929
+ skin 870 joint13 1.000000
930
+ skin 871 joint13 0.724570 joint14 0.275430
931
+ skin 872 joint13 0.600140 joint14 0.399860
932
+ skin 873 joint13 0.535198 joint14 0.464802
933
+ skin 874 joint13 1.000000
934
+ skin 875 joint9 1.000000
935
+ skin 876 joint9 1.000000
936
+ skin 877 joint9 1.000000
937
+ skin 878 joint9 1.000000
938
+ skin 879 joint5 1.000000
939
+ skin 880 joint9 1.000000
940
+ skin 881 joint5 1.000000
941
+ skin 882 joint5 1.000000
942
+ skin 883 joint9 0.729904 joint10 0.270096
943
+ skin 884 joint9 1.000000
944
+ skin 885 joint9 1.000000
945
+ skin 886 joint10 1.000000
946
+ skin 887 joint10 0.267198 joint11 0.441405 joint12 0.291397
947
+ skin 888 joint10 1.000000
948
+ skin 889 joint10 0.267198 joint11 0.441405 joint12 0.291397
949
+ skin 890 joint10 0.205166 joint11 0.449742 joint12 0.345092
950
+ skin 891 joint10 0.435552 joint13 0.564448
951
+ skin 892 joint13 1.000000
952
+ skin 893 joint10 1.000000
953
+ skin 894 joint10 0.267198 joint11 0.441405 joint12 0.291397
954
+ skin 895 joint13 0.489497 joint14 0.510503
955
+ skin 896 joint13 0.613198 joint14 0.386802
956
+ skin 897 joint13 0.600756 joint14 0.399244
957
+ skin 898 joint13 0.605069 joint14 0.394931
958
+ skin 899 joint13 0.580390 joint14 0.419610
959
+ skin 900 joint13 0.610133 joint14 0.389867
960
+ skin 901 joint13 0.565442 joint14 0.434558
961
+ skin 902 joint13 0.597059 joint14 0.402941
962
+ skin 903 joint13 0.499283 joint14 0.500717
963
+ skin 904 joint20 1.000000
964
+ skin 905 joint14 1.000000
965
+ skin 906 joint15 1.000000
966
+ skin 907 joint15 0.393240 joint19 0.210277 joint20 0.396483
967
+ skin 908 joint16 0.547463 joint21 0.452537
968
+ skin 909 joint14 1.000000
969
+ skin 910 joint15 1.000000
970
+ skin 911 joint19 0.442401 joint20 0.557599
971
+ skin 912 joint15 0.362388 joint20 0.637612
972
+ skin 913 joint19 1.000000
973
+ skin 914 joint19 0.344938 joint20 0.655062
974
+ skin 915 joint19 1.000000
975
+ skin 916 joint15 1.000000
976
+ skin 917 joint13 0.578767 joint14 0.421233
977
+ skin 918 joint15 1.000000
978
+ skin 919 joint13 0.386634 joint14 0.368246 joint15 0.245120
979
+ skin 920 joint13 0.386634 joint14 0.368246 joint15 0.245120
980
+ skin 921 joint15 1.000000
981
+ skin 922 joint19 1.000000
982
+ skin 923 joint19 1.000000
983
+ skin 924 joint20 1.000000
984
+ skin 925 joint20 1.000000
985
+ skin 926 joint20 1.000000
986
+ skin 927 joint20 1.000000
987
+ skin 928 joint20 1.000000
988
+ skin 929 joint8 1.000000
989
+ skin 930 joint8 1.000000
990
+ skin 931 joint7 0.356090 joint8 0.643911
991
+ skin 932 joint6 0.560591 joint7 0.439409
992
+ skin 933 joint9 1.000000
993
+ skin 934 joint9 1.000000
994
+ skin 935 joint9 1.000000
995
+ skin 936 joint9 1.000000
996
+ skin 937 joint9 1.000000
997
+ skin 938 joint9 1.000000
998
+ skin 939 joint9 1.000000
999
+ skin 940 joint9 1.000000
1000
+ skin 941 joint9 1.000000
1001
+ skin 942 joint9 1.000000
1002
+ skin 943 joint2 0.690712 joint9 0.309288
1003
+ skin 944 joint2 0.208580 joint9 0.218358 joint10 0.573062
1004
+ skin 945 joint2 0.208580 joint9 0.218358 joint10 0.573062
1005
+ skin 946 joint2 0.609748 joint10 0.390252
1006
+ skin 947 joint2 1.000000
1007
+ skin 948 joint2 0.694080 joint9 0.305920
1008
+ skin 949 joint2 0.694080 joint9 0.305920
1009
+ skin 950 joint2 1.000000
1010
+ skin 951 joint2 0.723693 joint10 0.276307
1011
+ skin 952 joint2 0.690712 joint9 0.309288
1012
+ skin 953 joint1 0.327214 joint2 0.672786
1013
+ skin 954 joint1 0.343899 joint2 0.656101
1014
+ skin 955 joint1 0.343899 joint2 0.656101
1015
+ skin 956 joint2 1.000000
1016
+ skin 957 joint0 1.000000
1017
+ skin 958 joint0 1.000000
1018
+ skin 959 joint1 0.358279 joint2 0.641721
1019
+ skin 960 joint2 1.000000
1020
+ skin 961 joint0 1.000000
1021
+ skin 962 joint1 0.373054 joint2 0.626946
1022
+ skin 963 joint1 1.000000
1023
+ skin 964 joint1 1.000000
1024
+ skin 965 joint1 1.000000
1025
+ skin 966 joint1 1.000000
1026
+ skin 967 joint1 0.523196 joint2 0.476804
1027
+ skin 968 joint1 1.000000
1028
+ skin 969 joint1 1.000000
1029
+ skin 970 joint1 0.303925 joint2 0.696075
1030
+ skin 971 joint1 1.000000
1031
+ skin 972 joint1 1.000000
1032
+ skin 973 joint0 1.000000
1033
+ skin 974 joint0 1.000000
1034
+ skin 975 joint0 1.000000
1035
+ skin 976 joint0 1.000000
1036
+ skin 977 joint0 1.000000
1037
+ skin 978 joint0 1.000000
1038
+ skin 979 joint0 1.000000
1039
+ skin 980 joint0 1.000000
1040
+ skin 981 joint1 0.303925 joint2 0.696075
1041
+ skin 982 joint1 1.000000
1042
+ skin 983 joint0 1.000000
1043
+ skin 984 joint2 0.537824 joint9 0.462176
1044
+ skin 985 joint9 1.000000
1045
+ skin 986 joint9 1.000000
1046
+ skin 987 joint9 1.000000
1047
+ skin 988 joint10 0.478152 joint11 0.288492 joint12 0.233357
1048
+ skin 989 joint10 0.478152 joint11 0.288492 joint12 0.233357
1049
+ skin 990 joint10 0.205166 joint11 0.449742 joint12 0.345092
1050
+ skin 991 joint12 1.000000
1051
+ skin 992 joint10 0.478152 joint11 0.288492 joint12 0.233357
1052
+ skin 993 joint12 1.000000
1053
+ skin 994 joint10 0.267198 joint11 0.441405 joint12 0.291397
1054
+ skin 995 joint10 1.000000
1055
+ skin 996 joint25 1.000000
1056
+ skin 997 joint25 1.000000
1057
+ skin 998 joint25 1.000000
1058
+ skin 999 joint25 1.000000
1059
+ skin 1000 joint25 1.000000
1060
+ skin 1001 joint25 1.000000
1061
+ skin 1002 joint25 1.000000
1062
+ skin 1003 joint25 1.000000
1063
+ skin 1004 joint25 1.000000
1064
+ skin 1005 joint25 1.000000
1065
+ skin 1006 joint25 1.000000
1066
+ skin 1007 joint25 1.000000
1067
+ skin 1008 joint25 1.000000
1068
+ skin 1009 joint25 1.000000
1069
+ skin 1010 joint9 0.306658 joint25 0.693342
1070
+ skin 1011 joint25 1.000000
1071
+ skin 1012 joint25 1.000000
1072
+ skin 1013 joint25 1.000000
1073
+ skin 1014 joint25 1.000000
1074
+ skin 1015 joint25 1.000000
1075
+ skin 1016 joint25 1.000000
1076
+ skin 1017 joint25 1.000000
1077
+ skin 1018 joint25 1.000000
1078
+ skin 1019 joint25 1.000000
1079
+ skin 1020 joint25 1.000000
1080
+ skin 1021 joint25 1.000000
1081
+ skin 1022 joint25 1.000000
1082
+ skin 1023 joint25 1.000000
1083
+ skin 1024 joint25 1.000000
1084
+ skin 1025 joint25 1.000000
1085
+ skin 1026 joint25 1.000000
1086
+ skin 1027 joint25 1.000000
1087
+ skin 1028 joint25 1.000000
1088
+ skin 1029 joint25 1.000000
1089
+ skin 1030 joint25 1.000000
1090
+ skin 1031 joint25 1.000000
1091
+ skin 1032 joint25 1.000000
1092
+ skin 1033 joint25 1.000000
1093
+ skin 1034 joint25 1.000000
1094
+ skin 1035 joint25 1.000000
1095
+ skin 1036 joint25 1.000000
1096
+ skin 1037 joint25 1.000000
1097
+ skin 1038 joint25 1.000000
1098
+ skin 1039 joint25 1.000000
1099
+ skin 1040 joint25 1.000000
1100
+ skin 1041 joint25 1.000000
1101
+ skin 1042 joint25 1.000000
1102
+ skin 1043 joint25 1.000000
1103
+ skin 1044 joint25 1.000000
1104
+ skin 1045 joint25 1.000000
1105
+ skin 1046 joint25 1.000000
1106
+ skin 1047 joint25 1.000000
1107
+ skin 1048 joint25 1.000000
1108
+ skin 1049 joint25 1.000000
1109
+ skin 1050 joint25 1.000000
1110
+ skin 1051 joint25 1.000000
1111
+ skin 1052 joint25 1.000000
1112
+ skin 1053 joint25 1.000000
1113
+ skin 1054 joint25 1.000000
1114
+ skin 1055 joint25 1.000000
1115
+ skin 1056 joint25 1.000000
1116
+ skin 1057 joint25 1.000000
1117
+ skin 1058 joint25 1.000000
1118
+ skin 1059 joint25 1.000000
1119
+ skin 1060 joint25 1.000000
1120
+ skin 1061 joint25 1.000000
1121
+ skin 1062 joint25 1.000000
1122
+ skin 1063 joint25 1.000000
1123
+ skin 1064 joint25 1.000000
1124
+ skin 1065 joint25 1.000000
1125
+ skin 1066 joint25 1.000000
1126
+ skin 1067 joint25 1.000000
1127
+ skin 1068 joint25 1.000000
1128
+ skin 1069 joint25 1.000000
1129
+ skin 1070 joint25 1.000000
1130
+ skin 1071 joint3 1.000000
1131
+ skin 1072 joint3 1.000000
1132
+ skin 1073 joint3 1.000000
1133
+ skin 1074 joint3 1.000000
1134
+ skin 1075 joint3 1.000000
1135
+ skin 1076 joint3 1.000000
1136
+ skin 1077 joint3 1.000000
1137
+ skin 1078 joint3 1.000000
1138
+ skin 1079 joint3 1.000000
1139
+ skin 1080 joint3 1.000000
1140
+ skin 1081 joint3 1.000000
1141
+ skin 1082 joint3 1.000000
1142
+ skin 1083 joint3 1.000000
1143
+ skin 1084 joint3 1.000000
1144
+ skin 1085 joint3 0.665906 joint9 0.334094
1145
+ skin 1086 joint3 0.332876 joint9 0.667124
1146
+ skin 1087 joint3 0.467223 joint9 0.532777
1147
+ skin 1088 joint3 1.000000
1148
+ skin 1089 joint3 1.000000
1149
+ skin 1090 joint3 1.000000
1150
+ skin 1091 joint3 1.000000
1151
+ skin 1092 joint3 1.000000
1152
+ skin 1093 joint3 1.000000
1153
+ skin 1094 joint3 1.000000
1154
+ skin 1095 joint3 1.000000
1155
+ skin 1096 joint3 0.332876 joint9 0.667124
1156
+ skin 1097 joint3 0.467223 joint9 0.532777
1157
+ skin 1098 joint3 1.000000
1158
+ skin 1099 joint3 1.000000
1159
+ skin 1100 joint3 1.000000
1160
+ skin 1101 joint3 1.000000
1161
+ skin 1102 joint3 1.000000
1162
+ skin 1103 joint3 1.000000
1163
+ skin 1104 joint3 1.000000
1164
+ skin 1105 joint3 1.000000
1165
+ skin 1106 joint3 1.000000
1166
+ skin 1107 joint3 1.000000
1167
+ skin 1108 joint3 1.000000
1168
+ skin 1109 joint3 1.000000
1169
+ skin 1110 joint3 1.000000
1170
+ skin 1111 joint3 1.000000
1171
+ skin 1112 joint3 1.000000
1172
+ skin 1113 joint3 1.000000
1173
+ skin 1114 joint3 1.000000
1174
+ skin 1115 joint3 1.000000
1175
+ skin 1116 joint3 1.000000
1176
+ skin 1117 joint3 1.000000
1177
+ skin 1118 joint3 1.000000
1178
+ skin 1119 joint3 1.000000
1179
+ skin 1120 joint3 1.000000
1180
+ skin 1121 joint3 1.000000
1181
+ skin 1122 joint3 1.000000
1182
+ skin 1123 joint3 1.000000
1183
+ skin 1124 joint3 1.000000
1184
+ skin 1125 joint3 1.000000
1185
+ skin 1126 joint3 1.000000
1186
+ skin 1127 joint3 1.000000
1187
+ skin 1128 joint3 1.000000
1188
+ skin 1129 joint3 1.000000
1189
+ skin 1130 joint3 1.000000
1190
+ skin 1131 joint3 1.000000
1191
+ skin 1132 joint3 1.000000
1192
+ skin 1133 joint3 1.000000
1193
+ skin 1134 joint3 1.000000
1194
+ skin 1135 joint3 1.000000
1195
+ skin 1136 joint3 1.000000
1196
+ skin 1137 joint3 1.000000
1197
+ skin 1138 joint3 1.000000
1198
+ skin 1139 joint3 1.000000
1199
+ skin 1140 joint3 1.000000
1200
+ skin 1141 joint3 1.000000
1201
+ skin 1142 joint3 1.000000
1202
+ skin 1143 joint3 1.000000
1203
+ skin 1144 joint3 1.000000
1204
+ skin 1145 joint3 1.000000
animation/model.py ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import torch
16
+ from typing import List, Optional, Tuple, Union
17
+ from collections import deque
18
+ from pytorch3d.structures import Meshes, join_meshes_as_scene
19
+ from pytorch3d.renderer import TexturesVertex, TexturesUV
20
+
21
+ from utils.quat_utils import quat_to_transform_matrix, quat_multiply, quat_rotate_vector
22
+
23
+ class RiggingModel:
24
+ """
25
+ A 3D rigged model supporting skeletal animation.
26
+
27
+ Handles mesh geometry, skeletal hierarchy, skinning weights, and
28
+ linear blend skinning (LBS) deformation.
29
+ """
30
+ def __init__(self, device = "cuda:0"):
31
+ self.device = device
32
+ # Mesh data
33
+ self.vertices: List[torch.Tensor] = []
34
+ self.faces: List[torch.Tensor] = []
35
+ self.textures: List[Union[TexturesVertex, TexturesUV]] = []
36
+
37
+ # Skeletal data
38
+ self.bones: Optional[torch.Tensor] = None # (N, 2) [parent, child] pairs
39
+ self.parent_indices: Optional[torch.Tensor] = None # (J,) parent index for each joint
40
+ self.root_index: Optional[int] = None # Root joint index
41
+ self.joints_rest: Optional[torch.Tensor] = None # (J, 3) rest pose positions
42
+ self.skin_weights: List[torch.Tensor] = [] # List of (V_i, J) skinning weights
43
+
44
+ # Fixed local positions
45
+ self.rest_local_positions: Optional[torch.Tensor] = None # (J, 3)
46
+
47
+ # Computed data
48
+ self.bind_matrices_inv: Optional[torch.Tensor] = None # (J, 4, 4) inverse bind matrices
49
+ self.deformed_vertices: Optional[List[torch.Tensor]] = None # List of (T, V_i, 3)
50
+ self.joint_positions: Optional[torch.Tensor] = None # (T, J, 3) current joint positions
51
+
52
+ # Validation flags
53
+ self._bind_matrices_initialized = False
54
+
55
+ def initialize_bind_matrices(self, rest_local_pos):
56
+ """Initialize bind matrices and store rest local positions."""
57
+ self.rest_local_positions = rest_local_pos.to(self.device)
58
+
59
+ J = rest_local_pos.shape[0]
60
+ rest_global_quats, rest_global_pos = self.forward_kinematics(
61
+ torch.tensor([[[1.0, 0.0, 0.0, 0.0]] * J], device=self.device), # unit quaternion
62
+ self.parent_indices,
63
+ self.root_index
64
+ )
65
+
66
+ bind_matrices = quat_to_transform_matrix(rest_global_quats, rest_global_pos) # (1,J,4,4)
67
+ self.bind_matrices_inv = torch.inverse(bind_matrices.squeeze(0)) # (J,4,4)
68
+
69
+ self._bind_matrices_initialized = True
70
+
71
+ def animate(self, local_quaternions, root_quaternion = None, root_position = None):
72
+ """
73
+ Animate the model using local joint transformations.
74
+
75
+ Args:
76
+ local_quaternions: (T, J, 4) local rotations per frame
77
+ root_quaternion: (T, 4) global root rotation
78
+ root_position: (T, 3) global root translation
79
+ """
80
+ if not self._bind_matrices_initialized:
81
+ raise RuntimeError("Bind matrices not initialized. Call initialize_bind_matrices() first.")
82
+
83
+ # Forward kinematics
84
+ global_quats, global_pos = self.forward_kinematics(
85
+ local_quaternions,
86
+ self.parent_indices,
87
+ self.root_index
88
+ )
89
+ self.joint_positions = global_pos
90
+
91
+ joint_transforms = quat_to_transform_matrix(global_quats, global_pos) # (T, J, 4, 4)
92
+
93
+ # Apply global root transformation if provided
94
+ if root_quaternion is not None and root_position is not None:
95
+ root_transform = quat_to_transform_matrix(root_quaternion, root_position)
96
+ joint_transforms = root_transform[:, None] @ joint_transforms
97
+ self.joint_positions = joint_transforms[..., :3, 3]
98
+
99
+ # Linear blend skinning
100
+ self.deformed_vertices = []
101
+ for i, vertices in enumerate(self.vertices):
102
+ deformed = self._linear_blend_skinning(
103
+ vertices,
104
+ joint_transforms,
105
+ self.skin_weights[i],
106
+ self.bind_matrices_inv
107
+ )
108
+ self.deformed_vertices.append(deformed)
109
+
110
+
111
+ def get_mesh(self, frame_idx=None):
112
+ meshes = []
113
+ for i in range(len(self.vertices)):
114
+ mesh = Meshes(
115
+ verts=[self.vertices[i]] if frame_idx is None or self.deformed_vertices is None else [self.deformed_vertices[i][frame_idx]],
116
+ faces=[self.faces[i]],
117
+ textures=self.textures[i]
118
+ )
119
+ meshes.append(mesh)
120
+ return join_meshes_as_scene(meshes)
121
+
122
+ def _linear_blend_skinning(self, vertices, joint_transforms, skin_weights, bind_matrices_inv):
123
+ """
124
+ Apply linear blend skinning to vertices.
125
+
126
+ Args:
127
+ vertices: (V, 3) vertex positions
128
+ joint_transforms: (T, J, 4, 4) joint transformation matrices
129
+ skin_weights: (V, J) per-vertex joint weights
130
+ bind_matrices_inv: (J, 4, 4) inverse bind matrices
131
+
132
+ Returns:
133
+ (T, V, 3) deformed vertices
134
+ """
135
+ # Compute final transformation matrices
136
+ transforms = torch.matmul(joint_transforms, bind_matrices_inv) # (T, J, 4, 4)
137
+
138
+ # Weight and blend transformations
139
+ weighted_transforms = torch.einsum('vj,tjab->tvab', skin_weights, transforms) # (T, V, 4, 4)
140
+
141
+ # Apply to vertices
142
+ vertices_hom = torch.cat([vertices, torch.ones(vertices.shape[0], 1, device=vertices.device)], dim=-1)
143
+ deformed = torch.matmul(weighted_transforms, vertices_hom.unsqueeze(-1)).squeeze(-1)
144
+
145
+ return deformed[..., :3]
146
+
147
+ def forward_kinematics(self, local_quaternions, parent_indices, root_index = 0):
148
+ """
149
+ Compute global joint transformations from local ones.
150
+
151
+ Args:
152
+ local_quaternions: (B, J, 4) local rotations
153
+ parent_indices: (J,) parent index for each joint
154
+ root_index: Root joint index
155
+
156
+ Returns:
157
+ Tuple of (global_quaternions, global_positions)
158
+ """
159
+ B, J = local_quaternions.shape[:2]
160
+ local_positions = self.rest_local_positions.unsqueeze(0).expand(B, -1, -1)
161
+
162
+
163
+ # Initialize storage
164
+ global_quats = [None] * J
165
+ global_positions = [None] * J
166
+
167
+ # Build children mapping
168
+ children = [[] for _ in range(J)]
169
+ for child_idx in range(J):
170
+ parent_idx = parent_indices[child_idx]
171
+ if parent_idx >= 0:
172
+ children[parent_idx].append(child_idx)
173
+
174
+ # Breadth-first traversal from root
175
+ queue = deque([root_index])
176
+ visited = {root_index}
177
+
178
+ # Process root
179
+ global_quats[root_index] = local_quaternions[:, root_index]
180
+ global_positions[root_index] = local_positions[:, root_index]
181
+
182
+ while queue:
183
+ current = queue.popleft()
184
+ current_quat = global_quats[current]
185
+ current_pos = global_positions[current]
186
+
187
+ for child in children[current]:
188
+ if child not in visited:
189
+ visited.add(child)
190
+ queue.append(child)
191
+
192
+ # Transform child to global space
193
+ child_quat = quat_multiply(current_quat, local_quaternions[:, child])
194
+ child_pos = quat_rotate_vector(current_quat, local_positions[:, child]) + current_pos
195
+
196
+ global_quats[child] = child_quat
197
+ global_positions[child] = child_pos
198
+
199
+ return torch.stack(global_quats, dim=1), torch.stack(global_positions, dim=1)
animation/optimization.py ADDED
@@ -0,0 +1,626 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ import os
17
+ import argparse
18
+ import json
19
+ import numpy as np
20
+ import logging
21
+ import glob
22
+ import torch
23
+ import torch.nn.functional as F
24
+ from PIL import Image
25
+ from tqdm import tqdm
26
+
27
+ from renderer import MeshRenderer3D
28
+ from model import RiggingModel
29
+ from utils.quat_utils import (
30
+ compute_rest_local_positions, quat_inverse, quat_log, quat_multiply
31
+ )
32
+ from utils.loss_utils import (
33
+ DepthModule, compute_reprojection_loss, geodesic_loss, root_motion_reg,
34
+ calculate_flow_loss, compute_depth_loss_normalized, joint_motion_coherence
35
+ )
36
+ from utils.data_loader import load_model_from_obj_and_rig, prepare_depth
37
+ from utils.save_utils import (
38
+ save_args, visualize_joints_on_mesh, save_final_video,
39
+ save_and_smooth_results, visualize_points_on_mesh, save_track_points
40
+ )
41
+ from utils.misc import warmup_then_decay
42
+ from third_partys.co_tracker.save_track import save_track
43
+
44
+ class AnimationOptimizer:
45
+ """Main class for animation optimization with video guidance."""
46
+
47
+ def __init__(self, args, device = 'cuda:0'):
48
+ self.args = args
49
+ self.device = device
50
+ self.logger = self._setup_logger()
51
+
52
+ # Training parameters
53
+ self.reinit_patience_threshold = 20
54
+ self.loss_divergence_factor = 2.0
55
+ self.gradient_clip_norm = 1.0
56
+
57
+ # Loss weights
58
+ self.target_ratios = {
59
+ 'rgb': args.rgb_wt,
60
+ 'flow': args.flow_wt,
61
+ 'proj_joint': args.proj_joint_wt,
62
+ 'proj_vert': args.proj_vert_wt,
63
+ 'depth': args.depth_wt,
64
+ 'mask': args.mask_wt
65
+ }
66
+ self.loss_weights = {
67
+ 'rgb': 1.0,
68
+ 'flow': 1.0,
69
+ 'proj_joint': 1.0,
70
+ 'proj_vert': 1.0,
71
+ 'depth': 1.0,
72
+ 'mask': 1.0
73
+ }
74
+
75
+ def _setup_logger(self):
76
+ """Set up logging configuration."""
77
+ logger = logging.getLogger("animation_optimizer")
78
+ logger.setLevel(logging.INFO)
79
+
80
+ if not logger.handlers:
81
+ formatter = logging.Formatter(
82
+ "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
83
+ )
84
+ console_handler = logging.StreamHandler()
85
+ console_handler.setFormatter(formatter)
86
+ logger.addHandler(console_handler)
87
+
88
+ return logger
89
+ def _add_file_handler(self, log_path):
90
+ """Add file handler to logger."""
91
+ file_handler = logging.FileHandler(log_path)
92
+ formatter = logging.Formatter("%(asctime)s %(message)s")
93
+ file_handler.setFormatter(formatter)
94
+ self.logger.addHandler(file_handler)
95
+
96
+ def _initialize_parameters(self, batch_size, num_joints):
97
+ """Initialize optimization parameters."""
98
+
99
+ # Fixed first frame quaternions (identity)
100
+ fixed_quat_0 = torch.zeros((1, num_joints, 4), device=self.device)
101
+ fixed_quat_0[..., 0] = 1.0
102
+
103
+ # Initialize learnable quaternions for frames 1 to B-1
104
+ learn_quats_init = torch.zeros((batch_size - 1, num_joints, 4), device=self.device)
105
+ learn_quats_init[..., 0] = 1.0
106
+ quats_to_optimize = learn_quats_init.clone().detach().requires_grad_(True)
107
+
108
+ # Initialize global transformations
109
+ fixed_global_quat_0 = torch.zeros((1, 4), device=self.device)
110
+ fixed_global_quat_0[:, 0] = 1.0
111
+ fixed_global_trans_0 = torch.zeros((1, 3), device=self.device)
112
+
113
+ # Initialize learnable global transformations
114
+ global_quats_init = torch.zeros((batch_size - 1, 4), device=self.device)
115
+ global_quats_init[:, 0] = 1.0
116
+ global_trans_init = torch.zeros((batch_size - 1, 3), device=self.device)
117
+
118
+ global_quats = global_quats_init.clone().detach().requires_grad_(True)
119
+ global_trans = global_trans_init.clone().detach().requires_grad_(True)
120
+
121
+ return quats_to_optimize, global_quats, global_trans, fixed_quat_0, fixed_global_quat_0, fixed_global_trans_0
122
+
123
+ def _setup_optimizer_and_scheduler(self, quats_to_optimize, global_quats, global_trans, n_iters):
124
+ """Set up optimizer and learning rate scheduler."""
125
+
126
+ base_lr = self.args.warm_lr
127
+ max_lr = self.args.lr
128
+ warmup_steps = 20
129
+
130
+ min_lr = self.args.min_lr
131
+ quat_lr = base_lr # *2
132
+
133
+ optimizer = torch.optim.AdamW([
134
+ {'params': quats_to_optimize, 'lr': quat_lr},
135
+ {'params': global_quats, 'lr': quat_lr},
136
+ {'params': global_trans, 'lr': base_lr}
137
+ ])
138
+
139
+ scheduler = warmup_then_decay(
140
+ optimizer=optimizer,
141
+ total_steps=n_iters,
142
+ warmup_steps=warmup_steps,
143
+ max_lr=max_lr,
144
+ min_lr=min_lr,
145
+ base_lr=base_lr
146
+ )
147
+
148
+ return optimizer, scheduler
149
+
150
+ def _compute_smoothness_losses(self, quats_normed, all_global_quats_normed, all_global_trans, model):
151
+ """Compute various smoothness losses."""
152
+
153
+ # Rotation smoothness loss using geodesic distance
154
+ theta = geodesic_loss(quats_normed[1:], quats_normed[:-1])
155
+ rot_smoothness_loss = (theta ** 2).mean()
156
+
157
+ # Second-order rotation smoothness (acceleration)
158
+ omega = quat_log(quat_multiply(quat_inverse(quats_normed[:-1]), quats_normed[1:]))
159
+ rot_acc = omega[1:] - omega[:-1]
160
+ rot_acc_smoothness_loss = rot_acc.pow(2).mean()
161
+
162
+ # Joint motion coherence loss (parent-child relative motion smoothness)
163
+ joint_coherence_loss = joint_motion_coherence(quats_normed, model.parent_indices)
164
+
165
+ # Root motion regularization
166
+ root_pos_smooth_loss, root_quat_smooth_loss = root_motion_reg(
167
+ all_global_quats_normed, all_global_trans
168
+ )
169
+
170
+ return rot_smoothness_loss, rot_acc_smoothness_loss, joint_coherence_loss, root_pos_smooth_loss + root_quat_smooth_loss
171
+
172
+ def pre_calibrate_loss_weights(self, loss_components, target_ratios=None):
173
+ """ calibrate loss weights """
174
+ loss_for_ratio = {name: loss.detach().clone() for name, loss in loss_components.items()}
175
+
176
+ rgb_loss = loss_for_ratio['rgb'].item()
177
+
178
+ for name, loss_val in loss_for_ratio.items():
179
+ if name == 'rgb':
180
+ continue
181
+
182
+ if loss_val > 1e-8:
183
+ scale_factor = rgb_loss / loss_val.item()
184
+ target_ratio = target_ratios.get(name, 1.0)
185
+ new_weight = self.loss_weights.get(name, 1.0) * scale_factor * target_ratio
186
+
187
+ self.loss_weights[name] = new_weight
188
+
189
+ def _compute_losses(
190
+ self,
191
+ model,
192
+ renderer,
193
+ images_batch,
194
+ tracked_joints_2d,
195
+ joint_vis_mask,
196
+ track_verts_2d,
197
+ vert_vis_mask,
198
+ sampled_vertex_indices,
199
+ track_indices,
200
+ flow_dirs,
201
+ depth_gt_raw,
202
+ mask,
203
+ out_dir,
204
+ iteration
205
+ ):
206
+ """Compute all losses for the optimization."""
207
+
208
+ batch_size = images_batch.shape[0]
209
+ meshes = [model.get_mesh(t) for t in range(batch_size)]
210
+ pred_images_all = renderer.render_batch(meshes)
211
+
212
+ # 2D projection losses
213
+ pred_joints_3d = model.joint_positions
214
+ proj_joint_loss = compute_reprojection_loss(
215
+ renderer, joint_vis_mask, pred_joints_3d,
216
+ tracked_joints_2d, self.args.img_size
217
+ )
218
+
219
+ pred_points_3d = model.deformed_vertices[0]
220
+ proj_vert_loss = compute_reprojection_loss(
221
+ renderer, vert_vis_mask,
222
+ pred_points_3d[:, sampled_vertex_indices],
223
+ track_verts_2d[:, track_indices],
224
+ self.args.img_size
225
+ )
226
+
227
+ # RGB loss
228
+ pred_rgb = pred_images_all[..., :3]
229
+ real_rgb = images_batch[..., :3]
230
+ diff_rgb_masked = (pred_rgb - real_rgb) * mask.unsqueeze(-1)
231
+
232
+ mse_rgb_num = (diff_rgb_masked ** 2).sum()
233
+ mse_rgb_den = mask.sum() * 3
234
+ rgb_loss = mse_rgb_num / mse_rgb_den.clamp_min(1e-8)
235
+
236
+ # Mask loss
237
+ silhouette_soft = renderer.render_silhouette_batch(meshes).squeeze()
238
+ mask_loss = F.binary_cross_entropy(silhouette_soft, mask)
239
+
240
+ # Depth losses
241
+ fragments = renderer.get_rasterization_fragments(meshes)
242
+ zbuf_depths = fragments.zbuf[..., 0]
243
+ depth_loss = compute_depth_loss_normalized(depth_gt_raw, zbuf_depths, mask)
244
+
245
+ # Flow losses
246
+ flow_loss = calculate_flow_loss(flow_dirs, self.device, mask, renderer, model)
247
+
248
+ loss_components = {
249
+ 'rgb': rgb_loss,
250
+ 'proj_joint': proj_joint_loss,
251
+ 'proj_vert': proj_vert_loss,
252
+ 'depth': depth_loss,
253
+ 'flow': flow_loss,
254
+ 'mask': mask_loss
255
+ }
256
+
257
+ return loss_components
258
+
259
+ def optimization(
260
+ self,
261
+ images_batch,
262
+ model,
263
+ renderer,
264
+ tracked_joints_2d,
265
+ joint_vis_mask,
266
+ track_verts_2d,
267
+ vert_vis_mask,
268
+ sampled_vertex_indices,
269
+ track_indices,
270
+ flow_dirs,
271
+ n_iters,
272
+ out_dir):
273
+ """
274
+ Optimize animation parameters with fixed first frame.
275
+ """
276
+ torch.autograd.set_detect_anomaly(True)
277
+
278
+ batch_size, _, _, _ = images_batch.shape
279
+ num_joints = model.joints_rest.shape[0]
280
+
281
+ # Setup output directory and logging
282
+ os.makedirs(out_dir, exist_ok=True)
283
+ log_path = os.path.join(out_dir, "optimization.log")
284
+ self._add_file_handler(log_path)
285
+
286
+ # Initialize parameters
287
+ (quats_to_optimize, global_quats, global_trans,
288
+ fixed_quat_0, fixed_global_quat_0, fixed_global_trans_0) = self._initialize_parameters(batch_size, num_joints)
289
+
290
+ # Setup rest positions and bind matrices
291
+ rest_local_pos = compute_rest_local_positions(model.joints_rest, model.parent_indices)
292
+ model.initialize_bind_matrices(rest_local_pos)
293
+
294
+ # Setup optimizer and scheduler
295
+ optimizer, scheduler = self._setup_optimizer_and_scheduler(
296
+ quats_to_optimize, global_quats, global_trans, n_iters
297
+ )
298
+
299
+ # Initialize depth module and flow weights
300
+ depth_module = DepthModule(
301
+ encoder='vitl',
302
+ device=self.device,
303
+ input_size=images_batch.shape[1],
304
+ fp32=False
305
+ )
306
+
307
+ # Prepare masks
308
+ real_rgb = images_batch[..., :3]
309
+ threshold = 0.95
310
+ with torch.no_grad():
311
+ background_mask = (real_rgb > threshold).all(dim=-1)
312
+ mask = (~background_mask).float()
313
+
314
+ depth_gt_raw = prepare_depth(
315
+ flow_dirs.replace('flow', 'depth'), real_rgb, self.device, depth_module
316
+ )
317
+
318
+ # Optimization tracking
319
+ best_loss = float('inf')
320
+ patience = 0
321
+ best_params = None
322
+
323
+ pbar = tqdm(total=n_iters, desc="Optimizing animation")
324
+
325
+ for iteration in range(n_iters):
326
+ # Combine fixed and learnable parameters
327
+ quats_all = torch.cat([fixed_quat_0, quats_to_optimize], dim=0)
328
+
329
+ # Normalize quaternions
330
+ reshaped = quats_all.reshape(-1, 4)
331
+ norm = torch.norm(reshaped, dim=1, keepdim=True).clamp_min(1e-8)
332
+ quats_normed = (reshaped / norm).reshape(batch_size, num_joints, 4)
333
+
334
+ # Global transformations
335
+ all_global_quats = torch.cat([fixed_global_quat_0, global_quats], dim=0)
336
+ all_global_trans = torch.cat([fixed_global_trans_0, global_trans], dim=0)
337
+ all_global_quats_normed = all_global_quats / torch.norm(
338
+ all_global_quats, dim=-1, keepdim=True
339
+ ).clamp_min(1e-8)
340
+
341
+ # Compute smoothness losses
342
+ (rot_smoothness_loss, rot_acc_smoothness_loss, joint_coherence_loss,
343
+ root_smooth_loss) = self._compute_smoothness_losses(
344
+ quats_normed, all_global_quats_normed, all_global_trans, model
345
+ )
346
+
347
+ # animate model
348
+ model.animate(quats_normed, all_global_quats_normed, all_global_trans)
349
+
350
+ # Verify first frame hasn't changed
351
+ verts0 = model.vertices[0]
352
+ de0 = model.deformed_vertices[0][0]
353
+ assert torch.allclose(de0, verts0, atol=1e-2), "First frame vertices have changed!"
354
+
355
+ # Compute all losses
356
+ loss_components = self._compute_losses(
357
+ model, renderer, images_batch, tracked_joints_2d, joint_vis_mask,
358
+ track_verts_2d, vert_vis_mask, sampled_vertex_indices, track_indices,
359
+ flow_dirs, depth_gt_raw, mask, out_dir, iteration
360
+ )
361
+
362
+ total_smoothness_loss = rot_smoothness_loss + rot_acc_smoothness_loss * 10
363
+
364
+ if iteration == 0:
365
+ self.pre_calibrate_loss_weights(loss_components, self.target_ratios)
366
+
367
+ total_loss = (
368
+ loss_components['rgb'] +
369
+ self.loss_weights['mask'] * loss_components['mask'] +
370
+ self.loss_weights['flow'] * loss_components['flow'] +
371
+ self.loss_weights['proj_joint'] * loss_components['proj_joint'] +
372
+ self.loss_weights['proj_vert'] * loss_components['proj_vert'] +
373
+ self.loss_weights['depth'] * loss_components['depth'] +
374
+ self.args.smooth_weight * total_smoothness_loss +
375
+ self.args.coherence_weight * joint_coherence_loss +
376
+ self.args.root_smooth_weight * root_smooth_loss
377
+ )
378
+
379
+ # Optimization step
380
+ optimizer.zero_grad()
381
+ total_loss.backward()
382
+ torch.nn.utils.clip_grad_norm_(
383
+ [quats_to_optimize, global_quats, global_trans],
384
+ max_norm=self.gradient_clip_norm
385
+ )
386
+ optimizer.step()
387
+ scheduler.step()
388
+
389
+ # Update progress bar and logging
390
+ loss_desc = (
391
+ f"Loss: {total_loss.item():.4f}, "
392
+ f"RGB: {loss_components['rgb'].item():.4f}, "
393
+ f"Mask: {self.loss_weights['mask'] * loss_components['mask'].item():.4f}, "
394
+ f"Flow: {self.loss_weights['flow'] * loss_components['flow'].item():.4f}, "
395
+ f"Proj_joint: {self.loss_weights['proj_joint'] * loss_components['proj_joint'].item():.4f}, "
396
+ f"Proj_vert: {self.loss_weights['proj_vert'] * loss_components['proj_vert'].item():.4f}, "
397
+ f"Depth: {self.loss_weights['depth'] * loss_components['depth'].item():.4f}, "
398
+ f"Smooth: {self.args.smooth_weight * total_smoothness_loss.item():.4f}, "
399
+ f"Joint smooth: {self.args.coherence_weight * joint_coherence_loss.item():.4f}, "
400
+ f"Root smooth: {self.args.root_smooth_weight * root_smooth_loss.item():.4f}"
401
+ )
402
+ pbar.set_description(loss_desc)
403
+
404
+ if iteration % 5 == 0:
405
+ self.logger.info(f"Iter {iteration}: {loss_desc}")
406
+
407
+ # Adaptive reinitialization
408
+ current_loss = total_loss.item()
409
+ if current_loss < best_loss:
410
+ best_loss = current_loss
411
+ best_params = {
412
+ 'quats': quats_to_optimize.clone().detach(),
413
+ 'global_quats': global_quats.clone().detach(),
414
+ 'global_trans': global_trans.clone().detach()
415
+ }
416
+ patience = 0
417
+ elif (current_loss > best_loss * self.loss_divergence_factor or
418
+ patience > self.reinit_patience_threshold * 2):
419
+ # Reinitialize with best parameters
420
+ quats_to_optimize = best_params['quats'].clone().requires_grad_(True)
421
+ global_quats = best_params['global_quats'].clone().requires_grad_(True)
422
+ global_trans = best_params['global_trans'].clone().requires_grad_(True)
423
+
424
+ optimizer, scheduler = self._setup_optimizer_and_scheduler(
425
+ quats_to_optimize, global_quats, global_trans, n_iters
426
+ )
427
+ patience = 0
428
+ self.logger.info(f'Adaptive reset at iteration {iteration} with best loss: {best_loss:.6f}')
429
+ else:
430
+ patience += 1
431
+
432
+ pbar.update(1)
433
+
434
+ pbar.close()
435
+
436
+ # Prepare final results
437
+ quats_final = torch.cat([fixed_quat_0, best_params['quats']], dim=0)
438
+
439
+ # Final normalization
440
+ reshaped = quats_final.reshape(-1, 4)
441
+ norm = torch.norm(reshaped, dim=1, keepdim=True).clamp_min(1e-8)
442
+ quats_final = (reshaped / norm).reshape(batch_size, num_joints, 4)
443
+
444
+ global_quats_final = torch.cat([fixed_global_quat_0, best_params['global_quats']], dim=0)
445
+ global_trans_final = torch.cat([fixed_global_trans_0, best_params['global_trans']], dim=0)
446
+ global_quats_final = global_quats_final / torch.norm(
447
+ global_quats_final, dim=-1, keepdim=True
448
+ ).clamp_min(1e-8)
449
+
450
+ return quats_final, global_quats_final, global_trans_final
451
+
452
+ def load_and_prepare_data(args):
453
+ """Load and prepare all necessary data for optimization."""
454
+
455
+ # Define paths
456
+ base_path = f'{args.input_path}/{args.seq_name}'
457
+ mesh_path = f'{base_path}/objs/mesh.obj'
458
+ rig_path = f'{base_path}/objs/rig.txt'
459
+ img_path = f'{base_path}/imgs'
460
+ flow_dirs = f'{base_path}/flow'
461
+
462
+ # Load model
463
+ model = load_model_from_obj_and_rig(mesh_path, rig_path, device=args.device)
464
+
465
+ # Load images
466
+ img_files = sorted(glob.glob(os.path.join(img_path, "*.png")))
467
+ images = []
468
+ for f in img_files:
469
+ img = Image.open(f).convert("RGBA")
470
+ arr = np.array(img, dtype=np.float32) / 255.0
471
+ t = torch.from_numpy(arr).to(args.device)
472
+ images.append(t)
473
+
474
+ images_batch = torch.stack(images, dim=0)
475
+
476
+ return model, images_batch, flow_dirs, img_path
477
+
478
+ def setup_renderers(args):
479
+ """Setup multiple renderers for different camera views."""
480
+
481
+ available_views = [
482
+ "front", "back", "left", "right",
483
+ "front_left", "front_right", "back_left", "back_right"
484
+ ]
485
+
486
+ if args.main_renderer not in available_views:
487
+ raise ValueError(f"Main renderer '{args.main_renderer}' not found in available cameras: {available_views}")
488
+
489
+ main_cam_config = json.load(open(f"utils/cameras/{args.main_renderer}.json"))
490
+ main_renderer = MeshRenderer3D(args.device, image_size=args.img_size, cam_params=main_cam_config)
491
+
492
+ additional_views = [view.strip() for view in args.additional_renderers.split(',') if view.strip()]
493
+ if len(additional_views) > 3:
494
+ print(f"Warning: Only first 3 additional renderers will be used. Got: {additional_views}")
495
+ additional_views = additional_views[:3]
496
+
497
+ additional_renderers = {}
498
+ for view_name in additional_views:
499
+ if view_name in available_views and view_name != args.main_renderer:
500
+ cam_config = json.load(open(f"utils/cameras/{view_name}.json"))
501
+ renderer = MeshRenderer3D(args.device, image_size=args.img_size, cam_params=cam_config)
502
+ additional_renderers[f"{view_name}_renderer"] = renderer
503
+ elif view_name == args.main_renderer:
504
+ print(f"Warning: '{view_name}' is already the main renderer, skipping...")
505
+ elif view_name not in available_views:
506
+ print(f"Warning: Camera view '{view_name}' not found, skipping...")
507
+
508
+ return main_renderer, additional_renderers
509
+
510
+ def get_parser():
511
+ """Create argument parser with all configuration options."""
512
+
513
+ parser = argparse.ArgumentParser(description="3D Rigging Optimization")
514
+
515
+ # Training parameters
516
+ training_group = parser.add_argument_group('Training')
517
+ training_group.add_argument("--iter", type=int, default=500, help="Number of training iterations")
518
+ training_group.add_argument("--img_size", type=int, default=512, help="Image resolution")
519
+ training_group.add_argument("--device", type=str, default="cuda:0", help="Device to use")
520
+ training_group.add_argument("--img_fps", type=int, default=15, help="Image frame rate")
521
+ training_group.add_argument('--main_renderer', type=str, default='front', help='Main renderer camera view (default: front)')
522
+ training_group.add_argument('--additional_renderers', type=str, default="back, right, left", help='Additional renderer views (max 3), comma-separated (e.g., "back,left,right"). ')
523
+
524
+ # Learning rates
525
+ lr_group = parser.add_argument_group('Learning Rates')
526
+ lr_group.add_argument("--lr", type=float, default=2e-3, help="Base learning rate")
527
+ lr_group.add_argument("--min_lr", type=float, default=1e-5, help="Minimum learning rate")
528
+ lr_group.add_argument("--warm_lr", type=float, default=1e-5, help="Warmup learning rate")
529
+
530
+ # Loss weights
531
+ loss_group = parser.add_argument_group('Loss Weights')
532
+ loss_group.add_argument("--smooth_weight", type=float, default=0.2)
533
+ loss_group.add_argument("--root_smooth_weight", type=float, default=1.0)
534
+ loss_group.add_argument("--coherence_weight", type=float, default=10)
535
+ loss_group.add_argument("--rgb_wt", type=float, default=1.0, help="RGB loss target ratio (relative importance)")
536
+ loss_group.add_argument("--mask_wt", type=float, default=1.0, help="Mask loss target ratio")
537
+ loss_group.add_argument("--proj_joint_wt", type=float, default=1.5, help="Joint projection loss target ratio")
538
+ loss_group.add_argument("--proj_vert_wt", type=float, default=3.0, help="Point projection loss target ratio")
539
+ loss_group.add_argument("--depth_wt", type=float, default=0.8, help="Depth loss target ratio")
540
+ loss_group.add_argument("--flow_wt", type=float, default=0.8, help="Flow loss target ratio")
541
+
542
+ # Data and output
543
+ data_group = parser.add_argument_group('Data and Output')
544
+ data_group.add_argument("--input_path", type=str, default="inputs")
545
+ data_group.add_argument("--save_path", type=str, default="results")
546
+ data_group.add_argument("--save_name", type=str, default="results")
547
+ data_group.add_argument("--seq_name", type=str, default=None)
548
+
549
+ # Flags
550
+ flag_group = parser.add_argument_group('Flags')
551
+ flag_group.add_argument('--gauss_filter', action='store_true', default=False)
552
+ return parser
553
+
554
+ def main():
555
+ parser = get_parser()
556
+ args = parser.parse_args()
557
+
558
+ # Setup output directory
559
+ out_dir = f'{args.save_path}/{args.seq_name}/{args.save_name}'
560
+ save_args(args, out_dir)
561
+
562
+ # Initialize optimizer
563
+ ani_optimizer = AnimationOptimizer(args, device=args.device)
564
+
565
+ # Setup renderers
566
+ renderer, additional_renderers = setup_renderers(args)
567
+
568
+ # Load and prepare data
569
+ model, images_batch, flow_dirs, img_path = load_and_prepare_data(args)
570
+
571
+ # Setup tracking
572
+ joint_vis_mask = visualize_joints_on_mesh(model, renderer, args.seq_name, out_dir=out_dir)
573
+ joint_vis_mask = torch.from_numpy(joint_vis_mask).float().to(args.device)
574
+
575
+ joint_project_2d = renderer.project_points(model.joints_rest)
576
+
577
+ # Setup track paths
578
+ track_2d_path = img_path.replace('imgs', 'track_2d_joints')
579
+ os.makedirs(track_2d_path, exist_ok=True)
580
+
581
+ # Load or generate tracks
582
+ if not os.listdir(track_2d_path):
583
+ print("Generating joint tracks")
584
+ tracked_joints_2d = save_track(args.seq_name, joint_project_2d, img_path, track_2d_path, out_dir)
585
+ else:
586
+ print("Loading existing joint tracks")
587
+ tracked_joints_2d = np.load(f'{track_2d_path}/pred_tracks.npy')
588
+
589
+ # Setup point tracking
590
+ vert_vis_mask = visualize_points_on_mesh(model, renderer, args.seq_name, out_dir=out_dir)
591
+ vert_vis_mask = torch.from_numpy(vert_vis_mask).float().to(args.device)
592
+
593
+ track_verts_2d, track_indices, sampled_vertex_indices = save_track_points(
594
+ vert_vis_mask, renderer, model, img_path, out_dir, args
595
+ )
596
+ vert_vis_mask = vert_vis_mask[sampled_vertex_indices]
597
+
598
+ # Run optimization
599
+ print(f"Starting optimization")
600
+ final_quats, root_quats, root_pos = ani_optimizer.optimization(
601
+ images_batch=images_batch,
602
+ model=model,
603
+ renderer=renderer,
604
+ tracked_joints_2d=tracked_joints_2d,
605
+ joint_vis_mask=joint_vis_mask,
606
+ track_verts_2d=track_verts_2d,
607
+ vert_vis_mask=vert_vis_mask,
608
+ sampled_vertex_indices=sampled_vertex_indices,
609
+ track_indices=track_indices,
610
+ flow_dirs=flow_dirs,
611
+ n_iters=args.iter,
612
+ out_dir=out_dir
613
+ )
614
+
615
+ # Save results
616
+ save_and_smooth_results(
617
+ args, model, renderer, final_quats, root_quats, root_pos,
618
+ out_dir, additional_renderers, fps=10
619
+ )
620
+
621
+ print("Optimization completed successfully")
622
+ save_final_video(args)
623
+
624
+
625
+ if __name__ == "__main__":
626
+ main()
animation/renderer.py ADDED
@@ -0,0 +1,348 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import numpy as np
16
+ import torch
17
+ import cv2
18
+
19
+ from pytorch3d.structures import join_meshes_as_scene, join_meshes_as_batch, Meshes
20
+ from pytorch3d.renderer import (
21
+ FoVPerspectiveCameras, look_at_view_transform,
22
+ RasterizationSettings, MeshRenderer, MeshRasterizer,
23
+ SoftPhongShader, PointLights, BlendParams, SoftSilhouetteShader
24
+ )
25
+ from utils.loss_utils import compute_visibility_mask_igl
26
+
27
+ def create_camera_from_blender_params(cam_params, device):
28
+ """
29
+ Convert Blender camera parameters to PyTorch3D camera
30
+
31
+ Args:
32
+ cam_params (dict): Camera parameters from Blender JSON
33
+ device: Device to create camera on
34
+
35
+ Returns:
36
+ FoVPerspectiveCameras: Converted camera
37
+ """
38
+ # Extract matrix world and convert to rotation and translation
39
+ matrix_world = torch.tensor(cam_params['matrix_world'], dtype=torch.float32)
40
+
41
+ # Extract field of view (use x_fov, assuming symmetric FOV)
42
+ fov = cam_params['x_fov'] * 180 / np.pi # Convert radians to degrees
43
+
44
+ rotation_matrix = torch.tensor([
45
+ [1, 0, 0, 0],
46
+ [0, 0, 1, 0],
47
+ [0, -1, 0, 0],
48
+ [0, 0, 0, 1]
49
+ ], dtype=torch.float32)
50
+
51
+ # Apply transformations
52
+ adjusted_matrix = rotation_matrix @ matrix_world
53
+ world2cam_matrix_tensor = torch.linalg.inv(adjusted_matrix)
54
+
55
+ aligned_matrix = torch.tensor([
56
+ [-1.0, 0.0, 0.0, 0.0],
57
+ [0.0, 1.0, 0.0, 0.0],
58
+ [0.0, 0.0, -1.0, 0.0],
59
+ [0.0, 0.0, 0.0, 1.0]
60
+ ], dtype=torch.float32, device=device)
61
+ world2cam_matrix = aligned_matrix @ world2cam_matrix_tensor.to(device)
62
+ cam2world_matrix = torch.linalg.inv(world2cam_matrix)
63
+
64
+ # Extract rotation and translation
65
+ R = cam2world_matrix[:3, :3]
66
+ T = torch.tensor([
67
+ world2cam_matrix[0, 3],
68
+ world2cam_matrix[1, 3],
69
+ world2cam_matrix[2, 3]
70
+ ], device=device, dtype=torch.float32)
71
+
72
+ return FoVPerspectiveCameras(
73
+ device=device,
74
+ fov=fov,
75
+ R=R[None],
76
+ T=T[None],
77
+ znear=0.1,
78
+ zfar=100.0
79
+ )
80
+
81
+ class MeshRenderer3D:
82
+ """
83
+ PyTorch3D mesh renderer with support for various rendering modes.
84
+
85
+ Features:
86
+ - Standard mesh rendering with Phong shading
87
+ - Silhouette rendering
88
+ - Multi-frame batch rendering
89
+ - Point projection with visibility computation
90
+ """
91
+ def __init__(self, device, image_size=1024, cam_params=None, light_params=None, raster_params=None):
92
+ self.device = device
93
+ # Initialize camera
94
+ self.camera = self._setup_camera(cam_params)
95
+
96
+ # Initialize light
97
+ self.light = self._setup_light(light_params)
98
+
99
+ # Initialize rasterization settings
100
+ self.raster_settings = self._setup_raster_settings(raster_params, image_size)
101
+ self.camera.image_size = self.raster_settings.image_size
102
+
103
+ # Initialize renderers
104
+ self._setup_renderers()
105
+
106
+ def _setup_camera(self, cam_params):
107
+ """Setup camera based on parameters."""
108
+ if cam_params is None:
109
+ # Default camera
110
+ R, T = look_at_view_transform(3.0, 30, 20, at=[[0.0, 1.0, 0.0]])
111
+ return FoVPerspectiveCameras(device=self.device, R=R, T=T)
112
+
113
+ # Check if Blender parameters
114
+ if "matrix_world" in cam_params and "x_fov" in cam_params:
115
+ return create_camera_from_blender_params(cam_params, self.device)
116
+ else:
117
+ raise ValueError("Need to provide blender parameters.")
118
+
119
+ def _setup_light(self, light_params):
120
+ """Setup light source."""
121
+ if light_params is None:
122
+ return PointLights(device=self.device, location=[[0.0, 0.0, 3.0]])
123
+
124
+ location = [[
125
+ light_params.get('light_x', 0.0),
126
+ light_params.get('light_y', 0.0),
127
+ light_params.get('light_z', 3.0)
128
+ ]]
129
+ return PointLights(device=self.device, location=location)
130
+
131
+ def _setup_raster_settings(self, raster_params, default_size):
132
+ """Setup rasterization settings."""
133
+ if raster_params is None:
134
+ raster_params = {
135
+ "image_size": [default_size, default_size],
136
+ "blur_radius": 0.0,
137
+ "faces_per_pixel": 1,
138
+ "bin_size": 0,
139
+ "cull_backfaces": False
140
+ }
141
+
142
+ return RasterizationSettings(**raster_params)
143
+
144
+ def _setup_renderers(self) -> None:
145
+ """Initialize main and silhouette renderers."""
146
+ rasterizer = MeshRasterizer(
147
+ cameras=self.camera,
148
+ raster_settings=self.raster_settings
149
+ )
150
+
151
+ # Main renderer with Phong shading
152
+ self.renderer = MeshRenderer(
153
+ rasterizer=rasterizer,
154
+ shader=SoftPhongShader(
155
+ device=self.device,
156
+ cameras=self.camera,
157
+ lights=self.light
158
+ )
159
+ )
160
+
161
+ # Silhouette renderer
162
+ blend_params = BlendParams(
163
+ sigma=1e-4,
164
+ gamma=1e-4,
165
+ background_color=(0.0, 0.0, 0.0)
166
+ )
167
+
168
+ self.silhouette_renderer = MeshRenderer(
169
+ rasterizer=rasterizer,
170
+ shader=SoftSilhouetteShader(blend_params=blend_params)
171
+ )
172
+
173
+ def render(self, meshes):
174
+ """
175
+ Render meshes with Phong shading.
176
+
177
+ Args:
178
+ meshes: Single mesh or list of meshes
179
+
180
+ Returns:
181
+ Rendered images tensor of shape (1, H, W, C)
182
+ """
183
+ scene_mesh = self._prepare_scene_mesh(meshes)
184
+ return self.renderer(scene_mesh)
185
+
186
+ def render_batch(self, mesh_list):
187
+ """
188
+ Render multiple frames as a batch.
189
+
190
+ Args:
191
+ mesh_list: List of mesh lists (one per frame)
192
+
193
+ Returns:
194
+ Batch of rendered images of shape (B, H, W, C)
195
+ """
196
+ assert isinstance(mesh_list, list)
197
+
198
+ batch_meshes = []
199
+ for frame_meshes in mesh_list:
200
+ scene_mesh = self._prepare_scene_mesh(frame_meshes)
201
+ batch_meshes.append(scene_mesh)
202
+
203
+ batch_mesh = join_meshes_as_batch(batch_meshes)
204
+ return self.renderer(batch_mesh)
205
+
206
+ def get_rasterization_fragments(self, mesh_list):
207
+ """
208
+ Get rasterization fragments for batch of meshes.
209
+
210
+ Args:
211
+ mesh_list: List of mesh lists (one per frame)
212
+
213
+ Returns:
214
+ Rasterization fragments
215
+ """
216
+ assert isinstance(mesh_list, list)
217
+
218
+ batch_meshes = []
219
+ for frame_meshes in mesh_list:
220
+ scene_mesh = self._prepare_scene_mesh(frame_meshes)
221
+ batch_meshes.append(scene_mesh)
222
+
223
+ batch_mesh = join_meshes_as_batch(batch_meshes)
224
+ return self.renderer.rasterizer(batch_mesh)
225
+
226
+ def render_silhouette_batch(self, mesh_list):
227
+ """
228
+ Render silhouette masks for multiple frames.
229
+
230
+ Args:
231
+ mesh_list: List of mesh lists (one per frame)
232
+
233
+ Returns:
234
+ Batch of silhouette masks of shape (B, H, W, 1)
235
+ """
236
+ assert isinstance(mesh_list, list)
237
+
238
+ batch_meshes = []
239
+ for frame_meshes in mesh_list:
240
+ scene_mesh = self._prepare_scene_mesh(frame_meshes)
241
+ batch_meshes.append(scene_mesh)
242
+
243
+ batch_mesh = join_meshes_as_batch(batch_meshes)
244
+ silhouette = self.silhouette_renderer(batch_mesh)
245
+ return silhouette[..., 3:] # Return alpha channel
246
+
247
+ def tensor_to_image(self, tensor):
248
+ """
249
+ Convert rendered tensor to numpy image array.
250
+
251
+ Args:
252
+ tensor: Rendered tensor of shape (B, H, W, C)
253
+
254
+ Returns:
255
+ Numpy array of shape (H, W, 3) with values in [0, 255]
256
+ """
257
+ return (tensor[0, ..., :3].cpu().numpy() * 255).astype(np.uint8)
258
+
259
+ def project_points(self, points_3d):
260
+ """
261
+ Project 3D joints/vertices to 2D image plane
262
+
263
+ Args:
264
+ points_3d: shape (N, 3) or (B, N, 3) tensor of 3D points
265
+
266
+ Returns:
267
+ points_2d: shape (N, 2) or (B, N, 2) tensor of 2D projected points
268
+ """
269
+ if not torch.is_tensor(points_3d):
270
+ points_3d = torch.tensor(points_3d, device=self.device, dtype=torch.float32)
271
+
272
+
273
+ if len(points_3d.shape) == 2:
274
+ points_3d = points_3d.unsqueeze(0) # (1, N, 3)
275
+
276
+ # project points
277
+ projected = self.camera.transform_points_screen(points_3d, image_size=self.raster_settings.image_size)
278
+
279
+ if projected.shape[0] == 1:
280
+ projected_points = projected.squeeze(0)[:, :2]
281
+ else:
282
+ projected_points = projected[:, :, :2]
283
+ return projected_points
284
+
285
+ def render_with_points(self, meshes, points_3d, point_radius=3, for_vertices=False):
286
+ """
287
+ render the mesh and visualize the joints/vertices on the image
288
+
289
+ Args:
290
+ meshes: mesh or list of meshes to be rendered
291
+ points_3d: shape (N, 3) tensor of 3D joints/vertices
292
+ point_radius: radius of the drawn points
293
+ for_vertices: if True, compute visibility for vertices, else for joints
294
+
295
+ Returns:
296
+ Image with joints/vertices drawn, visibility mask
297
+ """
298
+ rendered_image = self.render(meshes)
299
+
300
+ # project 3D points to 2D
301
+ points_2d = self.project_points(points_3d)
302
+
303
+ image_np = rendered_image[0, ..., :3].cpu().numpy()
304
+ image_with_points = image_np.copy()
305
+ height, width = image_np.shape[:2]
306
+
307
+ ray_origins = self.camera.get_camera_center() # (B, 3)
308
+ ray_origins = np.tile(ray_origins.detach().cpu().numpy(), (points_3d.shape[0], 1))
309
+
310
+ verts = meshes.verts_packed().detach().cpu().numpy()
311
+ faces = meshes.faces_packed().detach().cpu().numpy()
312
+
313
+ ray_dirs = points_3d.detach().cpu().numpy() - ray_origins # calculate ray directions
314
+ distances = np.linalg.norm(ray_dirs, axis=1) # distances from camera to points
315
+ ray_dirs = (ray_dirs.T / distances).T # normalize to unit vectors
316
+
317
+ vis_mask = compute_visibility_mask_igl(ray_origins, ray_dirs, distances, verts, faces, distance_tolerance=1e-6, for_vertices=for_vertices)
318
+
319
+ # draw points
320
+ visible_color=(1, 0, 0) # visible points are red
321
+ invisible_color=(0, 0, 1) # invisible points are blue
322
+ for i, point in enumerate(points_2d):
323
+ x, y = int(point[0].item()), int(point[1].item())
324
+
325
+ if 0 <= x < width and 0 <= y < height:
326
+ point_color = visible_color if vis_mask[i] else invisible_color
327
+ cv2.circle(image_with_points, (x, y), point_radius, point_color, -1)
328
+
329
+ result = torch.from_numpy(image_with_points).to(self.device)
330
+ result = result.unsqueeze(0)
331
+
332
+ if rendered_image.shape[-1] == 4:
333
+ alpha = rendered_image[..., 3:]
334
+ result = torch.cat([result, alpha], dim=-1)
335
+
336
+ return result, vis_mask
337
+
338
+ def _prepare_scene_mesh(self, meshes):
339
+ """Convert meshes to a single scene mesh."""
340
+ if isinstance(meshes, Meshes):
341
+ return meshes
342
+ elif isinstance(meshes, list):
343
+ return join_meshes_as_scene(meshes)
344
+ else:
345
+ raise ValueError("meshes must be Meshes object or list of Meshes")
346
+
347
+
348
+
animation/third_partys/.DS_Store ADDED
Binary file (6.15 kB). View file
 
animation/utils/cameras/back.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"matrix_world": [[-1.0, -8.742277657347586e-08, -8.742277657347586e-08, 0.0], [-8.742277657347586e-08, 4.371138118131057e-08, 1.0, 2.0], [-8.74227694680485e-08, 1.0, -4.371138828673793e-08, 0.0], [0.0, 0.0, 0.0, 1.0]], "format_version": 6, "max_depth": 5.0, "bbox": [[-0.14632226526737213, -0.15228690207004547, -0.5013949275016785], [0.18149489164352417, 0.24675098061561584, 0.4873228073120117]], "origin": [0.0, 2.0, 0.0], "x_fov": 0.6911112070083618, "y_fov": 0.6911112070083618, "x": [-1.0, -8.742277657347586e-08, -8.74227694680485e-08], "y": [8.742277657347586e-08, -4.371138118131057e-08, -1.0], "z": [8.742277657347586e-08, -1.0, 4.371138828673793e-08]}
animation/utils/cameras/back_left.json ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "matrix_world": [
3
+ [
4
+ -0.7071067235853873,
5
+ -1.5015359289272112e-08,
6
+ -0.7071068387877032,
7
+ -1.4142136775754064
8
+ ],
9
+ [
10
+ -0.7071068387877031,
11
+ -1.1886282763606815e-08,
12
+ 0.7071067235853874,
13
+ 1.4142134471707748
14
+ ],
15
+ [
16
+ -1.9022333375140477e-08,
17
+ 1.0,
18
+ -2.2125928034189e-09,
19
+ -4.4251856068378e-09
20
+ ],
21
+ [
22
+ 0.0,
23
+ 0.0,
24
+ 0.0,
25
+ 1.0
26
+ ]
27
+ ],
28
+ "format_version": 6,
29
+ "max_depth": 5.0,
30
+ "bbox": [
31
+ [
32
+ -0.14632226526737213,
33
+ -0.15228690207004547,
34
+ -0.5013949275016785
35
+ ],
36
+ [
37
+ 0.18149489164352417,
38
+ 0.24675098061561584,
39
+ 0.4873228073120117
40
+ ]
41
+ ],
42
+ "origin": [
43
+ -1.0,
44
+ 1.0,
45
+ 0.0
46
+ ],
47
+ "x_fov": 0.6911112070083618,
48
+ "y_fov": 0.6911112070083618,
49
+ "x": [
50
+ -0.7071067235853873,
51
+ -1.5015359289272112e-08,
52
+ -0.7071068387877032
53
+ ],
54
+ "y": [
55
+ -0.7071068387877031,
56
+ -1.1886282763606815e-08,
57
+ 0.7071067235853874
58
+ ],
59
+ "z": [
60
+ -1.9022333375140477e-08,
61
+ 1.0,
62
+ -2.2125928034189e-09
63
+ ]
64
+ }
animation/utils/cameras/back_right.json ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "matrix_world": [
3
+ [
4
+ -0.7071067854026265,
5
+ -7.240741267677819e-08,
6
+ 0.7071067769704649,
7
+ 1.4142135539409297
8
+ ],
9
+ [
10
+ 0.7071067769704653,
11
+ 2.4325415404202744e-08,
12
+ 0.7071067854026294,
13
+ 1.4142135708052588
14
+ ],
15
+ [
16
+ -6.840043892397674e-08,
17
+ 0.9999999999999971,
18
+ 3.399910591950217e-08,
19
+ 6.799821183900434e-08
20
+ ],
21
+ [
22
+ 0.0,
23
+ 0.0,
24
+ 0.0,
25
+ 1.0
26
+ ]
27
+ ],
28
+ "format_version": 6,
29
+ "max_depth": 5.0,
30
+ "bbox": [
31
+ [
32
+ -0.14632226526737213,
33
+ -0.15228690207004547,
34
+ -0.5013949275016785
35
+ ],
36
+ [
37
+ 0.18149489164352417,
38
+ 0.24675098061561584,
39
+ 0.4873228073120117
40
+ ]
41
+ ],
42
+ "origin": [
43
+ 1.0,
44
+ 1.0,
45
+ 0.0
46
+ ],
47
+ "x_fov": 0.6911112070083618,
48
+ "y_fov": 0.6911112070083618,
49
+ "x": [
50
+ -0.7071067854026265,
51
+ -7.240741267677819e-08,
52
+ 0.7071067769704649
53
+ ],
54
+ "y": [
55
+ 0.7071067769704653,
56
+ 2.4325415404202744e-08,
57
+ 0.7071067854026294
58
+ ],
59
+ "z": [
60
+ -6.840043892397674e-08,
61
+ 0.9999999999999971,
62
+ 3.399910591950217e-08
63
+ ]
64
+ }
animation/utils/cameras/front.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"matrix_world": [[1.0, 0.0, 0.0, 0.0], [0.0, -4.371138828673793e-08, -1.0, -2.0], [0.0, 1.0, -4.371138828673793e-08, 0.0], [0.0, 0.0, 0.0, 1.0]], "format_version": 6, "max_depth": 5.0, "bbox": [[-0.14632226526737213, -0.15228690207004547, -0.5013949275016785], [0.18149489164352417, 0.24675098061561584, 0.4873228073120117]], "origin": [0.0, -2.0, 0.0], "x_fov": 0.6911112070083618, "y_fov": 0.6911112070083618, "x": [1.0, 0.0, 0.0], "y": [-0.0, 4.371138828673793e-08, -1.0], "z": [-0.0, 1.0, 4.371138828673793e-08]}
animation/utils/cameras/front_left.json ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "matrix_world": [
3
+ [
4
+ 0.7071068078790848,
5
+ 2.869602372390645e-08,
6
+ -0.7071067544940086,
7
+ -1.4142135089880172
8
+ ],
9
+ [
10
+ -0.7071067544940088,
11
+ -6.21956508517485e-09,
12
+ -0.7071068078790852,
13
+ -1.4142136157581704
14
+ ],
15
+ [
16
+ -2.468905024866075e-08,
17
+ 0.9999999999999996,
18
+ 1.589325537842967e-08,
19
+ 3.178651075685934e-08
20
+ ],
21
+ [
22
+ 0.0,
23
+ 0.0,
24
+ 0.0,
25
+ 1.0
26
+ ]
27
+ ],
28
+ "format_version": 6,
29
+ "max_depth": 5.0,
30
+ "bbox": [
31
+ [
32
+ -0.14632226526737213,
33
+ -0.15228690207004547,
34
+ -0.5013949275016785
35
+ ],
36
+ [
37
+ 0.18149489164352417,
38
+ 0.24675098061561584,
39
+ 0.4873228073120117
40
+ ]
41
+ ],
42
+ "origin": [
43
+ -1.0,
44
+ -1.0,
45
+ 0.0
46
+ ],
47
+ "x_fov": 0.6911112070083618,
48
+ "y_fov": 0.6911112070083618,
49
+ "x": [
50
+ 0.7071068078790848,
51
+ 2.869602372390645e-08,
52
+ -0.7071067544940086
53
+ ],
54
+ "y": [
55
+ -0.7071067544940088,
56
+ -6.21956508517485e-09,
57
+ -0.7071068078790852
58
+ ],
59
+ "z": [
60
+ -2.468905024866075e-08,
61
+ 0.9999999999999996,
62
+ 1.589325537842967e-08
63
+ ]
64
+ }
animation/utils/cameras/front_right.json ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "matrix_world": [
3
+ [
4
+ 0.7071068078790848,
5
+ -2.869602372390645e-08,
6
+ 0.7071067544940086,
7
+ 1.4142135089880172
8
+ ],
9
+ [
10
+ 0.7071067544940088,
11
+ -6.21956508517485e-09,
12
+ -0.7071068078790852,
13
+ -1.4142136157581704
14
+ ],
15
+ [
16
+ 2.468905024866075e-08,
17
+ 0.9999999999999996,
18
+ 1.589325537842967e-08,
19
+ 3.178651075685934e-08
20
+ ],
21
+ [
22
+ 0.0,
23
+ 0.0,
24
+ 0.0,
25
+ 1.0
26
+ ]
27
+ ],
28
+ "format_version": 6,
29
+ "max_depth": 5.0,
30
+ "bbox": [
31
+ [
32
+ -0.14632226526737213,
33
+ -0.15228690207004547,
34
+ -0.5013949275016785
35
+ ],
36
+ [
37
+ 0.18149489164352417,
38
+ 0.24675098061561584,
39
+ 0.4873228073120117
40
+ ]
41
+ ],
42
+ "origin": [
43
+ 1.0,
44
+ -1.0,
45
+ 0.0
46
+ ],
47
+ "x_fov": 0.6911112070083618,
48
+ "y_fov": 0.6911112070083618,
49
+ "x": [
50
+ 0.7071068078790848,
51
+ -2.869602372390645e-08,
52
+ 0.7071067544940086
53
+ ],
54
+ "y": [
55
+ 0.7071067544940088,
56
+ -6.21956508517485e-09,
57
+ -0.7071068078790852
58
+ ],
59
+ "z": [
60
+ 2.468905024866075e-08,
61
+ 0.9999999999999996,
62
+ 1.589325537842967e-08
63
+ ]
64
+ }
animation/utils/cameras/left.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"matrix_world": [[7.549790126404332e-08, 7.549790126404332e-08, -1.0, -2.0], [-1.0, 5.6999328827277325e-15, -7.549790126404332e-08, 0.0], [0.0, 1.0, 7.549790126404332e-08, 0.0], [0.0, 0.0, 0.0, 1.0]], "format_version": 6, "max_depth": 5.0, "bbox": [[-0.14632226526737213, -0.15228690207004547, -0.5013949275016785], [0.18149489164352417, 0.24675098061561584, 0.4873228073120117]], "origin": [-2.0, 0.0, 0.0], "x_fov": 0.6911112070083618, "y_fov": 0.6911112070083618, "x": [7.549790126404332e-08, -1.0, 0.0], "y": [-7.549790126404332e-08, -5.6999328827277325e-15, -1.0], "z": [1.0, 7.549790126404332e-08, -7.549790126404332e-08]}
animation/utils/cameras/right.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"matrix_world": [[7.549790126404332e-08, -7.549790126404332e-08, 1.0, 2.0], [1.0, 5.6999328827277325e-15, -7.549790126404332e-08, 0.0], [0.0, 1.0, 7.549790126404332e-08, 0.0], [0.0, 0.0, 0.0, 1.0]], "format_version": 6, "max_depth": 5.0, "bbox": [[-0.14632226526737213, -0.15228690207004547, -0.5013949275016785], [0.18149489164352417, 0.24675098061561584, 0.4873228073120117]], "origin": [2.0, 0.0, 0.0], "x_fov": 0.6911112070083618, "y_fov": 0.6911112070083618, "x": [7.549790126404332e-08, 1.0, 0.0], "y": [7.549790126404332e-08, -5.6999328827277325e-15, -1.0], "z": [-1.0, 7.549790126404332e-08, -7.549790126404332e-08]}
animation/utils/data_loader.py ADDED
@@ -0,0 +1,170 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import os
16
+ import numpy as np
17
+ import torch
18
+ import random
19
+ from pytorch3d.io import load_objs_as_meshes, load_obj
20
+ from pytorch3d.renderer import TexturesAtlas
21
+ from pytorch3d.structures import Meshes
22
+ from model import RiggingModel
23
+
24
+ def prepare_depth(depth_path, input_frames, device, depth_model):
25
+ os.makedirs(depth_path, exist_ok=True)
26
+ depth_path = f"{depth_path}/depth_gt_raw.pt"
27
+ if os.path.exists(depth_path):
28
+ print("load GT depth...")
29
+ depth_gt_raw = torch.load(depth_path, map_location=device)
30
+ else:
31
+ print("run VideoDepthAnything and save.")
32
+ with torch.no_grad():
33
+ depth_gt_raw = depth_model.get_depth_maps(input_frames)
34
+ torch.save(depth_gt_raw.cpu(), depth_path)
35
+ depth_gt_raw = depth_gt_raw.to(device)
36
+ return depth_gt_raw
37
+
38
+ def normalize_vertices(verts):
39
+ """Normalize vertices to a unit cube."""
40
+ vmin, vmax = verts.min(dim=0).values, verts.max(dim=0).values
41
+ center = (vmax + vmin) / 2.0
42
+ scale = (vmax - vmin).max()
43
+ verts_norm = (verts - center) / scale
44
+ return verts_norm, center, scale
45
+
46
+ def build_atlas_texture(obj_path, atlas_size, device):
47
+ """Load OBJ + materials and bake all textures into a single atlas."""
48
+ verts, faces, aux = load_obj(
49
+ obj_path,
50
+ device=device,
51
+ load_textures=True,
52
+ create_texture_atlas=True,
53
+ texture_atlas_size=atlas_size,
54
+ texture_wrap="repeat",
55
+ )
56
+ atlas = aux.texture_atlas # (F, R, R, 3)
57
+ verts_norm, _, _ = normalize_vertices(verts)
58
+ mesh_atlas = Meshes(
59
+ verts=[verts_norm],
60
+ faces=[faces.verts_idx],
61
+ textures=TexturesAtlas(atlas=[atlas]),
62
+ )
63
+ return mesh_atlas
64
+
65
+ def read_rig_file(file_path):
66
+ """
67
+ Read rig from txt file, our format is the same as RigNet:
68
+ joints joint_name x y z
69
+ root root_joint_name
70
+ skin vertex_idx joint_name weight joint_name weight ...
71
+ hier parent_joint_name child_joint_name
72
+ """
73
+ joints = []
74
+ bones = []
75
+ joint_names = []
76
+
77
+ joint_mapping = {}
78
+ joint_index = 0
79
+
80
+ skinning_data = {} # Dictionary to store vertex index -> [(joint_idx, weight), ...]
81
+
82
+ with open(file_path, 'r') as file:
83
+ lines = file.readlines()
84
+
85
+ for line in lines:
86
+ parts = line.split()
87
+ if line.startswith('joints'):
88
+ name = parts[1]
89
+ position = [float(parts[2]), float(parts[3]), float(parts[4])]
90
+ joints.append(position)
91
+ joint_names.append(name)
92
+ joint_mapping[name] = joint_index
93
+ joint_index += 1
94
+ elif line.startswith('hier'):
95
+ parent_joint = joint_mapping[parts[1]]
96
+ child_joint = joint_mapping[parts[2]]
97
+ bones.append([parent_joint, child_joint])
98
+ elif line.startswith('root'):
99
+ root = joint_mapping[parts[1]]
100
+ elif line.startswith('skin'):
101
+ vertex_idx = int(parts[1])
102
+
103
+ if vertex_idx not in skinning_data:
104
+ skinning_data[vertex_idx] = []
105
+
106
+ for i in range(2, len(parts), 2):
107
+ if i+1 < len(parts):
108
+ joint_name = parts[i]
109
+ weight = float(parts[i+1])
110
+
111
+ if joint_name in joint_mapping:
112
+ joint_idx = joint_mapping[joint_name]
113
+ skinning_data[vertex_idx].append((joint_idx, weight))
114
+
115
+ return np.array(joints), np.array(bones), root, joint_names, skinning_data
116
+
117
+ def load_model_from_obj_and_rig(
118
+ mesh_path: str,
119
+ rig_path: str,
120
+ device: str | torch.device = "cuda",
121
+ use_skin_color: bool = True,
122
+ atlas_size: int = 8,
123
+ ):
124
+ """Load a 3D model from OBJ and rig files."""
125
+
126
+ # 1) read raw mesh
127
+ raw_mesh = load_objs_as_meshes([mesh_path], device=device)
128
+ verts_raw = raw_mesh.verts_packed() # (V,3)
129
+ faces_idx = raw_mesh.faces_packed() # (F,3)
130
+
131
+ # 2) read rig data
132
+ joints_np, bones_np, root_idx, joint_names, skinning_data = read_rig_file(rig_path)
133
+ J = joints_np.shape[0]
134
+
135
+ # parent indices, default -1
136
+ parent_idx = [-1] * J
137
+ for p, c in bones_np:
138
+ parent_idx[c] = p
139
+
140
+ verts_norm, center, scale = normalize_vertices(verts_raw)
141
+ joints_t = torch.as_tensor(joints_np, dtype=torch.float32, device=device)
142
+ joints_norm = (joints_t - center) / scale
143
+
144
+ # skin weights tensor (V,J)
145
+ V = verts_raw.shape[0]
146
+ skin_weights = torch.zeros(V, J, dtype=torch.float32, device=device)
147
+ for v_idx, lst in skinning_data.items():
148
+ for j_idx, w in lst:
149
+ skin_weights[v_idx, j_idx] = w
150
+
151
+ # 3) texture strategy
152
+ mesh_norm = build_atlas_texture(mesh_path, atlas_size, device)
153
+ tex = mesh_norm.textures
154
+
155
+ # 4) pack into Model class
156
+ model = RiggingModel(device=device)
157
+ model.vertices = [mesh_norm.verts_packed()]
158
+ model.faces = [faces_idx]
159
+ model.textures = [tex]
160
+
161
+ # rig meta
162
+ model.bones = bones_np # (B,2)
163
+ model.parent_indices = parent_idx
164
+ model.root_index = root_idx
165
+ model.skin_weights = [skin_weights]
166
+
167
+ model.bind_matrices_inv = torch.eye(4, device=device).unsqueeze(0).expand(J, -1, -1).contiguous()
168
+ model.joints_rest = joints_norm
169
+
170
+ return model
animation/utils/loss_utils.py ADDED
@@ -0,0 +1,420 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from third_partys.Video_Depth_Anything.video_depth_anything.video_depth import VideoDepthAnything
16
+ import torch
17
+ import torch.nn as nn
18
+ import numpy as np
19
+ import igl
20
+ import cv2
21
+ import time
22
+ import torch.nn.functional as F
23
+ from utils.quat_utils import quat_inverse, quat_log, quat_multiply, normalize_quaternion
24
+ from pytorch3d.structures import join_meshes_as_scene, join_meshes_as_batch
25
+ import os
26
+ from pathlib import Path
27
+
28
+ class DepthModule:
29
+ def __init__(self, encoder='vitl', device='cuda', input_size=518, fp32=False):
30
+ """
31
+ Initialize the depth loss module with Video Depth Anything
32
+
33
+ Args:
34
+ encoder: 'vitl' or 'vits'
35
+ device: device to run the model on
36
+ input_size: input size for the model
37
+ fp32: whether to use float32 for inference
38
+ """
39
+ self.device = 'cuda' if torch.cuda.is_available() else 'cpu'
40
+ self.input_size = input_size
41
+ self.fp32 = fp32
42
+
43
+ # Initialize model configuration
44
+ model_configs = {
45
+ 'vits': {'encoder': 'vits', 'features': 64, 'out_channels': [48, 96, 192, 384]},
46
+ 'vitl': {'encoder': 'vitl', 'features': 256, 'out_channels': [256, 512, 1024, 1024]},
47
+ }
48
+
49
+ # Load Video Depth Anything model
50
+ self.video_depth_model = VideoDepthAnything(**model_configs[encoder])
51
+ self.video_depth_model.load_state_dict(
52
+ torch.load(f'./third_partys/Video_Depth_Anything/ckpt/video_depth_anything_{encoder}.pth', map_location='cpu'),
53
+ strict=True
54
+ )
55
+ self.video_depth_model = self.video_depth_model.to(self.device).eval()
56
+ for param in self.video_depth_model.parameters():
57
+ param.requires_grad = False
58
+
59
+ def get_depth_maps(self, frames, target_fps=30):
60
+ """
61
+ Get depth maps for video frames
62
+ """
63
+ depths, _ = self.video_depth_model.infer_video_depth(
64
+ frames,
65
+ target_fps,
66
+ input_size=self.input_size,
67
+ device=self.device,
68
+ fp32=self.fp32
69
+ )
70
+ return depths
71
+
72
+ def save_depth_as_images(depth_np, output_dir='./depth_images'):
73
+ """save depth images"""
74
+ os.makedirs(output_dir, exist_ok=True)
75
+
76
+ for i, depth_map in enumerate(depth_np):
77
+ depth_map = depth_map.detach().cpu().numpy()
78
+ valid_mask = (depth_map > 0)
79
+ if not valid_mask.any():
80
+ continue
81
+
82
+ valid_min = depth_map[valid_mask].min()
83
+ valid_max = depth_map[valid_mask].max()
84
+
85
+ normalized = np.zeros_like(depth_map)
86
+ normalized[valid_mask] = 255.0 * (depth_map[valid_mask] - valid_min) / (valid_max - valid_min)
87
+
88
+ depth_img = normalized.astype(np.uint8)
89
+
90
+ cv2.imwrite(os.path.join(output_dir, f'depth_{i:04d}.png'), depth_img)
91
+
92
+ print(f"Save {len(depth_np)} depth images to {output_dir}")
93
+
94
+ def compute_visibility_mask_igl(ray_origins, ray_dirs, distances, verts, faces, distance_tolerance=1e-6, for_vertices=False):
95
+ """
96
+ Compute visibility mask using IGL ray-mesh intersection.
97
+ """
98
+ num_rays = ray_origins.shape[0]
99
+ visibility_mask = np.ones(num_rays, dtype=bool)
100
+
101
+ for i in range(num_rays):
102
+ ray_origin = ray_origins[i].reshape(1, 3)
103
+ ray_dir = ray_dirs[i].reshape(1, 3)
104
+ intersections = igl.ray_mesh_intersect(ray_origin, ray_dir, verts, faces)
105
+ if intersections:
106
+ # Count intersections that occur before the target point
107
+ count = sum(1 for h in intersections if h[4] < distances[i] - distance_tolerance)
108
+ # count=0 → ray completely missed the mesh; count=1 → ray stops exactly at the face containing the joint
109
+ # count>1 → ray was blocked by other faces along the way
110
+ if for_vertices:
111
+ if count != 1:
112
+ visibility_mask[i] = False
113
+ else: # for joints
114
+ if count > 2:
115
+ visibility_mask[i] = False
116
+
117
+ return visibility_mask
118
+
119
+ def compute_reprojection_loss(renderer, vis_mask, predicted_joints, tracked_joints_2d, image_size):
120
+ """
121
+ Compute reprojection loss between predicted 3D points and tracked 2D points.
122
+ """
123
+ if predicted_joints.dim() != 3:
124
+ raise ValueError(f"predicted_joints must be 3D tensor, got shape {predicted_joints.shape}")
125
+
126
+ B, J, _ = predicted_joints.shape
127
+ device = predicted_joints.device
128
+
129
+ # Project 3D joints to 2D screen coordinates
130
+ projected = renderer.camera.transform_points_screen(
131
+ predicted_joints,
132
+ image_size=[image_size, image_size]
133
+ )
134
+ projected_2d = projected[..., :2] # (B, J, 2)
135
+
136
+ # Convert and validate tracked joints
137
+ if not isinstance(tracked_joints_2d, torch.Tensor):
138
+ tracked_joints_2d = torch.from_numpy(tracked_joints_2d).float()
139
+ tracked_joints_2d = tracked_joints_2d.to(device)
140
+
141
+ if tracked_joints_2d.dim() == 2:
142
+ tracked_joints_2d = tracked_joints_2d.unsqueeze(0).expand(B, -1, -1)
143
+
144
+ vis_mask = vis_mask.to(device).float()
145
+
146
+ num_visible = vis_mask.sum()
147
+ if num_visible == 0:
148
+ # No visible joints - return zero loss
149
+ return torch.tensor(0.0, device=device, requires_grad=True)
150
+
151
+ squared_diff = (projected_2d - tracked_joints_2d).pow(2).sum(dim=-1) # (B, J)
152
+
153
+ vis_mask_expanded = vis_mask.unsqueeze(0) # (1, J)
154
+ masked_loss = squared_diff * vis_mask_expanded # (B, J)
155
+ per_frame_loss = masked_loss.sum(dim=1) / num_visible # (B,)
156
+ final_loss = per_frame_loss.mean() # scalar
157
+
158
+ return final_loss
159
+
160
+ def geodesic_loss(q1, q2, eps=1e-6):
161
+ """
162
+ Compute geodesic distance loss between batches of quaternions for rot smooth loss.
163
+ """
164
+ q1_norm = normalize_quaternion(q1, eps=eps)
165
+ q2_norm = normalize_quaternion(q2, eps=eps)
166
+
167
+ dot_product = (q1_norm * q2_norm).sum(dim=-1, keepdim=True)
168
+ q2_corrected = torch.where(dot_product < 0, -q2_norm, q2_norm)
169
+ inner_product = (q1_norm * q2_corrected).sum(dim=-1)
170
+
171
+ # Clamp to valid range for arccos to avoid numerical issues
172
+ inner_product_clamped = torch.clamp(inner_product, min=-1.0 + eps, max=1.0 - eps)
173
+ theta = 2.0 * torch.arccos(torch.abs(inner_product_clamped))
174
+
175
+ return theta
176
+
177
+ def root_motion_reg(root_quats, root_pos):
178
+ return ((root_pos[1:] - root_pos[:-1])**2).mean(), (geodesic_loss(root_quats[1:], root_quats[:-1])**2).mean()
179
+
180
+ def joint_motion_coherence(quats_normed, parent_idx):
181
+ """
182
+ Compute joint motion coherence loss to enforce smooth relative motion between parent-child joints.
183
+ """
184
+ coherence_loss = 0
185
+
186
+ for j, parent in enumerate(parent_idx):
187
+ if parent != -1: # Skip root joint
188
+ parent_rot = quats_normed[:, parent] # (T, 4)
189
+ child_rot = quats_normed[:, j] # (T, 4)
190
+
191
+ # Compute relative rotation of child w.r.t. parent's local frame
192
+ # local_rot = parent_rot^(-1) * child_rot
193
+ local_rot = quat_multiply(quat_inverse(parent_rot), child_rot)
194
+ local_rot_velocity = local_rot[1:] - local_rot[:-1] # (T-1, 4)
195
+
196
+ coherence_loss += local_rot_velocity.pow(2).mean()
197
+
198
+ return coherence_loss
199
+
200
+ def read_flo_file(file_path):
201
+ """
202
+ Read optical flow from .flo format file.
203
+ """
204
+ with open(file_path, 'rb') as f:
205
+ magic = np.fromfile(f, np.float32, count=1)
206
+ if len(magic) == 0 or magic[0] != 202021.25:
207
+ raise ValueError(f'Invalid .flo file format: magic number {magic}')
208
+
209
+ w = np.fromfile(f, np.int32, count=1)[0]
210
+ h = np.fromfile(f, np.int32, count=1)[0]
211
+ data = np.fromfile(f, np.float32, count=2*w*h)
212
+ flow = data.reshape(h, w, 2)
213
+ return flow
214
+
215
+ def load_optical_flows(flow_dir, num_frames):
216
+ """
217
+ Load sequence of optical flow files.
218
+ """
219
+ flow_dir = Path(flow_dir)
220
+ flows = []
221
+
222
+ for i in range(num_frames - 1):
223
+ flow_path = flow_dir / f'flow_{i:04d}.flo'
224
+ if flow_path.exists():
225
+ flow = read_flo_file(flow_path)
226
+ flows.append(flow)
227
+ else:
228
+ raise ValueError("No flow files found")
229
+
230
+ return np.stack(flows, axis=0)
231
+
232
+ def rasterize_vertex_flow(flow_vertices, meshes, faces, image_size, renderer, eps = 1e-8):
233
+ """
234
+ Rasterize per-vertex flow to dense flow field using barycentric interpolation.
235
+ """
236
+ B, V, _ = flow_vertices.shape
237
+ device = flow_vertices.device
238
+
239
+ if isinstance(image_size, int):
240
+ H = W = image_size
241
+ else:
242
+ H, W = image_size
243
+
244
+ batch_meshes = join_meshes_as_batch([join_meshes_as_scene(m) for m in meshes]).to(device)
245
+ fragments = renderer.renderer.rasterizer(batch_meshes)
246
+
247
+ pix_to_face = fragments.pix_to_face # (B, H, W, K)
248
+ bary_coords = fragments.bary_coords # (B, H, W, K, 3)
249
+
250
+ flow_scene_list = []
251
+ for mesh_idx in range(B):
252
+ mesh = meshes[mesh_idx]
253
+ V_mesh = mesh.verts_packed().shape[0]
254
+
255
+ if V_mesh > flow_vertices.shape[1]:
256
+ raise ValueError(f"Mesh {mesh_idx} has {V_mesh} vertices but flow has {flow_vertices.shape[1]}")
257
+
258
+ flow_scene_list.append(flow_vertices[mesh_idx, :V_mesh])
259
+
260
+
261
+ flow_vertices_scene = torch.cat(flow_scene_list, dim=0).to(device)
262
+ faces_scene = batch_meshes.faces_packed()
263
+
264
+ flow_pred = torch.zeros(B, H, W, 2, device=device)
265
+ valid = pix_to_face[..., 0] >= 0
266
+
267
+ for b in range(B):
268
+ b_valid = valid[b] # (H,W)
269
+ if torch.count_nonzero(b_valid) == 0:
270
+ print(f"No valid pixels found for batch {b}")
271
+ continue
272
+
273
+ valid_indices = torch.nonzero(b_valid, as_tuple=True)
274
+ h_indices, w_indices = valid_indices
275
+
276
+ face_idxs = pix_to_face[b, h_indices, w_indices, 0] # (N,)
277
+ bary = bary_coords[b, h_indices, w_indices, 0] # (N,3)
278
+
279
+ max_face_idx = faces_scene.shape[0] - 1
280
+ if face_idxs.max() > max_face_idx:
281
+ raise RuntimeError(f"Face index {face_idxs.max()} exceeds max {max_face_idx}")
282
+
283
+ face_verts = faces_scene[face_idxs] # (N, 3)
284
+ f0, f1, f2 = face_verts.unbind(-1) # Each (N,)
285
+
286
+ max_vert_idx = flow_vertices_scene.shape[0] - 1
287
+ if max(f0.max(), f1.max(), f2.max()) > max_vert_idx:
288
+ raise RuntimeError(f"Vertex index exceeds flow_vertices_scene size {max_vert_idx}")
289
+
290
+ v0_flow = flow_vertices_scene[f0] # (N, 2)
291
+ v1_flow = flow_vertices_scene[f1] # (N, 2)
292
+ v2_flow = flow_vertices_scene[f2] # (N, 2)
293
+
294
+ # Interpolate using barycentric coordinates
295
+ b0, b1, b2 = bary.unbind(-1) # Each (N,)
296
+
297
+ # Ensure barycentric coordinates sum to 1 (numerical stability)
298
+ bary_sum = b0 + b1 + b2
299
+ b0 = b0 / (bary_sum + eps)
300
+ b1 = b1 / (bary_sum + eps)
301
+ b2 = b2 / (bary_sum + eps)
302
+
303
+ flow_interpolated = (
304
+ b0.unsqueeze(-1) * v0_flow +
305
+ b1.unsqueeze(-1) * v1_flow +
306
+ b2.unsqueeze(-1) * v2_flow
307
+ ) # (N, 2)
308
+
309
+ # Update flow prediction
310
+ flow_pred[b, h_indices, w_indices] = flow_interpolated
311
+
312
+ return flow_pred
313
+
314
+ def calculate_flow_loss(flow_dir, device, mask, renderer, model):
315
+ """
316
+ Calculate optical flow loss with improved error handling and flexibility.
317
+ """
318
+ if device is None:
319
+ device = mask.device
320
+
321
+ T = mask.shape[0]
322
+ H, W = mask.shape[1:3]
323
+
324
+ if mask.shape[0] == T:
325
+ flow_mask = mask[1:] # Use frames 1 to T-1
326
+ else:
327
+ flow_mask = mask
328
+
329
+ flows_np = load_optical_flows(flow_dir, T)
330
+ flow_gt = torch.from_numpy(flows_np).float().to(device) # [T-1, H, W, 2]
331
+
332
+ vertices = model.deformed_vertices[0] # (T,V,3)
333
+ # Project vertices to get 2D flow
334
+ proj_t = renderer.project_points(vertices[:-1]) # (T-1,V,2) in pixels
335
+ proj_tp = renderer.project_points(vertices[1:])
336
+ vertex_flow = proj_tp - proj_t # (T-1,V,2) Δx,Δy
337
+
338
+ meshes = [model.get_mesh(t) for t in range(T)]
339
+ flow_pred = rasterize_vertex_flow(vertex_flow, meshes, model.faces[0], (H,W), renderer) # (B,H,W,2)
340
+
341
+ eps = 1e-3
342
+ diff = (flow_pred - flow_gt) * flow_mask.unsqueeze(-1) # (T-1, H, W, 2)
343
+ loss = torch.sqrt(diff.pow(2).sum(dim=-1) + eps**2) # Charbonnier loss
344
+ loss = loss.sum() / (flow_mask.sum() + 1e-6)
345
+
346
+ return loss
347
+
348
+ def normalize_depth_from_reference(depth_maps, reference_idx=0, invalid_value=-1.0, invert=False, eps = 1e-8):
349
+ """
350
+ Normalize depth maps based on a reference frame with improved robustness.
351
+ """
352
+ if depth_maps.dim() != 3:
353
+ raise ValueError(f"Expected depth_maps with 3 dimensions, got {depth_maps.dim()}")
354
+
355
+ T, H, W = depth_maps.shape
356
+ device = depth_maps.device
357
+
358
+ reference_depth = depth_maps[reference_idx]
359
+ valid_mask = (
360
+ (reference_depth != invalid_value) &
361
+ (reference_depth > 1e-8) & # Avoid very small positive values
362
+ torch.isfinite(reference_depth) # Exclude inf/nan
363
+ )
364
+
365
+ valid_values = reference_depth[valid_mask]
366
+ min_depth = torch.quantile(valid_values, 0.01) # 1st percentile
367
+ max_depth = torch.quantile(valid_values, 0.99) # 99th percentile
368
+
369
+ depth_range = max_depth - min_depth
370
+ if depth_range < eps:
371
+ logger.warning(f"Very small depth range ({depth_range:.6f}), using fallback normalization")
372
+ min_depth = valid_values.min()
373
+ max_depth = valid_values.max()
374
+ depth_range = max(max_depth - min_depth, eps)
375
+
376
+ scale = 1.0 / (max_depth - min_depth)
377
+ offset = -min_depth * scale
378
+
379
+ all_valid_mask = (
380
+ (depth_maps != invalid_value) &
381
+ (depth_maps > eps) &
382
+ torch.isfinite(depth_maps)
383
+ )
384
+
385
+ normalized_depths = torch.full_like(depth_maps, invalid_value)
386
+
387
+ if all_valid_mask.any():
388
+ normalized_values = depth_maps[all_valid_mask] * scale + offset
389
+
390
+ if invert:
391
+ normalized_values = 1.0 - normalized_values
392
+
393
+ normalized_depths[all_valid_mask] = normalized_values
394
+
395
+ return normalized_depths, scale.item(), offset.item()
396
+
397
+ def compute_depth_loss_normalized(mono_depths, zbuf_depths, mask):
398
+ """
399
+ Compute normalized depth loss.
400
+ """
401
+ device = zbuf_depths.device
402
+ # Normalize both depth types
403
+ zbuf_norm, z_scale, z_offset = normalize_depth_from_reference(zbuf_depths)
404
+ mono_norm, m_scale, m_offset = normalize_depth_from_reference(mono_depths, invert=True)
405
+
406
+ valid_zbuf = (zbuf_norm >= 0) & (zbuf_norm <= 1)
407
+ valid_mono = (mono_norm >= 0) & (mono_norm <= 1)
408
+ if mask.dtype != torch.bool:
409
+ mask = mask > 0.5
410
+ combined_mask = mask & valid_zbuf & valid_mono
411
+
412
+ num_valid = combined_mask.sum().item()
413
+ if num_valid == 0:
414
+ print("No valid pixels for depth loss computation")
415
+ return torch.tensor(0.0, device=device, requires_grad=True)
416
+
417
+ depth_diff = (zbuf_norm - mono_norm) * combined_mask.float()
418
+ loss = (depth_diff**2).sum() / num_valid
419
+
420
+ return loss
animation/utils/misc.py ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from torch.optim.lr_scheduler import LambdaLR
16
+
17
+ def warmup_then_decay(optimizer, total_steps, warmup_steps, max_lr=1e-3, min_lr=1e-5, base_lr=1e-5):
18
+ """
19
+ Create a learning rate scheduler with warmup followed by decay.
20
+ """
21
+ def lr_lambda(current_step):
22
+ if current_step < warmup_steps:
23
+ # warmup: min_lr -> max_lr
24
+ progress = float(current_step) / float(max(1, warmup_steps))
25
+ # LR(t) = min_lr + (max_lr - min_lr)*progress
26
+ return (min_lr + (max_lr - min_lr)*progress) / base_lr
27
+ else:
28
+ # decay: warmup_steps -> total_steps
29
+ progress = float(current_step - warmup_steps) / float(max(1, total_steps - warmup_steps))
30
+ # LR(t) = max_lr + (min_lr - max_lr)*progress
31
+ return (max_lr + (min_lr - max_lr)*progress) / base_lr
32
+
33
+ scheduler = LambdaLR(optimizer, lr_lambda)
34
+ return scheduler
animation/utils/quat_utils.py ADDED
@@ -0,0 +1,179 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import torch
16
+ from typing import List, Tuple, Optional
17
+
18
+ EPS = 1e-8
19
+
20
+ def normalize_quaternion(quat: torch.Tensor, eps: float = EPS) -> torch.Tensor:
21
+ """
22
+ Normalize quaternions to unit length.
23
+
24
+ Args:
25
+ quat: Quaternion tensor of shape (..., 4) with (w, x, y, z) format
26
+ eps: Small value for numerical stability
27
+
28
+ Returns:
29
+ Normalized quaternions of same shape
30
+ """
31
+ norm = torch.norm(quat, dim=-1, keepdim=True)
32
+ return quat / torch.clamp(norm, min=eps)
33
+
34
+ def quat_multiply(q1: torch.Tensor, q2: torch.Tensor) -> torch.Tensor:
35
+ """
36
+ Multiply two quaternions using Hamilton product.
37
+ """
38
+ w1, x1, y1, z1 = torch.unbind(q1, dim=-1)
39
+ w2, x2, y2, z2 = torch.unbind(q2, dim=-1)
40
+
41
+ w = w1 * w2 - x1 * x2 - y1 * y2 - z1 * z2
42
+ x = w1 * x2 + x1 * w2 + y1 * z2 - z1 * y2
43
+ y = w1 * y2 - x1 * z2 + y1 * w2 + z1 * x2
44
+ z = w1 * z2 + x1 * y2 - y1 * x2 + z1 * w2
45
+
46
+ return torch.stack((w, x, y, z), dim=-1)
47
+
48
+ def quat_conjugate(quat: torch.Tensor) -> torch.Tensor:
49
+ """
50
+ Compute quaternion conjugate.
51
+ """
52
+ w, xyz = quat[..., :1], quat[..., 1:]
53
+ return torch.cat([w, -xyz], dim=-1)
54
+
55
+ def quat_inverse(quat: torch.Tensor, eps: float = EPS) -> torch.Tensor:
56
+ """
57
+ Compute quaternion inverse.
58
+ """
59
+ conjugate = quat_conjugate(quat)
60
+ norm_squared = torch.sum(quat * quat, dim=-1, keepdim=True)
61
+ return conjugate / torch.clamp(norm_squared, min=eps)
62
+
63
+ def quat_log(quat: torch.Tensor, eps: float = 1e-6) -> torch.Tensor:
64
+ """
65
+ Compute quaternion logarithm, mapping to rotation vectors (axis-angle).
66
+ """
67
+ # quat_norm = normalize_quaternion(quat, eps)
68
+ q_norm = torch.sqrt(torch.sum(quat * quat, dim=-1, keepdim=True))
69
+ quat_norm = quat / torch.clamp(q_norm, min=eps)
70
+
71
+ w = quat_norm[..., 0:1] # Scalar part
72
+ xyz = quat_norm[..., 1:] # Vector part
73
+
74
+ xyz_norm = torch.norm(xyz, dim=-1, keepdim=True)
75
+ w_clamped = torch.clamp(w, min=-1.0 + eps, max=1.0 - eps)
76
+
77
+ # half-angle
78
+ half_angle = torch.acos(torch.abs(w_clamped))
79
+
80
+ safe_xyz_norm = torch.clamp(xyz_norm, min=eps)
81
+
82
+ # Scale factor
83
+ scale = torch.where(
84
+ xyz_norm < eps,
85
+ torch.ones_like(xyz_norm),
86
+ half_angle / safe_xyz_norm
87
+ )
88
+
89
+ # Handle quaternion sign ambiguity (q and -q represent same rotation)
90
+ sign = torch.where(w >= 0, torch.ones_like(w), -torch.ones_like(w))
91
+
92
+ rotation_vector = sign * scale * xyz
93
+
94
+ return rotation_vector
95
+
96
+ def quat_rotate_vector(quat: torch.Tensor, vec: torch.Tensor) -> torch.Tensor:
97
+ """
98
+ Rotate a 3D vector by a quaternion.
99
+ """
100
+ q_vec = quat[..., 1:] # vector part
101
+ q_w = quat[..., 0:1] # scalar part
102
+
103
+ cross1 = torch.cross(q_vec, vec, dim=-1)
104
+ cross2 = torch.cross(q_vec, cross1, dim=-1)
105
+
106
+ # Apply the rotation formula
107
+ rotated_vec = vec + 2.0 * q_w * cross1 + 2.0 * cross2
108
+
109
+ return rotated_vec
110
+
111
+ def quat_to_rotation_matrix(quat: torch.Tensor, eps: float = EPS) -> torch.Tensor:
112
+ """
113
+ Convert quaternions to rotation matrices.
114
+ """
115
+ quat_norm = normalize_quaternion(quat, eps)
116
+ w, x, y, z = torch.unbind(quat_norm, dim=-1)
117
+
118
+ xx, yy, zz = x * x, y * y, z * z
119
+ xy, xz, yz = x * y, x * z, y * z
120
+ wx, wy, wz = w * x, w * y, w * z
121
+
122
+ r00 = 1.0 - 2.0 * (yy + zz)
123
+ r01 = 2.0 * (xy - wz)
124
+ r02 = 2.0 * (xz + wy)
125
+
126
+ r10 = 2.0 * (xy + wz)
127
+ r11 = 1.0 - 2.0 * (xx + zz)
128
+ r12 = 2.0 * (yz - wx)
129
+
130
+ r20 = 2.0 * (xz - wy)
131
+ r21 = 2.0 * (yz + wx)
132
+ r22 = 1.0 - 2.0 * (xx + yy)
133
+
134
+ rotation_matrix = torch.stack([
135
+ r00, r01, r02,
136
+ r10, r11, r12,
137
+ r20, r21, r22
138
+ ], dim=-1)
139
+
140
+ return rotation_matrix.reshape(quat.shape[:-1] + (3, 3))
141
+
142
+ def quat_to_transform_matrix(quat: torch.Tensor, pos: torch.Tensor) -> torch.Tensor:
143
+ """
144
+ Convert quaternion and position to 4x4 transformation matrix.
145
+ """
146
+ # rotation part
147
+ rotation = quat_to_rotation_matrix(quat)
148
+ batch_shape = rotation.shape[:-2]
149
+
150
+ # homogeneous transformation matrix
151
+ transform = torch.zeros(batch_shape + (4, 4), dtype=rotation.dtype, device=rotation.device)
152
+ transform[..., :3, :3] = rotation
153
+ transform[..., :3, 3] = pos
154
+ transform[..., 3, 3] = 1.0
155
+
156
+ return transform
157
+
158
+ def compute_rest_local_positions(
159
+ joint_positions: torch.Tensor,
160
+ parent_indices: List[int]
161
+ ) -> torch.Tensor:
162
+ """
163
+ Compute local positions relative to parent joints from global joint positions.
164
+ """
165
+
166
+ num_joints = joint_positions.shape[0]
167
+ local_positions = torch.zeros_like(joint_positions)
168
+
169
+ for j in range(num_joints):
170
+ parent_idx = parent_indices[j]
171
+
172
+ if parent_idx >= 0 and parent_idx != j and parent_idx < num_joints:
173
+ # Child joint: local offset = global_pos - parent_global_pos
174
+ local_positions[j] = joint_positions[j] - joint_positions[parent_idx]
175
+ else:
176
+ # Root joint: use global position as local position
177
+ local_positions[j] = joint_positions[j]
178
+
179
+ return local_positions
animation/utils/render_first_frame.py ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import os
16
+ import json
17
+ import argparse
18
+ from pathlib import Path
19
+
20
+ import torch
21
+ from pytorch3d.io import load_objs_as_meshes
22
+ from pytorch3d.renderer import TexturesVertex
23
+ from pytorch3d.structures import Meshes
24
+ from PIL import Image
25
+
26
+ from renderer import MeshRenderer3D
27
+ from utils.save_utils import render_single_mesh
28
+
29
+
30
+ def render_mesh_all_cameras(mesh_path, cameras_dir, output_dir="renders", image_size=512, device="cuda:0"):
31
+ """
32
+ Render mesh from all camera viewpoints in the cameras directory.
33
+
34
+ Args:
35
+ mesh_path: Path to OBJ mesh file
36
+ cameras_dir: Directory containing camera JSON config files
37
+ output_dir: Output directory for rendered images
38
+ image_size: Output image size
39
+ device: Device to use
40
+ """
41
+ cameras_dir = Path(cameras_dir)
42
+ output_dir = Path(output_dir)
43
+
44
+ # Find all JSON camera config files
45
+ json_files = list(cameras_dir.glob("*.json"))
46
+ if not json_files:
47
+ print(f"No JSON camera files found in {cameras_dir}")
48
+ return
49
+
50
+ print(f"Found {len(json_files)} camera configurations")
51
+
52
+ # Render from each camera viewpoint
53
+ for json_file in json_files:
54
+ # Load camera config
55
+ with open(json_file, 'r') as f:
56
+ cam_params = json.load(f)
57
+
58
+ # Setup renderer for this camera
59
+ renderer = MeshRenderer3D(device=device, image_size=image_size, cam_params=cam_params)
60
+
61
+ camera_name = json_file.stem
62
+ output_path = output_dir / f"render_{camera_name}.png"
63
+
64
+ render_single_mesh(renderer, mesh_path, str(output_path))
65
+
66
+ print(f"All renders saved to: {output_dir}")
67
+
68
+ def main():
69
+ parser = argparse.ArgumentParser(description="Render a mesh to an image")
70
+ parser.add_argument('--input_path', type=str, help="base input path")
71
+ parser.add_argument('--seq_name', type=str, help="sequence name")
72
+ parser.add_argument("--cameras_dir", default="utils/cameras", help="Camera config JSON file")
73
+ parser.add_argument("-s", "--size", type=int, default=512, help="Image size")
74
+ parser.add_argument("-d", "--device", default="cuda:0", help="Device to use")
75
+
76
+ args = parser.parse_args()
77
+
78
+ mesh_path = f'{args.input_path}/{args.seq_name}/objs/mesh.obj'
79
+ if not os.path.exists(mesh_path):
80
+ print(f"Error: Mesh file not found: {mesh_path}")
81
+ output_dir = f'{args.input_path}/{args.seq_name}/first_frames/'
82
+ os.makedirs(output_dir, exist_ok=True)
83
+
84
+ render_mesh_all_cameras(
85
+ mesh_path=mesh_path,
86
+ cameras_dir=args.cameras_dir,
87
+ output_dir=output_dir,
88
+ image_size=args.size,
89
+ device=args.device
90
+ )
91
+
92
+ if __name__ == "__main__":
93
+ main()
animation/utils/save_flow.py ADDED
@@ -0,0 +1,288 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+
3
+ #!/usr/bin/env python3
4
+ # -*- coding: utf-8 -*-
5
+ """
6
+ This module processes PNG frame sequences to generate optical flow using PTLFlow,
7
+ with support for visualization and video generation.
8
+ """
9
+
10
+ import argparse
11
+ import os
12
+ import subprocess
13
+ import shutil
14
+ import logging
15
+ from pathlib import Path
16
+ from typing import List, Tuple, Optional, Union
17
+
18
+ import cv2 as cv
19
+ import torch
20
+ import numpy as np
21
+ from tqdm import tqdm
22
+
23
+ from third_partys.ptlflow.ptlflow.utils import flow_utils
24
+ from third_partys.ptlflow.ptlflow.utils.io_adapter import IOAdapter
25
+ import third_partys.ptlflow.ptlflow as ptlflow
26
+
27
+ class OpticalFlowProcessor:
28
+ """Handles optical flow computation and visualization."""
29
+
30
+ def __init__(
31
+ self,
32
+ model_name: str = 'dpflow',
33
+ checkpoint: str = 'sintel',
34
+ device: Optional[str] = None,
35
+ resize_to: Optional[Tuple[int, int]] = None
36
+ ):
37
+ """
38
+ Initialize optical flow processor.
39
+
40
+ Args:
41
+ model_name: Name of the flow model to use
42
+ checkpoint: Checkpoint/dataset name for the model
43
+ device: Device to run on (auto-detect if None)
44
+ resize_to: Optional (width, height) to resize frames
45
+ """
46
+ self.model_name = model_name
47
+ self.checkpoint = checkpoint
48
+ self.device = device or ('cuda' if torch.cuda.is_available() else 'cpu')
49
+ self.resize_to = resize_to
50
+
51
+ # Initialize model
52
+ self.model = ptlflow.get_model(model_name, ckpt_path=checkpoint).to(self.device).eval()
53
+ print(f"Loaded {model_name} model on {self.device}")
54
+
55
+ self.io_adapter = None
56
+
57
+ def load_frame_sequence(self, frames_dir: Union[str, Path]) -> Tuple[List[np.ndarray], List[Path]]:
58
+ """
59
+ Load PNG frame sequence from directory.
60
+ """
61
+ frames_dir = Path(frames_dir)
62
+
63
+ if not frames_dir.exists():
64
+ raise FileNotFoundError(f"Frames directory not found: {frames_dir}")
65
+
66
+ # Find PNG files and sort naturally
67
+ png_files = list(frames_dir.glob('*.png'))
68
+ if len(png_files) < 2:
69
+ raise ValueError(f"Need at least 2 PNG frames, found {len(png_files)} in {frames_dir}")
70
+
71
+ # Natural sorting for proper frame order
72
+ png_files.sort(key=lambda x: self._natural_sort_key(x.name))
73
+
74
+ frames = []
75
+ for png_path in tqdm(png_files, desc="Loading frames"):
76
+ # Load image in color
77
+ img_bgr = cv.imread(str(png_path), cv.IMREAD_COLOR)
78
+
79
+ if self.resize_to:
80
+ img_bgr = cv.resize(img_bgr, self.resize_to, cv.INTER_LINEAR)
81
+
82
+ img_rgb = cv.cvtColor(img_bgr, cv.COLOR_BGR2RGB)
83
+ frames.append(img_rgb)
84
+
85
+ return frames, png_files
86
+
87
+ def _natural_sort_key(self, filename: str) -> List[Union[int, str]]:
88
+ """Natural sorting key for filenames with numbers."""
89
+ import re
90
+ return [int(text) if text.isdigit() else text.lower()
91
+ for text in re.split('([0-9]+)', filename)]
92
+
93
+ def compute_optical_flow_sequence(
94
+ self,
95
+ frames: List[np.ndarray],
96
+ flow_vis_dir: Union[str, Path],
97
+ flow_save_dir: Optional[Union[str, Path]] = None,
98
+ save_visualizations: bool = True
99
+ ) -> List[torch.Tensor]:
100
+ """
101
+ Compute optical flow for entire frame sequence.
102
+ """
103
+ if len(frames) < 2:
104
+ raise ValueError("Need at least 2 frames for optical flow")
105
+
106
+ flow_vis_dir = Path(flow_vis_dir)
107
+ flow_save_dir = Path(flow_save_dir) if flow_save_dir else flow_vis_dir
108
+
109
+ H, W = frames[0].shape[:2]
110
+
111
+ # Initialize IO adapter
112
+ if self.io_adapter is None:
113
+ self.io_adapter = IOAdapter(self.model, (H, W))
114
+
115
+ flows = []
116
+ for i in tqdm(range(len(frames) - 1), desc="Computing optical flow"):
117
+ # Prepare frame pair
118
+ frame_pair = [frames[i], frames[i + 1]]
119
+ raw_inputs = self.io_adapter.prepare_inputs(frame_pair)
120
+
121
+ imgs = raw_inputs['images'][0] # (2, 3, H, W)
122
+
123
+ pair_tensor = torch.stack((imgs[0:1], imgs[1:2]), dim=1).squeeze(0) # (1, 2, 3, H, W)
124
+ pair_tensor = pair_tensor.to(self.device, non_blocking=True).contiguous()
125
+
126
+ with torch.no_grad():
127
+ flow_result = self.model({'images': pair_tensor.unsqueeze(0)})
128
+ flow = flow_result['flows'][0] # (1, 2, H, W)
129
+
130
+ flows.append(flow)
131
+
132
+ if save_visualizations:
133
+ self._save_flow_outputs(flow, i, flow_vis_dir, flow_save_dir)
134
+
135
+ return flows
136
+
137
+ def _save_flow_outputs(
138
+ self,
139
+ flow_tensor: torch.Tensor,
140
+ frame_idx: int,
141
+ viz_dir: Path,
142
+ flow_dir: Path
143
+ ) -> None:
144
+ """Save flow outputs in both .flo and visualization formats."""
145
+ # Save raw flow (.flo format)
146
+ flow_hw2 = flow_tensor[0] # (2, H, W)
147
+ flow_np = flow_hw2.permute(1, 2, 0).cpu().numpy() # (H, W, 2)
148
+
149
+ flow_path = flow_dir / f'flow_{frame_idx:04d}.flo'
150
+ flow_utils.flow_write(flow_path, flow_np)
151
+
152
+ # Save visualization
153
+ flow_rgb = flow_utils.flow_to_rgb(flow_tensor)[0] # Remove batch dimension
154
+
155
+ if flow_rgb.dim() == 4: # (Npred, 3, H, W)
156
+ flow_rgb = flow_rgb[0]
157
+
158
+ flow_rgb_np = (flow_rgb * 255).byte().permute(1, 2, 0).cpu().numpy() # (H, W, 3)
159
+ viz_bgr = cv.cvtColor(flow_rgb_np, cv.COLOR_RGB2BGR)
160
+
161
+ viz_path = viz_dir / f'flow_viz_{frame_idx:04d}.png'
162
+ cv.imwrite(str(viz_path), viz_bgr)
163
+
164
+ def create_flow_video(
165
+ image_dir: Union[str, Path],
166
+ output_filename: str = 'flow.mp4',
167
+ fps: int = 10,
168
+ pattern: str = 'flow_viz_*.png',
169
+ cleanup_temp: bool = True
170
+ ) -> bool:
171
+ """
172
+ Create MP4 video from flow visualization images.
173
+ """
174
+ image_dir = Path(image_dir)
175
+
176
+ if not image_dir.exists():
177
+ print(f"Image directory not found: {image_dir}")
178
+
179
+ image_files = sorted(image_dir.glob(pattern))
180
+ if not image_files:
181
+ print(f"No images found matching pattern '{pattern}' in {image_dir}")
182
+
183
+ temp_dir = image_dir / 'temp_sequence'
184
+ temp_dir.mkdir(exist_ok=True)
185
+
186
+ try:
187
+ # Copy files with sequential naming
188
+ for i, img_file in enumerate(image_files):
189
+ temp_name = temp_dir / f'frame_{i:05d}.png'
190
+ shutil.copy2(img_file, temp_name)
191
+
192
+ # Create video using ffmpeg
193
+ output_path = image_dir / output_filename
194
+
195
+ cmd = [
196
+ 'ffmpeg', '-y',
197
+ '-framerate', str(fps),
198
+ '-i', str(temp_dir / 'frame_%05d.png'),
199
+ '-c:v', 'libx264',
200
+ '-pix_fmt', 'yuv420p',
201
+ str(output_path)
202
+ ]
203
+
204
+ subprocess.run(
205
+ cmd,
206
+ capture_output=True,
207
+ text=True,
208
+ check=True
209
+ )
210
+ return True
211
+ except Exception as e:
212
+ print(f"Video creation failed: {e}")
213
+ return False
214
+ finally:
215
+ if cleanup_temp and temp_dir.exists():
216
+ shutil.rmtree(temp_dir)
217
+
218
+ def main(
219
+ frames_dir: Union[str, Path],
220
+ flow_vis_dir: Union[str, Path] = 'flow_out',
221
+ flow_save_dir: Optional[Union[str, Path]] = None,
222
+ resize_to: Optional[Tuple[int, int]] = None,
223
+ model_name: str = 'dpflow',
224
+ checkpoint: str = 'sintel'
225
+ ) -> bool:
226
+
227
+ # Initialize processor
228
+ processor = OpticalFlowProcessor(
229
+ model_name=model_name,
230
+ checkpoint=checkpoint,
231
+ resize_to=resize_to
232
+ )
233
+
234
+ # Load frames
235
+ frames, png_paths = processor.load_frame_sequence(frames_dir)
236
+
237
+ # Compute optical flow
238
+ flows = processor.compute_optical_flow_sequence(
239
+ frames=frames,
240
+ flow_vis_dir=flow_vis_dir,
241
+ flow_save_dir=flow_save_dir,
242
+ save_visualizations=True
243
+ )
244
+
245
+ # Create video
246
+ create_flow_video(flow_vis_dir)
247
+
248
+ def get_parser():
249
+ parser = argparse.ArgumentParser(description="Optical flow inference on frame sequences")
250
+
251
+ parser.add_argument('--input_path', type=str, help="base input path")
252
+ parser.add_argument('--seq_name', type=str, help="sequence name")
253
+ parser.add_argument('--model_name', type=str, default='dpflow', help="Optical flow model to use")
254
+ parser.add_argument('--checkpoint', type=str, default='sintel', help="Model checkpoint/dataset name")
255
+ parser.add_argument('--resize_width', type=int, default=None, help="Resize frame width (must specify both width and height)")
256
+ parser.add_argument('--resize_height', type=int, default=None, help="Resize frame height (must specify both width and height)")
257
+ parser.add_argument('--fps', type=int, default=10, help="Frame rate for output video")
258
+
259
+ return parser
260
+
261
+ if __name__ == '__main__':
262
+ parser = get_parser()
263
+ args = parser.parse_args()
264
+
265
+ # Path
266
+ frames_dir = f'{args.input_path}/{args.seq_name}/imgs'
267
+ flow_vis_dir = frames_dir.replace("imgs", "flow_vis")
268
+ flow_save_dir = frames_dir.replace("imgs", "flow")
269
+
270
+ os.makedirs(flow_vis_dir, exist_ok=True)
271
+ os.makedirs(flow_save_dir, exist_ok=True)
272
+
273
+ # Prepare resize parameter
274
+ resize_to = None
275
+ if args.resize_width and args.resize_height:
276
+ resize_to = (args.resize_width, args.resize_height)
277
+
278
+ # Process optical flow
279
+ success = main(
280
+ frames_dir=frames_dir,
281
+ flow_vis_dir=flow_vis_dir,
282
+ flow_save_dir=flow_save_dir,
283
+ resize_to=resize_to,
284
+ model_name=args.model_name,
285
+ checkpoint=args.checkpoint
286
+ )
287
+
288
+ print("Optical flow processing completed successfully")
animation/utils/save_utils.py ADDED
@@ -0,0 +1,374 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from pytorch3d.io import load_obj
16
+ from pytorch3d.renderer import TexturesAtlas
17
+ from pytorch3d.structures import Meshes
18
+
19
+ import os
20
+ import torch
21
+ import json
22
+ import numpy as np
23
+ from tqdm import tqdm
24
+ from pathlib import Path
25
+ import subprocess
26
+ from PIL import Image
27
+ from scipy.ndimage import gaussian_filter1d
28
+ from third_partys.co_tracker.save_track import save_track
29
+
30
+ def render_single_mesh(renderer, mesh_path, out_path="render_result.png", atlas_size=8):
31
+ """
32
+ Test render a single mesh and save the result.
33
+ """
34
+ device = renderer.device
35
+
36
+ verts, faces, aux = load_obj(
37
+ mesh_path,
38
+ device=device,
39
+ load_textures=True,
40
+ create_texture_atlas=True,
41
+ texture_atlas_size=atlas_size,
42
+ texture_wrap="repeat"
43
+ )
44
+ atlas = aux.texture_atlas # (F, atlas_size, atlas_size, 3)
45
+
46
+ vmin, vmax = verts.min(0).values, verts.max(0).values
47
+ center = (vmax + vmin) / 2.
48
+ scale = (vmax - vmin).max()
49
+ verts = (verts - center) / scale
50
+
51
+ mesh_norm = Meshes(
52
+ verts=[verts],
53
+ faces=[faces.verts_idx],
54
+ textures=TexturesAtlas(atlas=[atlas])
55
+ )
56
+ with torch.no_grad():
57
+ rendered = renderer.render(mesh_norm) # shape=[1, H, W, 4]
58
+
59
+ rendered_img = renderer.tensor_to_image(rendered)
60
+
61
+ pil_img = Image.fromarray(rendered_img)
62
+ pil_img.save(out_path)
63
+ print(f"Saved render to {out_path}")
64
+
65
+ def apply_gaussian_smoothing(data, sigma = 1.0, preserve_first_frame = True, eps = 1e-8):
66
+ """
67
+ Apply Gaussian smoothing along the time axis with quaternion normalization.
68
+ """
69
+ smoothed = gaussian_filter1d(data, sigma=sigma, axis=0)
70
+
71
+ # Preserve first frame if requested
72
+ if preserve_first_frame and data.shape[0] > 0:
73
+ smoothed[0] = data[0]
74
+
75
+ if data.shape[-1] == 4:
76
+ norms = np.linalg.norm(smoothed, axis=-1, keepdims=True)
77
+ smoothed = smoothed / np.maximum(norms, eps)
78
+
79
+ return smoothed
80
+
81
+ def render_single_view_sequence(quats, root_quats, root_pos, renderer, model, output_dir, view_name, fps = 25):
82
+ """
83
+ Render animation sequence from a single viewpoint.
84
+ """
85
+ output_dir = Path(output_dir)
86
+ output_dir.mkdir(parents=True, exist_ok=True)
87
+
88
+ T = quats.shape[0]
89
+
90
+ model.animate(quats, root_quats, root_pos)
91
+
92
+ for i in tqdm(range(T), desc=f"Rendering {view_name}"):
93
+ mesh = model.get_mesh(i)
94
+ rendered = renderer.render(mesh)
95
+
96
+ img_array = renderer.tensor_to_image(rendered)
97
+ img = Image.fromarray(img_array)
98
+
99
+ frame_path = output_dir / f"{view_name}_frame_{i:04d}.png"
100
+ img.save(frame_path)
101
+
102
+ # Create video
103
+ video_path = output_dir / f"{view_name}_output_video.mp4"
104
+ cmd = f"ffmpeg -y -framerate {fps} -i {output_dir}/{view_name}_frame_%04d.png -c:v libx264 -pix_fmt yuv420p {video_path}"
105
+ subprocess.call(cmd, shell=True)
106
+
107
+ def save_and_smooth_results(args, model, renderer, final_quats, root_quats, root_pos, out_dir, additional_renderers = None, load_pt = False, sigma = 1.0, fps = 25):
108
+ """
109
+ Save and smooth animation results with multi-view rendering.
110
+ """
111
+ device = final_quats.device
112
+ T = final_quats.shape[0]
113
+ # Save Raw Results
114
+ if not load_pt:
115
+ raw_dir = os.path.join(out_dir, "raw")
116
+ os.makedirs(raw_dir, exist_ok=True)
117
+
118
+ torch.save(final_quats, os.path.join(raw_dir, "local_quats.pt"))
119
+ torch.save(root_quats, os.path.join(raw_dir, "root_quats.pt"))
120
+ torch.save(root_pos, os.path.join(raw_dir, "root_pos.pt"))
121
+ if hasattr(model, 'rest_local_positions'):
122
+ torch.save(model.rest_local_positions, os.path.join(raw_dir, "rest_local_positions.pt"))
123
+
124
+ print(f"Saved raw motion to {raw_dir}")
125
+
126
+ quats_np = final_quats.cpu().numpy()
127
+ root_quats_np = root_quats.cpu().numpy()
128
+ root_pos_np = root_pos.cpu().numpy()
129
+
130
+ # Apply Gaussian smoothing if enabled
131
+ if args.gauss_filter:
132
+ print(f"Applying Gaussian smoothing (sigma={sigma})")
133
+
134
+ smooth_quats_np = apply_gaussian_smoothing(
135
+ quats_np, sigma=sigma, preserve_first_frame=True
136
+ )
137
+ smooth_root_quats_np = apply_gaussian_smoothing(
138
+ root_quats_np, sigma=sigma, preserve_first_frame=True
139
+ )
140
+ smooth_root_pos_np = apply_gaussian_smoothing(
141
+ root_pos_np, sigma=sigma, preserve_first_frame=True
142
+ )
143
+ smooth_dir = os.path.join(out_dir, "smoothed")
144
+ os.makedirs(smooth_dir, exist_ok=True)
145
+ save_dir = smooth_dir
146
+
147
+ else:
148
+ smooth_quats_np = quats_np
149
+ smooth_root_quats_np = root_quats_np
150
+ smooth_root_pos_np = root_pos_np
151
+ save_dir = raw_dir
152
+
153
+ smooth_quats = torch.tensor(smooth_quats_np, dtype=torch.float32, device=device)
154
+ smooth_root_quats = torch.tensor(smooth_root_quats_np, dtype=torch.float32, device=device)
155
+ smooth_root_pos = torch.tensor(smooth_root_pos_np, dtype=torch.float32, device=device)
156
+
157
+ # Render Sequences
158
+ if not load_pt and args.gauss_filter:
159
+ smooth_dir_path = Path(smooth_dir)
160
+ torch.save(smooth_quats, smooth_dir_path / "local_quats.pt")
161
+ torch.save(smooth_root_quats, smooth_dir_path / "root_quats.pt")
162
+ torch.save(smooth_root_pos, smooth_dir_path / "root_pos.pt")
163
+ print(f"Saved smoothed motion to {smooth_dir}")
164
+
165
+ # Render main view
166
+ print(f"Rendering {args.main_renderer} view ({T} frames)")
167
+ render_single_view_sequence(
168
+ smooth_quats, smooth_root_quats, smooth_root_pos,
169
+ renderer, model, save_dir, args.main_renderer, fps
170
+ )
171
+
172
+ # Render additional views if provided
173
+ if additional_renderers:
174
+ for renderer_key, view_renderer in additional_renderers.items():
175
+ view_name = renderer_key.replace("_renderer", "")
176
+ render_single_view_sequence(
177
+ smooth_quats, smooth_root_quats, smooth_root_pos,
178
+ view_renderer, model, save_dir, view_name, fps
179
+ )
180
+
181
+ def save_args(args, output_dir, filename="config.json"):
182
+ args_dict = vars(args)
183
+ os.makedirs(output_dir, exist_ok=True)
184
+
185
+ config_path = os.path.join(output_dir, filename)
186
+ with open(config_path, 'w') as f:
187
+ json.dump(args_dict, f, indent=4)
188
+
189
+ def visualize_joints_on_mesh(model, renderer, seq_name, out_dir):
190
+ """
191
+ Render mesh with joint visualizations and return visibility mask.
192
+ """
193
+ joints_2d = renderer.project_points(model.joints_rest)
194
+
195
+ mesh = model.get_mesh()
196
+ image_with_joints, vis_mask = renderer.render_with_points(mesh, model.joints_rest)
197
+ image_np = image_with_joints[0].cpu().numpy()
198
+ if image_np.shape[2] == 4:
199
+ image_rgb = image_np[..., :3]
200
+ else:
201
+ image_rgb = image_np
202
+ if image_rgb.max() <= 1.0:
203
+ image_rgb = (image_rgb * 255).astype(np.uint8)
204
+ img = Image.fromarray(image_rgb)
205
+ output_path = f"{out_dir}/mesh_with_joints_{seq_name}_visible.png"
206
+ img.save(output_path)
207
+ return vis_mask
208
+
209
+ def visualize_points_on_mesh(model, renderer, seq_name, out_dir):
210
+ """
211
+ Render mesh with point visualizations and return visibility mask.
212
+ """
213
+ points_2d = renderer.project_points(model.vertices[0])
214
+
215
+ mesh = model.get_mesh()
216
+ image_with_points, vis_mask = renderer.render_with_points(mesh, model.vertices[0], for_vertices=True)
217
+ image_np = image_with_points[0].cpu().numpy()
218
+ if image_np.shape[2] == 4:
219
+ image_rgb = image_np[..., :3]
220
+ else:
221
+ image_rgb = image_np
222
+ if image_rgb.max() <= 1.0:
223
+ image_rgb = (image_rgb * 255).astype(np.uint8)
224
+ img = Image.fromarray(image_rgb)
225
+ output_path = f"{out_dir}/mesh_with_verts_{seq_name}_visible.png"
226
+ img.save(output_path)
227
+ return vis_mask
228
+
229
+ def save_track_points(point_vis_mask, renderer, model, img_path, out_dir, args):
230
+ """
231
+ Save and track selected points on the mesh with intelligent sampling.
232
+ """
233
+
234
+ vertex_project_2d = renderer.project_points(model.vertices[0])
235
+ visible_indices = torch.where(point_vis_mask)[0]
236
+
237
+ track_2d_point_path = img_path.replace('imgs', 'track_2d_verts')
238
+ os.makedirs(track_2d_point_path, exist_ok=True)
239
+
240
+ num_visible = len(visible_indices)
241
+ MAX_VISIBLE_POINTS = 15000
242
+ MAX_SAMPLE_POINTS = 4000
243
+
244
+ # Determine tracking strategy
245
+ tracking_mode = "full" if num_visible <= MAX_VISIBLE_POINTS else "sampled"
246
+
247
+ if not os.listdir(track_2d_point_path):
248
+ # Generate new tracking data
249
+ if tracking_mode == "full":
250
+ print(f"Saving tracks for all visible vertices (count: {num_visible})")
251
+
252
+ # Track all visible points
253
+ visible_vertex_project_2d = vertex_project_2d[visible_indices]
254
+ track_2d_point = save_track(
255
+ args.seq_name, visible_vertex_project_2d, img_path,
256
+ track_2d_point_path, out_dir, for_point=True
257
+ )
258
+
259
+ np.save(f'{track_2d_point_path}/visible_indices.npy',
260
+ visible_indices.cpu().numpy())
261
+
262
+ # Sample subset for final use
263
+ num_sample = min(MAX_SAMPLE_POINTS, num_visible)
264
+ sampled_local_indices = torch.randperm(num_visible)[:num_sample]
265
+ sampled_vertex_indices = visible_indices[sampled_local_indices]
266
+ np.save(f'{track_2d_point_path}/sampled_indices.npy',
267
+ sampled_vertex_indices.cpu().numpy())
268
+
269
+ else:
270
+ print(f"Too many visible vertices ({num_visible} > {MAX_VISIBLE_POINTS}), "
271
+ f"tracking only {MAX_SAMPLE_POINTS} sampled vertices")
272
+
273
+ # Sample points directly from visible set
274
+ num_sample = min(MAX_SAMPLE_POINTS, num_visible)
275
+ sampled_local_indices = torch.randperm(num_visible)[:num_sample]
276
+ sampled_vertex_indices = visible_indices[sampled_local_indices]
277
+
278
+ # Track only sampled points
279
+ sampled_vertex_project_2d = vertex_project_2d[sampled_vertex_indices]
280
+ track_2d_point = save_track(
281
+ args.seq_name, sampled_vertex_project_2d, img_path,
282
+ track_2d_point_path, out_dir, for_point=True
283
+ )
284
+
285
+ np.save(f'{track_2d_point_path}/visible_indices.npy',
286
+ visible_indices.cpu().numpy())
287
+ np.save(f'{track_2d_point_path}/sampled_indices.npy',
288
+ sampled_vertex_indices.cpu().numpy())
289
+
290
+ else:
291
+ # Load existing tracking data
292
+ print("Loading existing vertex tracks")
293
+ track_2d_point = np.load(f'{track_2d_point_path}/pred_tracks.npy')
294
+
295
+ visible_indices = np.load(f'{track_2d_point_path}/visible_indices.npy')
296
+ visible_indices = torch.from_numpy(visible_indices).long().to(args.device)
297
+
298
+ sampled_vertex_indices = np.load(f'{track_2d_point_path}/sampled_indices.npy')
299
+ sampled_vertex_indices = torch.from_numpy(sampled_vertex_indices).long().to(args.device)
300
+
301
+ track_2d_point = torch.from_numpy(track_2d_point).float().to(args.device)
302
+
303
+ # Create index mapping for tracking data
304
+ if tracking_mode == "full":
305
+ # Map from original vertex indices to positions in tracking data
306
+ vertex_to_track_idx = {idx.item(): i for i, idx in enumerate(visible_indices)}
307
+
308
+ track_indices = torch.tensor(
309
+ [vertex_to_track_idx[idx.item()] for idx in sampled_vertex_indices],
310
+ device=args.device, dtype=torch.long
311
+ )
312
+ else:
313
+ # Direct mapping for sampled-only tracking
314
+ track_indices = torch.arange(len(sampled_vertex_indices),
315
+ device=args.device, dtype=torch.long)
316
+
317
+ return track_2d_point, track_indices, sampled_vertex_indices
318
+
319
+ def save_final_video(args):
320
+
321
+ additional_views = [view.strip() for view in args.additional_renderers.split(',') if view.strip()]
322
+ if len(additional_views) > 3:
323
+ additional_views = additional_views[:3]
324
+ additional_views = [view for view in additional_views if view != args.main_renderer]
325
+
326
+ save_dir = 'raw' if not args.gauss_filter else 'smoothed'
327
+ import subprocess
328
+ cmd = (
329
+ f'ffmpeg '
330
+ f'-i {args.input_path}/{args.seq_name}/input.mp4 '
331
+ f'-i {args.save_path}/{args.seq_name}/{args.save_name}/{save_dir}/{args.main_renderer}_output_video.mp4 '
332
+ '-filter_complex "'
333
+ '[0:v][1:v]hstack=inputs=2[stacked]; '
334
+ '[stacked]drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf:text=\'gt\':x=(w/4-text_w/2):y=20:fontsize=24:fontcolor=white:box=1:boxcolor=black:boxborderw=10, '
335
+ f'drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf:text=\'ours\':x=(3*w/4-text_w/2):y=20:fontsize=24:fontcolor=white:box=1:boxcolor=black:boxborderw=10" '
336
+ f'-c:a copy {args.save_path}/{args.seq_name}/{args.save_name}/concat_output.mp4'
337
+ )
338
+
339
+ subprocess.call(cmd, shell=True)
340
+ cmd = (
341
+ f'ffmpeg '
342
+ f'-i {args.input_path}/{args.seq_name}/input.mp4 '
343
+ f'-i {args.save_path}/{args.seq_name}/{args.save_name}/{save_dir}/{args.main_renderer}_output_video.mp4 '
344
+ f'-i {args.save_path}/{args.seq_name}/{args.save_name}/{save_dir}/{additional_views[0]}_output_video.mp4 '
345
+ f'-i {args.save_path}/{args.seq_name}/{args.save_name}/{save_dir}/{additional_views[1]}_output_video.mp4 '
346
+ f'-i {args.save_path}/{args.seq_name}/{args.save_name}/{save_dir}/{additional_views[2]}_output_video.mp4 '
347
+ '-filter_complex "'
348
+ '[0:v][1:v][2:v][3:v][4:v]hstack=inputs=5[stacked]; '
349
+ '[stacked]drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf:text=\'gt\':x=(w/10-text_w/2):y=20:fontsize=24:fontcolor=white:box=1:boxcolor=black:boxborderw=10, '
350
+ f'drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf:text=\'{args.main_renderer}\':x=(3*w/10-text_w/2):y=20:fontsize=24:fontcolor=white:box=1:boxcolor=black:boxborderw=10, '
351
+ f'drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf:text=\'{additional_views[0]}\':x=(5*w/10-text_w/2):y=20:fontsize=24:fontcolor=white:box=1:boxcolor=black:boxborderw=10, '
352
+ f'drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf:text=\'{additional_views[1]}\':x=(7*w/10-text_w/2):y=20:fontsize=24:fontcolor=white:box=1:boxcolor=black:boxborderw=10, '
353
+ f'drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf:text=\'{additional_views[2]}\':x=(9*w/10-text_w/2):y=20:fontsize=24:fontcolor=white:box=1:boxcolor=black:boxborderw=10" '
354
+ f'-c:a copy {args.save_path}/{args.seq_name}/{args.save_name}/concat_output_4view.mp4'
355
+ )
356
+ subprocess.call(cmd, shell=True)
357
+
358
+ def load_motion_data(motion_dir, device="cuda:0"):
359
+ """
360
+ Load saved motion data.
361
+ """
362
+ local_quats = torch.load(os.path.join(motion_dir, "local_quats.pt"), map_location=device)
363
+ root_quats = torch.load(os.path.join(motion_dir, "root_quats.pt"), map_location=device)
364
+ root_pos = torch.load(os.path.join(motion_dir, "root_pos.pt"), map_location=device)
365
+
366
+ # Load rest positions if available (for reference)
367
+ rest_pos_path = os.path.join(motion_dir, "rest_local_positions.pt")
368
+ if os.path.exists(rest_pos_path):
369
+ rest_positions = torch.load(rest_pos_path, map_location=device)
370
+ else:
371
+ rest_positions = None
372
+ print("Warning: rest_local_positions.pt not found, model should have them initialized")
373
+
374
+ return local_quats, root_quats, root_pos, rest_positions