Spaces:
Running
Running
Upload 101 files
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .gitattributes +17 -0
- LICENSE +201 -0
- README.md +113 -13
- animation/README.md +77 -0
- animation/demo.sh +7 -0
- animation/download.py +13 -0
- animation/inputs/crocodile/first_frames/render_back.png +0 -0
- animation/inputs/crocodile/first_frames/render_front.png +0 -0
- animation/inputs/crocodile/first_frames/render_left.png +0 -0
- animation/inputs/crocodile/first_frames/render_right.png +0 -0
- animation/inputs/crocodile/input.mp4 +3 -0
- animation/inputs/crocodile/objs/material.mtl +7 -0
- animation/inputs/crocodile/objs/mesh.obj +0 -0
- animation/inputs/crocodile/objs/rig.txt +2611 -0
- animation/inputs/fish/first_frames/render_back.png +0 -0
- animation/inputs/fish/first_frames/render_front.png +0 -0
- animation/inputs/fish/first_frames/render_left.png +0 -0
- animation/inputs/fish/first_frames/render_right.png +0 -0
- animation/inputs/fish/input.mp4 +3 -0
- animation/inputs/fish/objs/fish_texture.png +3 -0
- animation/inputs/fish/objs/material.mtl +8 -0
- animation/inputs/fish/objs/mesh.obj +0 -0
- animation/inputs/fish/objs/rig.txt +1204 -0
- animation/model.py +199 -0
- animation/optimization.py +626 -0
- animation/renderer.py +348 -0
- animation/utils/cameras/back.json +1 -0
- animation/utils/cameras/back_left.json +64 -0
- animation/utils/cameras/back_right.json +64 -0
- animation/utils/cameras/front.json +1 -0
- animation/utils/cameras/front_left.json +64 -0
- animation/utils/cameras/front_right.json +64 -0
- animation/utils/cameras/left.json +1 -0
- animation/utils/cameras/right.json +1 -0
- animation/utils/data_loader.py +170 -0
- animation/utils/loss_utils.py +420 -0
- animation/utils/misc.py +34 -0
- animation/utils/quat_utils.py +179 -0
- animation/utils/render_first_frame.py +93 -0
- animation/utils/save_flow.py +288 -0
- animation/utils/save_utils.py +374 -0
- assets/puppeteer_teaser.gif +3 -0
- assets/reconstruction.png +3 -0
- assets/skeleton_results.png +3 -0
- demo_animation.sh +63 -0
- demo_rigging.sh +68 -0
- examples/deer.obj +0 -0
- examples/deer/input.mp4 +3 -0
- examples/deer/objs/material.mtl +10 -0
- 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 |
-
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|
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
|
assets/reconstruction.png
ADDED
|
Git LFS Details
|
assets/skeleton_results.png
ADDED
|
Git LFS Details
|
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
|
|
|