dashdoas commited on
Commit
736dcf7
·
verified ·
1 Parent(s): e40480e

Upload 101 files

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +17 -0
  2. LICENSE +201 -0
  3. README.md +113 -13
  4. animation/README.md +77 -0
  5. animation/demo.sh +7 -0
  6. animation/download.py +13 -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/utils/cameras/back.json +1 -0
  28. animation/utils/cameras/back_left.json +64 -0
  29. animation/utils/cameras/back_right.json +64 -0
  30. animation/utils/cameras/front.json +1 -0
  31. animation/utils/cameras/front_left.json +64 -0
  32. animation/utils/cameras/front_right.json +64 -0
  33. animation/utils/cameras/left.json +1 -0
  34. animation/utils/cameras/right.json +1 -0
  35. animation/utils/data_loader.py +170 -0
  36. animation/utils/loss_utils.py +420 -0
  37. animation/utils/misc.py +34 -0
  38. animation/utils/quat_utils.py +179 -0
  39. animation/utils/render_first_frame.py +93 -0
  40. animation/utils/save_flow.py +288 -0
  41. animation/utils/save_utils.py +374 -0
  42. assets/puppeteer_teaser.gif +3 -0
  43. assets/reconstruction.png +3 -0
  44. assets/skeleton_results.png +3 -0
  45. demo_animation.sh +63 -0
  46. demo_rigging.sh +68 -0
  47. examples/deer.obj +0 -0
  48. examples/deer/input.mp4 +3 -0
  49. examples/deer/objs/material.mtl +10 -0
  50. examples/deer/objs/mesh.obj +0 -0
.gitattributes CHANGED
@@ -33,3 +33,20 @@ 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
39
+ assets/puppeteer_teaser.gif filter=lfs diff=lfs merge=lfs -text
40
+ assets/reconstruction.png filter=lfs diff=lfs merge=lfs -text
41
+ assets/skeleton_results.png filter=lfs diff=lfs merge=lfs -text
42
+ examples/deer/input.mp4 filter=lfs diff=lfs merge=lfs -text
43
+ examples/deer/objs/texture_pbr_v128_metallic.png filter=lfs diff=lfs merge=lfs -text
44
+ examples/deer/objs/texture_pbr_v128_normal.png filter=lfs diff=lfs merge=lfs -text
45
+ examples/deer/objs/texture_pbr_v128_roughness.png filter=lfs diff=lfs merge=lfs -text
46
+ examples/deer/objs/texture_pbr_v128.png filter=lfs diff=lfs merge=lfs -text
47
+ examples/spiderman/input.mp4 filter=lfs diff=lfs merge=lfs -text
48
+ examples/spiderman/objs/texture_pbr_v128_metallic.png filter=lfs diff=lfs merge=lfs -text
49
+ examples/spiderman/objs/texture_pbr_v128_normal.png filter=lfs diff=lfs merge=lfs -text
50
+ examples/spiderman/objs/texture_pbr_v128_roughness.png filter=lfs diff=lfs merge=lfs -text
51
+ examples/spiderman/objs/texture_pbr_v128.png filter=lfs diff=lfs merge=lfs -text
52
+ skeleton/data_utils/examples/0a59c5ffa4a1476bac6d540b79947f31_render_results.png filter=lfs diff=lfs merge=lfs -text
LICENSE ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
README.md CHANGED
@@ -1,13 +1,113 @@
1
- ---
2
- title: Mypuppeteerai
3
- emoji: 🐨
4
- colorFrom: pink
5
- colorTo: indigo
6
- sdk: gradio
7
- sdk_version: 6.12.0
8
- app_file: app.py
9
- pinned: false
10
- short_description: dsad
11
- ---
12
-
13
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div align="center">
2
+
3
+ <h1>Puppeteer: Rig and Animate Your 3D Models</h1>
4
+
5
+ <p>
6
+ <a href="https://chaoyuesong.github.io"><strong>Chaoyue Song</strong></a><sup>1,2</sup>,
7
+ <a href="https://lixiulive.com/"><strong>Xiu Li</strong></a><sup>2</sup>,
8
+ <a href="https://scholar.google.com/citations?user=afDvaa8AAAAJ&hl"><strong>Fan Yang</strong></a><sup>1</sup>,
9
+ <a href="https://zcxu-eric.github.io/"><strong>Zhongcong Xu</strong></a><sup>2</sup>,
10
+ <a href="https://plusmultiply.github.io/"><strong>Jiacheng Wei</strong></a><sup>1</sup>,
11
+ <br>
12
+ <a href="https://sites.google.com/site/fayaoliu"><strong>Fayao Liu</strong></a><sup>3</sup>,
13
+ <a href="https://scholar.google.com.sg/citations?user=Q8iay0gAAAAJ"><strong>Jiashi Feng</strong></a><sup>2</sup>,
14
+ <a href="https://guosheng.github.io/"><strong>Guosheng Lin</strong></a><sup>1*</sup>,
15
+ <a href="https://jfzhang95.github.io/"><strong>Jianfeng Zhang</strong></a><sup>2*</sup>
16
+ <br>
17
+ *Corresponding authors
18
+ <br>
19
+ <sup>1 </sup>Nanyang Technological University
20
+ <sup>2 </sup>Bytedance Seed
21
+ <sup>3 </sup>A*STAR
22
+ </p>
23
+
24
+ <h3>NeurIPS 2025 (Spotlight)</h3>
25
+
26
+ <div align="center">
27
+ <img width="80%" src="assets/puppeteer_teaser.gif">
28
+ </div>
29
+
30
+ <p>
31
+ <a href="https://chaoyuesong.github.io/Puppeteer/"><strong>Project</strong></a> |
32
+ <a href="https://arxiv.org/abs/2508.10898"><strong>Paper</strong></a> |
33
+ <a href="https://www.youtube.com/watch?v=DnKx803JHyI"><strong>Video</strong></a> |
34
+ <a href="https://huggingface.co/datasets/chaoyue7/Articulation-XL2.0"><strong>Data: Articulation-XL2.0</strong></a>
35
+ </p>
36
+
37
+
38
+ </div>
39
+
40
+ <br/>
41
+
42
+ Puppeteer is proposed for **automatic rigging and animation of 3D objects**. Given a 3D object, Puppeteer first automatically generates skeletal structures and skinning weights, then animates the rigged model with video guidance through a differentiable optimization pipeline. This comprehensive approach aims to enable fully automated transformation of static 3D models into dynamically animated assets, eliminating the need for manual rigging expertise and significantly streamlining 3D content creation workflows.
43
+
44
+ <br/>
45
+
46
+ ## 🔥 News
47
+ - Sep 19, 2025: Puppeteer is accepted as a **spotlight** paper at NeurIPS 2025, see you in San Diego!
48
+ - Sep 10, 2025: Thanks to the efforts of @[czpcf](https://github.com/czpcf), you can now export rigged meshes to FBX files.
49
+ - Sep 09, 2025: We uploaded the [video](https://www.youtube.com/watch?v=DnKx803JHyI) for Puppeteer.
50
+ - Sep 04, 2025: We have released the diverse pose subset of Articulation-XL2.0, and now the [complete Articulation-XL2.0 dataset](https://huggingface.co/datasets/Seed3D/Articulation-XL2.0) is available (**more than 2k downloads**), featuring 59.4K high-quality rigged data samples. We also release the inference codes and [model checkpoints](https://huggingface.co/Seed3D/Puppeteer).
51
+ - Aug 15, 2025: Release [paper](https://arxiv.org/abs/2508.10898) of Puppeteer!
52
+
53
+
54
+ ## 🔧 Installtation
55
+ We use Python 3.10 with PyTorch 2.1.1 and CUDA 11.8. The environment and required packages can be installed as follows:
56
+
57
+ ```
58
+ git clone https://github.com/Seed3D/Puppeteer.git --recursive && cd Puppeteer
59
+ conda create -n puppeteer python==3.10.13 -y
60
+ conda activate puppeteer
61
+ pip install torch==2.1.1 torchvision==0.16.1 torchaudio==2.1.1 --index-url https://download.pytorch.org/whl/cu118
62
+ pip install -r requirements.txt
63
+ pip install flash-attn==2.6.3 --no-build-isolation
64
+ pip install torch-scatter -f https://data.pyg.org/whl/torch-2.1.1+cu118.html
65
+ pip install --no-index --no-cache-dir pytorch3d -f https://dl.fbaipublicfiles.com/pytorch3d/packaging/wheels/py310_cu118_pyt211/download.html
66
+ ```
67
+
68
+ ## 🚀 Demo
69
+
70
+ We provide a complete pipeline for rigging and animating 3D models. **Before running the pipeline, visit each folder (skeleton, skinning, animation) to download the necessary model checkpoints.** Example data is available in the [examples](https://github.com/Seed3D/Puppeteer/tree/main/examples) folder.
71
+
72
+ ### Rigging
73
+
74
+ Given 3D meshes, we first predict the skeleton and skinning weights:
75
+
76
+ ```
77
+ bash demo_rigging.sh
78
+ ```
79
+
80
+ The final rig files will be saved in `results/final_rigging`. **To evaluate the [skeleton](https://github.com/Seed3D/Puppeteer/tree/main/skeleton) and [skinning](https://github.com/Seed3D/Puppeteer/tree/main/skinning) components separately, refer to the README in each folder.** After that, you can export the rigged mesh to FBX file:
81
+
82
+ ```
83
+ python export.py --mesh examples/deer.obj --rig results/final_rigging/deer.txt --output deer.fbx
84
+ ```
85
+
86
+ Before running this script, make sure to install `bpy==4.2.0`.
87
+
88
+ ### Video-guided 3D animation
89
+
90
+ To animate the rigged model using video guidance, run:
91
+
92
+ ```
93
+ bash demo_animation.sh
94
+ ```
95
+
96
+ The rendered 3D animation sequence from different views will be saved in `results/animation`. Refer to the README in the [animation folder](https://github.com/Seed3D/Puppeteer/tree/main/animation) for comprehensive details on data processing and structure.
97
+
98
+
99
+ ## 😊 Acknowledgment
100
+
101
+ The code builds upon [MagicArticulate](https://github.com/Seed3D/MagicArticulate), [MeshAnything](https://github.com/buaacyw/MeshAnything), [Functional Diffusion](https://1zb.github.io/functional-diffusion/), [RigNet](https://github.com/zhan-xu/RigNet), [Michelangelo](https://github.com/NeuralCarver/Michelangelo/), [PartField](https://github.com/nv-tlabs/PartField), [AnyMole](https://github.com/kwanyun/AnyMoLe) and [Lab4D](https://github.com/lab4d-org/lab4d). We gratefully acknowledge the authors for making their work publicly available.
102
+
103
+
104
+ ## 📚 Citation
105
+
106
+ ```
107
+ @article{song2025puppeteer,
108
+ title={Puppeteer: Rig and Animate Your 3D Models},
109
+ author={Chaoyue Song and Xiu Li and Fan Yang and Zhongcong Xu and Jiacheng Wei and Fayao Liu and Jiashi Feng and Guosheng Lin and Jianfeng Zhang},
110
+ journal={Advances in Neural Information Processing Systems},
111
+ year={2025}
112
+ }
113
+ ```
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/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/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
assets/puppeteer_teaser.gif ADDED

Git LFS Details

  • SHA256: 053ae169afdb883e4ba66d886ef1f8bd62d9822e8ff75434f55c3e50c1a0012f
  • Pointer size: 132 Bytes
  • Size of remote file: 2.15 MB
assets/reconstruction.png ADDED

Git LFS Details

  • SHA256: 1315404c1c1cf3e8d1a53d290087d765c47e83849a313dc1e27001319466c0f3
  • Pointer size: 131 Bytes
  • Size of remote file: 264 kB
assets/skeleton_results.png ADDED

Git LFS Details

  • SHA256: e56a2b174458994e392abf1e5bc756fc876c448ac3f49a1c7e4eaef39c5096a2
  • Pointer size: 131 Bytes
  • Size of remote file: 179 kB
demo_animation.sh ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ echo "Running animation..."
4
+
5
+ # copy rig and mesh for animation
6
+ for txt_file in results/final_rigging/*.txt; do
7
+ if [ -f "$txt_file" ]; then
8
+ seq_name=$(basename "$txt_file" .txt)
9
+
10
+ mkdir -p "examples/$seq_name/objs/"
11
+
12
+ cp "$txt_file" "examples/$seq_name/objs/rig.txt"
13
+ echo "Copied $txt_file -> examples/$seq_name/objs/rig.txt"
14
+
15
+ obj_file="examples/$seq_name.obj"
16
+ if [ -f "$obj_file" ]; then
17
+ cp "$obj_file" "examples/$seq_name/objs/mesh.obj"
18
+ echo "Copied $obj_file -> examples/$seq_name/objs/mesh.obj"
19
+ else
20
+ echo "Warning: $obj_file not found"
21
+ fi
22
+
23
+ # extract frames
24
+ video_file="examples/$seq_name/input.mp4"
25
+ if [ -f "$video_file" ]; then
26
+ echo "Found video file: $video_file"
27
+ cd "examples/$seq_name"
28
+ mkdir -p imgs
29
+ ffmpeg -i input.mp4 -vf fps=10 imgs/frame_%04d.png -y
30
+ echo "Extracted frames from $video_file to imgs/"
31
+ cd ../../
32
+ else
33
+ echo "No video file found: $video_file"
34
+ fi
35
+ fi
36
+ done
37
+
38
+ cd animation
39
+
40
+ # save flow
41
+ echo "Processing sequences with save_flow.py..."
42
+ for seq_dir in ../examples/*/; do
43
+ if [ -d "$seq_dir" ]; then
44
+ seq_name=$(basename "$seq_dir")
45
+ echo "Processing sequence: $seq_name"
46
+ python utils/save_flow.py --input_path ../examples --seq_name "$seq_name"
47
+ fi
48
+ done
49
+
50
+ # animation
51
+ echo "Running optimization for each sequence..."
52
+ mkdir -p ../results/animation
53
+
54
+ python optimization.py --save_path ../results/animation --iter 200 --input_path ../examples --img_size 960 \
55
+ --seq_name 'spiderman' --save_name 'spiderman_demo'
56
+
57
+ python optimization.py --save_path ../results/animation --iter 200 --input_path ../examples --img_size 960 \
58
+ --seq_name 'deer' --save_name 'deer_demo' --smooth_weight 1 --main_renderer front_left --additional_renderer "right,front_right,back_right"
59
+
60
+ echo "Animation completed."
61
+
62
+ cd ..
63
+ echo "Puppeteer pipeline completed successfully!"
demo_rigging.sh ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ echo "Starting Puppeteer rigging pipeline..."
4
+
5
+ mkdir -p results
6
+
7
+ # skeleton
8
+ echo "Running skeleton generation..."
9
+ cd skeleton
10
+ python demo.py \
11
+ --input_dir ../examples \
12
+ --pretrained_weights skeleton_ckpts/puppeteer_skeleton_w_diverse_pose.pth \
13
+ --output_dir ../results/ --save_name skel_results --input_pc_num 8192 \
14
+ --save_render --apply_marching_cubes --joint_token --seq_shuffle
15
+
16
+ echo "Skeleton generation completed."
17
+
18
+ # If you found the results not satisfactory, try the model trained with bone-based tokenization:
19
+ # echo "Running skeleton with bone tokenization..."
20
+ # python demo.py \
21
+ # --input_dir ../examples \
22
+ # --pretrained_weights skeleton_ckpts/puppeteer_skeleton_w_diverse_pose_bone_token.pth \
23
+ # --output_dir ../results/ --save_name skel_results --input_pc_num 8192 \
24
+ # --save_render --apply_marching_cubes --hier_order --seq_shuffle
25
+
26
+
27
+ # Copy generated rig files to skeletons for following skinning
28
+ echo "Copying generated rig files..."
29
+ mkdir -p ../results/skeletons/
30
+ cd ../results/skel_results/
31
+ for file in *_pred.txt; do
32
+ if [ -f "$file" ]; then
33
+ new_name=$(echo "$file" | sed 's/_pred\.txt$/.txt/')
34
+ cp "$file" "../skeletons/$new_name"
35
+ fi
36
+ done
37
+ cd ../../skeleton
38
+ echo "Rig files copied to results/skeletons/"
39
+
40
+
41
+ # skinning
42
+ # Note that meshes with complex topology may require more data processing time.
43
+ echo "Running skinning..."
44
+ cd ../skinning
45
+ CUDA_VISIBLE_DEVICES=0 torchrun \
46
+ --nproc_per_node=1 \
47
+ --master_port=10009 \
48
+ main.py \
49
+ --num_workers 1 --batch_size 1 --generate --save_skin_npy \
50
+ --pretrained_weights skinning_ckpts/puppeteer_skin_w_diverse_pose_depth1.pth \
51
+ --input_skel_folder ../results/skeletons \
52
+ --mesh_folder ../examples \
53
+ --post_filter --depth 1 --save_folder ../results/skin_results
54
+
55
+ echo "Skinning completed."
56
+
57
+
58
+ echo "Copying generated skin files..."
59
+ mkdir -p ../results/final_rigging/
60
+ cd ../results/skin_results/generate/
61
+ for file in *_skin.txt; do
62
+ if [ -f "$file" ]; then
63
+ new_name=$(echo "$file" | sed 's/_skin\.txt$/.txt/')
64
+ cp "$file" "../../final_rigging/$new_name"
65
+ fi
66
+ done
67
+ cd ../../../
68
+ echo "Final rig files copied to results/final_rigging/"
examples/deer.obj ADDED
The diff for this file is too large to render. See raw diff
 
examples/deer/input.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:651b2ee9ec571c1e7834e6810fcee797719381baec435f24a9f46198624cfdbc
3
+ size 274954
examples/deer/objs/material.mtl ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ newmtl Material
2
+ Kd 0.800 0.800 0.800
3
+ Ke 0.000 0.000 0.000
4
+ Ni 1.500
5
+ d 1.0
6
+ illum 2
7
+ map_Kd texture_pbr_v128.png
8
+ map_Pm texture_pbr_v128_metallic.png
9
+ map_Pr texture_pbr_v128_roughness.png
10
+ map_Bump -bm 1.0 texture_pbr_v128_normal.png
examples/deer/objs/mesh.obj ADDED
The diff for this file is too large to render. See raw diff