├── license.txt ├── hand_spheres.jpg ├── hand_cylinders.jpg ├── loop.oni ├── hand-object.oni ├── .gitattributes ├── runme.bat ├── runme.sh ├── .gitignore ├── media ├── cube.obj ├── cylinder_low.obj ├── openni.xml ├── sphere_low.obj └── hand_right_low_RH.xml ├── libraries_README.txt ├── README.md └── src ├── SingleHandTracking.py └── HandObjectTracking.py /license.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FORTH-ModelBasedTracker/HandTracker/HEAD/license.txt -------------------------------------------------------------------------------- /hand_spheres.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FORTH-ModelBasedTracker/HandTracker/HEAD/hand_spheres.jpg -------------------------------------------------------------------------------- /hand_cylinders.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FORTH-ModelBasedTracker/HandTracker/HEAD/hand_cylinders.jpg -------------------------------------------------------------------------------- /loop.oni: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:1cf7a082fc983d8ffd3ef92f728bc1f45ce50df96cb6b26354ffbbe4bc503927 3 | size 38766259 4 | -------------------------------------------------------------------------------- /hand-object.oni: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b431df21a858da1c00d08f500aa163960525935e7a70e6a642b424ee93523d45 3 | size 161930523 4 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | hand-object.oni filter=lfs diff=lfs merge=lfs -text 2 | loop.oni filter=lfs diff=lfs merge=lfs -text 3 | hand-object.oni filter=lfs diff=lfs merge=lfs -text 4 | -------------------------------------------------------------------------------- /runme.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | echo MBV_LIBS Environment variable should point to the MBV libraries folder. 3 | echo MBV_LIBS %MBV_LIBS% 4 | echo Setting PATH and PYTHONPATH 5 | set PATH=%MBV_LIBS%\libs;%PATH% 6 | set PYTHONPATH=%MBV_LIBS%\python_libs;%PYTHONPATH% 7 | 8 | echo "Running the Single Hand Tracker script..." 9 | python src\SingleHandTracking.py -------------------------------------------------------------------------------- /runme.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "MBV_LIBS Environment variable should point to the MBV libraries folder." 3 | echo "MBV_LIBS" $MBV_LIBS 4 | echo "Setting LD_LIBRARY_PATH and PYTHONPATH" 5 | export LD_LIBRARY_PATH=$MBV_LIBS/libs:$LD_LIBRARY_PATH 6 | export PYTHONPATH=$MBV_LIBS/python_libs:$PYTHONPATH 7 | 8 | echo "Running the Single Hand Tracker script..." 9 | python src/SingleHandTracking.py 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | 5 | # C extensions 6 | *.so 7 | 8 | # Distribution / packaging 9 | .Python 10 | env/ 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | eggs/ 15 | lib/ 16 | lib64/ 17 | parts/ 18 | sdist/ 19 | var/ 20 | *.egg-info/ 21 | .installed.cfg 22 | *.egg 23 | 24 | # Installer logs 25 | pip-log.txt 26 | pip-delete-this-directory.txt 27 | 28 | # Unit test / coverage reports 29 | htmlcov/ 30 | .tox/ 31 | .coverage 32 | .cache 33 | nosetests.xml 34 | coverage.xml 35 | 36 | # Translations 37 | *.mo 38 | *.pot 39 | 40 | # Django stuff: 41 | *.log 42 | 43 | # Sphinx documentation 44 | docs/_build/ 45 | .idea 46 | -------------------------------------------------------------------------------- /media/cube.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.64 (sub 0) OBJ File: '' 2 | # www.blender.org 3 | mtllib cube.mtl 4 | o Cube 5 | v 1.000000 -1.000000 -1.000000 6 | v 1.000000 -1.000000 1.000000 7 | v -1.000000 -1.000000 1.000000 8 | v -1.000000 -1.000000 -1.000000 9 | v 1.000000 1.000000 -0.999999 10 | v 0.999999 1.000000 1.000001 11 | v -1.000000 1.000000 1.000000 12 | v -1.000000 1.000000 -1.000000 13 | vn 0.000000 -1.000000 0.000000 14 | vn 0.000000 1.000000 0.000000 15 | vn 1.000000 0.000000 0.000000 16 | vn -0.000000 -0.000000 1.000000 17 | vn -1.000000 -0.000000 -0.000000 18 | vn 0.000000 0.000000 -1.000000 19 | usemtl Material 20 | s off 21 | f 1//1 2//1 3//1 4//1 22 | f 5//2 8//2 7//2 6//2 23 | f 1//3 5//3 6//3 2//3 24 | f 2//4 6//4 7//4 3//4 25 | f 3//5 7//5 8//5 4//5 26 | f 5//6 1//6 4//6 8//6 27 | -------------------------------------------------------------------------------- /libraries_README.txt: -------------------------------------------------------------------------------- 1 | ======================================================= 2 | = FORTH Model Based Vision and Hand Tracker Libraries = 3 | ======================================================= 4 | 5 | Info 6 | ------ 7 | 8 | Project Home: http://cvrlcode.ics.forth.gr/handtracking/ 9 | Github: https://github.com/FORTH-ModelBasedTracker 10 | 11 | Licence 12 | -------- 13 | 14 | For the licence of the FORTH MBV libraries check the 15 | licence.txt. 16 | 17 | This package contains third party libs with different licences 18 | Check each project's home page for licence information: 19 | 20 | * Boost: http://www.boost.org/ 21 | * CUDA runtime: https://developer.nvidia.com/cuda-zone 22 | * OpenMesh: http://www.openmesh.org/ 23 | * OpenCV: http://opencv.org/license.html 24 | * GLEW: http://glew.sourceforge.net/credits.html 25 | * FreeGLUT: http://freeglut.sourceforge.net/ 26 | * Thread Building Blocks: https://www.threadingbuildingblocks.org/licensing 27 | * Bullet: http://bulletphysics.org/mediawiki-1.5.8/index.php/LICENSE 28 | * Python: https://www.python.org/download/releases/2.7/license/ 29 | * OpenNI: https://github.com/OpenNI/OpenNI/blob/master/LICENSE 30 | * Kinect 2 SDK: http://download.microsoft.com/download/0/D/C/0DC5308E-36A7-4DCD-B299-B01CDFC8E345/Kinect-SDK2.0-EULA_en-US.pdf 31 | 32 | ========================================================== 33 | -------------------------------------------------------------------------------- /media/cylinder_low.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.64 (sub 0) OBJ File: '' 2 | # www.blender.org 3 | mtllib cylinder.mtl 4 | o Cylinder 5 | v 0.000000 1.000000 -1.000000 6 | v 0.000001 1.000000 1.000000 7 | v 0.587786 0.809016 1.000000 8 | v 0.587785 0.809017 -1.000000 9 | v 0.951057 0.309016 1.000000 10 | v 0.951057 0.309017 -1.000000 11 | v 0.951056 -0.309018 1.000000 12 | v 0.951056 -0.309017 -1.000000 13 | v 0.587784 -0.809018 1.000000 14 | v 0.587785 -0.809017 -1.000000 15 | v -0.000002 -1.000000 1.000000 16 | v -0.000000 -1.000000 -1.000000 17 | v -0.587787 -0.809016 1.000000 18 | v -0.587785 -0.809017 -1.000000 19 | v -0.951057 -0.309015 1.000000 20 | v -0.951056 -0.309017 -1.000000 21 | v -0.951056 0.309020 1.000000 22 | v -0.951056 0.309017 -1.000000 23 | v -0.587783 0.809019 1.000000 24 | v -0.587785 0.809017 -1.000000 25 | vn 0.309018 0.951056 -0.000000 26 | vn 0.309017 0.951057 0.000000 27 | vn 0.809018 0.587784 -0.000000 28 | vn 0.809017 0.587785 0.000000 29 | vn 1.000000 -0.000001 -0.000000 30 | vn 1.000000 -0.000000 0.000000 31 | vn 0.809016 -0.587786 -0.000000 32 | vn 0.809017 -0.587785 0.000000 33 | vn 0.309015 -0.951057 -0.000000 34 | vn 0.309017 -0.951057 0.000000 35 | vn -0.309019 -0.951056 -0.000000 36 | vn -0.309017 -0.951056 0.000000 37 | vn -0.809018 -0.587783 -0.000000 38 | vn -0.809017 -0.587785 0.000000 39 | vn -1.000000 0.000003 -0.000000 40 | vn -1.000000 0.000000 0.000000 41 | vn -0.809015 0.587788 -0.000000 42 | vn -0.809017 0.587785 0.000000 43 | vn -0.309017 0.951057 0.000000 44 | vn -0.309015 0.951057 -0.000000 45 | usemtl 46 | s off 47 | f 1//1 2//1 3//1 48 | f 4//2 1//2 3//2 49 | f 4//3 3//3 5//3 50 | f 5//4 6//4 4//4 51 | f 6//5 5//5 7//5 52 | f 7//6 8//6 6//6 53 | f 8//7 7//7 9//7 54 | f 9//8 10//8 8//8 55 | f 10//9 9//9 11//9 56 | f 11//10 12//10 10//10 57 | f 12//11 11//11 13//11 58 | f 13//12 14//12 12//12 59 | f 14//13 13//13 15//13 60 | f 15//14 16//14 14//14 61 | f 16//15 15//15 17//15 62 | f 17//16 18//16 16//16 63 | f 18//17 17//17 19//17 64 | f 19//18 20//18 18//18 65 | f 2//19 1//19 20//19 66 | f 20//20 19//20 2//20 67 | -------------------------------------------------------------------------------- /media/openni.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 38 | 39 | 40 | 48 | 49 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /media/sphere_low.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.64 (sub 0) OBJ File: '' 2 | # www.blender.org 3 | mtllib sphere.mtl 4 | o Sphere 5 | v 0.262869 -0.809012 -0.525738 6 | v -0.276385 -0.850640 -0.447215 7 | v -0.162456 -0.499995 -0.850654 8 | v 0.425323 -0.309011 -0.850654 9 | v 0.723600 -0.525720 -0.447215 10 | v 0.000000 0.000000 -1.000000 11 | v 0.850648 0.000000 -0.525736 12 | v 0.425323 0.309011 -0.850654 13 | v 0.723600 0.525720 -0.447215 14 | v -0.688189 -0.499997 -0.525736 15 | v -0.894425 0.000000 -0.447215 16 | v -0.525730 0.000000 -0.850652 17 | v -0.688189 0.499997 -0.525736 18 | v -0.276385 0.850640 -0.447215 19 | v -0.162456 0.499995 -0.850654 20 | v 0.262869 0.809012 -0.525738 21 | v 0.951058 -0.309013 0.000000 22 | v 0.951058 0.309013 0.000000 23 | v 0.894425 0.000000 0.447215 24 | v 0.000000 -1.000000 0.000000 25 | v 0.587786 -0.809017 0.000000 26 | v 0.276385 -0.850640 0.447215 27 | v -0.951058 -0.309013 0.000000 28 | v -0.587786 -0.809017 0.000000 29 | v -0.723600 -0.525720 0.447215 30 | v -0.587786 0.809017 0.000000 31 | v -0.951058 0.309013 0.000000 32 | v -0.723600 0.525720 0.447215 33 | v 0.587786 0.809017 0.000000 34 | v 0.000000 1.000000 0.000000 35 | v 0.276385 0.850640 0.447215 36 | v 0.688189 -0.499997 0.525736 37 | v -0.262869 -0.809012 0.525738 38 | v -0.850648 0.000000 0.525736 39 | v -0.262869 0.809012 0.525738 40 | v 0.688189 0.499997 0.525736 41 | v 0.162456 -0.499995 0.850654 42 | v 0.525730 0.000000 0.850652 43 | v 0.000000 0.000000 1.000000 44 | v -0.425323 -0.309011 0.850654 45 | v -0.425323 0.309011 0.850654 46 | v 0.162456 0.499995 0.850654 47 | vn -0.038547 -0.748789 -0.661687 48 | vn 0.187594 -0.577345 -0.794658 49 | vn 0.471318 -0.583121 -0.661687 50 | vn 0.102381 -0.315090 -0.943523 51 | vn 0.700228 -0.268049 -0.661687 52 | vn 0.607060 0.000000 -0.794656 53 | vn 0.700228 0.268049 -0.661688 54 | vn 0.331305 0.000000 -0.943524 55 | vn -0.724044 -0.194734 -0.661694 56 | vn -0.491119 -0.356821 -0.794658 57 | vn -0.408939 -0.628443 -0.661686 58 | vn -0.268034 -0.194737 -0.943523 59 | vn -0.408939 0.628443 -0.661686 60 | vn -0.491119 0.356821 -0.794657 61 | vn -0.724044 0.194734 -0.661694 62 | vn -0.268034 0.194736 -0.943523 63 | vn 0.471317 0.583121 -0.661687 64 | vn 0.187594 0.577345 -0.794658 65 | vn -0.038547 0.748789 -0.661687 66 | vn 0.102381 0.315090 -0.943523 67 | vn 0.904981 -0.268049 -0.330393 68 | vn 0.982246 0.000000 -0.187599 69 | vn 0.992077 0.000000 0.125631 70 | vn 0.904981 0.268049 -0.330393 71 | vn 0.024726 -0.943519 -0.330395 72 | vn 0.303531 -0.934171 -0.187597 73 | vn 0.306568 -0.943519 0.125651 74 | vn 0.534590 -0.777851 -0.330395 75 | vn -0.889698 -0.315092 -0.330386 76 | vn -0.794656 -0.577348 -0.187595 77 | vn -0.802607 -0.583125 0.125648 78 | vn -0.574584 -0.748793 -0.330397 79 | vn -0.574584 0.748793 -0.330397 80 | vn -0.794656 0.577348 -0.187595 81 | vn -0.802607 0.583125 0.125648 82 | vn -0.889698 0.315092 -0.330386 83 | vn 0.534590 0.777851 -0.330395 84 | vn 0.303531 0.934171 -0.187597 85 | vn 0.306568 0.943519 0.125651 86 | vn 0.024726 0.943519 -0.330395 87 | vn 0.574584 -0.748793 0.330397 88 | vn 0.794656 -0.577348 0.187595 89 | vn 0.889698 -0.315092 0.330386 90 | vn 0.802607 -0.583125 -0.125648 91 | vn -0.534590 -0.777851 0.330395 92 | vn -0.303531 -0.934171 0.187597 93 | vn -0.024726 -0.943519 0.330395 94 | vn -0.306568 -0.943519 -0.125651 95 | vn -0.904981 0.268049 0.330393 96 | vn -0.982246 0.000000 0.187599 97 | vn -0.904981 -0.268049 0.330393 98 | vn -0.992077 -0.000000 -0.125631 99 | vn -0.024726 0.943519 0.330395 100 | vn -0.303531 0.934171 0.187597 101 | vn -0.534590 0.777851 0.330395 102 | vn -0.306568 0.943519 -0.125651 103 | vn 0.889698 0.315092 0.330386 104 | vn 0.794656 0.577348 0.187595 105 | vn 0.574584 0.748793 0.330397 106 | vn 0.802607 0.583125 -0.125648 107 | vn 0.408939 -0.628443 0.661686 108 | vn 0.491119 -0.356821 0.794658 109 | vn 0.268034 -0.194737 0.943523 110 | vn 0.724044 -0.194734 0.661694 111 | vn -0.471317 -0.583121 0.661687 112 | vn -0.187594 -0.577345 0.794658 113 | vn -0.102381 -0.315090 0.943523 114 | vn 0.038547 -0.748789 0.661687 115 | vn -0.700228 0.268049 0.661687 116 | vn -0.607060 0.000000 0.794656 117 | vn -0.331305 0.000000 0.943524 118 | vn -0.700228 -0.268049 0.661687 119 | vn 0.038547 0.748789 0.661687 120 | vn -0.187594 0.577345 0.794658 121 | vn -0.102381 0.315090 0.943523 122 | vn -0.471318 0.583121 0.661687 123 | vn 0.724044 0.194734 0.661694 124 | vn 0.491119 0.356821 0.794658 125 | vn 0.268034 0.194737 0.943523 126 | vn 0.408939 0.628443 0.661686 127 | usemtl 128 | s off 129 | f 1//1 2//1 3//1 130 | f 4//2 1//2 3//2 131 | f 5//3 1//3 4//3 132 | f 3//4 6//4 4//4 133 | f 7//5 5//5 4//5 134 | f 4//6 8//6 7//6 135 | f 9//7 7//7 8//7 136 | f 4//8 6//8 8//8 137 | f 10//9 11//9 12//9 138 | f 12//10 3//10 10//10 139 | f 2//11 10//11 3//11 140 | f 12//12 6//12 3//12 141 | f 13//13 14//13 15//13 142 | f 15//14 12//14 13//14 143 | f 11//15 13//15 12//15 144 | f 15//16 6//16 12//16 145 | f 16//17 9//17 8//17 146 | f 8//18 15//18 16//18 147 | f 14//19 16//19 15//19 148 | f 8//20 6//20 15//20 149 | f 17//21 5//21 7//21 150 | f 7//22 18//22 17//22 151 | f 19//23 17//23 18//23 152 | f 18//24 7//24 9//24 153 | f 2//25 1//25 20//25 154 | f 1//26 21//26 20//26 155 | f 22//27 20//27 21//27 156 | f 21//28 1//28 5//28 157 | f 23//29 11//29 10//29 158 | f 10//30 24//30 23//30 159 | f 25//31 23//31 24//31 160 | f 24//32 10//32 2//32 161 | f 26//33 14//33 13//33 162 | f 13//34 27//34 26//34 163 | f 28//35 26//35 27//35 164 | f 27//36 13//36 11//36 165 | f 29//37 9//37 16//37 166 | f 16//38 30//38 29//38 167 | f 31//39 29//39 30//39 168 | f 30//40 16//40 14//40 169 | f 32//41 22//41 21//41 170 | f 21//42 17//42 32//42 171 | f 19//43 32//43 17//43 172 | f 17//44 21//44 5//44 173 | f 33//45 25//45 24//45 174 | f 24//46 20//46 33//46 175 | f 22//47 33//47 20//47 176 | f 20//48 24//48 2//48 177 | f 34//49 28//49 27//49 178 | f 27//50 23//50 34//50 179 | f 25//51 34//51 23//51 180 | f 23//52 27//52 11//52 181 | f 35//53 31//53 30//53 182 | f 30//54 26//54 35//54 183 | f 28//55 35//55 26//55 184 | f 26//56 30//56 14//56 185 | f 36//57 19//57 18//57 186 | f 18//58 29//58 36//58 187 | f 31//59 36//59 29//59 188 | f 29//60 18//60 9//60 189 | f 37//61 22//61 32//61 190 | f 32//62 38//62 37//62 191 | f 39//63 37//63 38//63 192 | f 38//64 32//64 19//64 193 | f 40//65 25//65 33//65 194 | f 33//66 37//66 40//66 195 | f 39//67 40//67 37//67 196 | f 37//68 33//68 22//68 197 | f 41//69 28//69 34//69 198 | f 34//70 40//70 41//70 199 | f 39//71 41//71 40//71 200 | f 40//72 34//72 25//72 201 | f 42//73 31//73 35//73 202 | f 35//74 41//74 42//74 203 | f 39//75 42//75 41//75 204 | f 41//76 35//76 28//76 205 | f 38//77 19//77 36//77 206 | f 36//78 42//78 38//78 207 | f 39//79 38//79 42//79 208 | f 42//80 36//80 31//80 209 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CVRL FORTH HandTracker 2 | 3 | 4 | ## Description 5 | 6 | This script uses the Model Based Vision (MBV) libraries created by the Computer Vision and Robotics Lab at ICS/FORTH. The libraries are free for academic and non-profit use under this [licence](license.txt). 7 | 8 | It implements a hand tracker pipeline described first in [Oikonomidis et al: Efficient model-based 3D tracking of hand articulations using Kinect](http://users.ics.forth.gr/~argyros/mypapers/2011_09_bmvc_kinect_hand_tracking.pdf). 9 | 10 | 11 | The software tracks the 3D position, orientation and full articulation of a human hand from markerless visual observations. The developed method: 12 | 13 | * estimates the full articulation of a hand (26 DoFs redundantly encoded in 27 parameters) involved in unconstrained motion 14 | * operates on input acquired by easy-to-install and widely used/supported RGB-D cameras (e.g. Kinect, Xtion) 15 | * does not require markers, special gloves 16 | * performs at a rate of 30fps in modern architectures (GPU acceleration) 17 | * does not require calibration 18 | * does not rely on any proprietary built-in tracking technologies (Nite, OpenNI, Kinect SDK) 19 | 20 | Single hand tracking 21 | 22 | ## Citation 23 | 24 | If you use any part of this work please cite the following: 25 | 26 | Oikonomidis, Iason, Nikolaos Kyriazis, and Antonis A. Argyros. "Efficient model-based 3D tracking of hand articulations using Kinect." BMVC. Vol. 1. No. 2. 2011. 27 | ``` 28 | @inproceedings{oikonomidis2011efficient, 29 | title={Efficient model-based 3D tracking of hand articulations using Kinect.}, 30 | author={Oikonomidis, Iason and Kyriazis, Nikolaos and Argyros, Antonis A}, 31 | booktitle={BMVC}, 32 | volume={1}, 33 | number={2}, 34 | pages={3}, 35 | year={2011} 36 | } 37 | ``` 38 | 39 | **Notice**: The citation targets are subject to change. Please make sure to use the latest information provided. 40 | 41 | ## Hardware Requirements 42 | 43 | System requirements: 44 | 45 | - Hardware 46 | - Multi-core Intel CPU 47 | - 1 GB of RAM or more 48 | - CUDA-enabled GPU 49 | - 512MB GPU RAM or more 50 | - CUDA compute capability > 1.0 51 | - OpenGL 3.3 52 | - Software 53 | - OS 54 | - 64bit Windows 8 or newer 55 | - 64bit Ubuntu 14.04 Linux 56 | - Environment 57 | - **Python 2.7 64bit** 58 | - Drivers 59 | - [Latest CUDA driver](https://developer.nvidia.com/cuda-downloads) 60 | - OpenNI driver 61 | - Kinect 2 driver 62 | 63 | ## Download links 64 | 65 | 66 | - [Ubuntu 3D hand tracking](http://cvrlcode.ics.forth.gr/files/mbv/v1.1/MBV_PythonAPI_Linux_1.1.zip) 67 | - [Windows 3D hand tracking](http://cvrlcode.ics.forth.gr/files/mbv/v1.1/MBV_PythonAPI_Win_1.1.zip) 68 | 69 | ### Windows Dependencies 70 | 71 | - [Visual C++ **64bit** Redistributable Packages for Visual Studio 2013](https://www.microsoft.com/en-us/download/details.aspx?id=40784) 72 | - [OpenNI 1.x SDK for Windows 8 **64bit** and newer](http://cvrlcode.ics.forth.gr/web_share/OpenNI/OpenNI_SDK/OpenNI_1.x/OpenNI-Win64-1.5.7.10-Dev.zip) (install prior to sensor driver) 73 | - [OpenNI 1.x sensor driver for 8 Windows **64bit** and newer](http://cvrlcode.ics.forth.gr/web_share/OpenNI/OpenNI_SDK/OpenNI_1.x/Sensor_Driver/Sensor-Win64-5.1.6.6-Redist.zip) 74 | - [Kinect 2 SDK for Windows 8 **64bit** and newer](http://www.microsoft.com/en-us/download/details.aspx?id=44561) 75 | 76 | ## Installation and usage 77 | 78 | As a first step, download the package that matches your OS from [the download section](#download). Extract the downloaded package to a location and set an environment variable named MBV_LIBS to point to this location. For example, if the package is extracted to the path c:\Users\User\Documents\FORTH\HANDTRACKER (Windows) or /home/user/FORTH/HANDTRACKER (Ubuntu), do the following from the command line: 79 | 80 | 81 | Ubuntu: 82 | 83 | ``` 84 | export MBV_LIBS=/home/user/FORTH/HANDTRACKER 85 | ``` 86 | 87 | Windows: 88 | 89 | ``` 90 | set MBV_LIBS=c:\Users\User\Documents\FORTH\HANDTRACKER 91 | ``` 92 | 93 | The provided package has some external dependencies, listed below. One such dependency is a working Python 2.7 environment. 94 | 95 | **Notice:** Make sure the Python version is 2.7 64bit. 96 | 97 | **Notice:** Binaries were build against CUDA 7.5. This might require the user to update the GPU driver to the latest version. In the lack of a supported driver, an error message of the form "*CUDA driver version is insufficient for CUDA runtime version*" is issued. 98 | 99 | ### Ubuntu 100 | 101 | Install opencv, thread building blocks (TBB) python and numpy by executing the following in the command line: 102 | 103 | ``` 104 | sudo apt-get install libopencv-dev libtbb2 python-numpy python-opencv 105 | ``` 106 | 107 | If you plan to use openni1.x (required for running some of the example scripts), also execute: 108 | 109 | ``` 110 | sudo apt-get install libopenni0 libopenni-sensor-primesense0 111 | ``` 112 | 113 | Make sure that you have nvidia driver 352 or newer installed. Use the 114 | "Additional Drivers" tool to select the correct driver version. 115 | 116 | ### Windows 117 | 118 | OpenCV is statically built with the provided binaries. Thread building blocks is bundled with the downloadable package. The rest of the dependencies should be downloaded from the download section. For python support it is suggested to use [anaconda] (https://www.continuum.io/downloads). After installing Anaconda, the installation of numpy is a simple as executing the following in the command line: 119 | 120 | ``` 121 | conda install numpy 122 | ``` 123 | 124 | **Notice:** Binaries were built against numpy 1.10.1. If a numpy related error (import or other) is issued, updating numpy to this version will be required. In Anaconda it would suffice to execute the following, from the command line: 125 | 126 | ``` 127 | conda update numpy 128 | ``` 129 | 130 | ### Usage 131 | 132 | Make sure the current working directory is the root of HandTracker and that MBV_LIBS is set. 133 | 134 | Run the `runme.sh` (Ubuntu) or `runme.bat` (Windows) script to test the hand tracker. Press `s` to stop/start 3D hand tracking. 135 | 136 | **Notice:** Be aware that the first execution will take a significant amount of time, CPU and memory. This is due to the intermediate CUDA code being compiled. This will only happen once, as the compilation result is cached. In Ubuntu the cache limit might be too restricting and in these cases caching will fail, leading to recompilation at every execution. To remedy this the size can be increased as follows (command line): 137 | 138 | ``` 139 | export CUDA_CACHE_MAXSIZE=2147483648 140 | ``` 141 | 142 | 143 | ## Contact 144 | 145 | For questions, comments and any kind of feedback please use the github issues, and the wiki. 146 | 147 | -------------------------------------------------------------------------------- /src/SingleHandTracking.py: -------------------------------------------------------------------------------- 1 | """ 2 | FORTH Model based hand tracker. 3 | Single Hand tracking pipeline using FORTH libraries. 4 | 5 | """ 6 | 7 | # Core stuff, like containers. 8 | import PyMBVCore as Core 9 | # Image acquisition. 10 | import PyMBVAcquisition as Acquisition 11 | # 3D Multi-hypothesis rendering. 12 | import PyMBVRendering as Rendering 13 | # Conversion of hypotheses to 3D renderables. 14 | import PyMBVDecoding as dec 15 | # A library which puts together the aforementioned 16 | # and some extras to make up 3D hand tracking. 17 | import PyHandTracker as HT 18 | 19 | # OpenCV. 20 | import cv2 as cv 21 | # Timing. 22 | from time import clock 23 | 24 | import time 25 | 26 | if __name__ == '__main__': 27 | print "Creating Renderer..." 28 | 29 | # Turn off logging 30 | Core.InitLog(['handTracker', 'log.severity', 'error']) 31 | 32 | # The 3D renderer is a singleton. The single instance is accessed. 33 | renderer = Rendering.RendererOGLCudaExposed.get() 34 | # OpenCV coordinate system is right handed but the renderer's 35 | # coordinate system is left handed. Conversion is handled, but 36 | # in the process front facing triangles become back facing triangles. 37 | # Thus, we inverse the culling order. 38 | # Try to set it to CullBack or CullNone to see the differences. 39 | renderer.culling = Rendering.RendererOGLBase.Culling.CullFront 40 | 41 | # An exposed renderer is one whose data are exposed through 42 | # some API. The hand tracker lib requires such a renderer. 43 | erenderer = Rendering.ExposedRenderer(renderer, renderer) 44 | 45 | # Create the hand tracker lib 46 | # params: 47 | # - width (2048): max width preallocated for rendering 48 | # - height (2048): max height preallocated for rendering 49 | # - tileWidth (64): width of hypothesis rendering tile 50 | # - tileHeight (64): height of hypothesis rendering tile 51 | # With the given parameter the handtracker lib will be able to 52 | # render at most (2048/64)x(2048x64)=1024 hypotheses in parallel. 53 | # The greatest this number the more the hypothesis evaluation 54 | # throughput. Default optimization only requires to render 64 55 | # hypotheses at a time. 56 | ht = HT.HandTrackerLib(2048, 2048, 64, 64, erenderer) 57 | 58 | # Create a decoder, i.e. an object which can transform 59 | # 27-D parameter vectors to 3D renderable hands. 60 | handDec = dec.GenericDecoder() 61 | # A description for a hand can be found at a file. 62 | handDec.loadFromFile("media/hand_right_low_RH.xml") 63 | # Set the decoder to the hand tracker lib. 64 | ht.decoder = handDec 65 | 66 | # Setup randomization variances to use during heuristic search. 67 | posvar = [10, 10, 10] # 3D global translation variance 68 | rotvar = [0.1, 0.1, 0.1, 0.1] # Quaternion global rotation variance 69 | fingervar = [ 0.1, 0.1, 0.1, 0.1] # Per finger relative angles variance 70 | 71 | # 27-D = 3D position + 4D rotation + 5 x 4D per finger angles. 72 | ht.variances = Core.DoubleVector( posvar + rotvar + 5 * fingervar) 73 | 74 | print "Variances: ",list(ht.variances) 75 | print "Low Bounds: ",list(ht.lowBounds) 76 | print "High Bounds: ",list(ht.highBounds) 77 | print "Randomization Indices: ",list(ht.randomizationIndices) 78 | 79 | # Set the PSO budget, i.e. particles and generations. 80 | ht.particles = 64 81 | ht.generations = 25 82 | 83 | print "Starting Grabber..." 84 | 85 | # Initialize RGBD acquisition. We will be acquiring images 86 | # from a saved sequence, in oni format. 87 | 88 | # User should define a path to a saved sequence in oni format. 89 | # Set path to empty string to perform live capture from an existing sensor. 90 | oniPath = 'loop.oni' 91 | acq = Acquisition.OpenNIGrabber(True, True, 'media/openni.xml', oniPath, True) 92 | acq.initialize() 93 | 94 | # Initialization for the hand pose of the first frame is specified. 95 | # If track is lost, resetting will revert track to this pose. 96 | defaultInitPos = Core.ParamVector([ 0, 80, 900, 0, 0, 1, 0, 1.20946707135219810e-001, 1.57187812868051640e+000, 9.58033504364020840e-003, -1.78593063562731860e-001, 7.89636216585289100e-002, 2.67967456875403400e+000, 1.88385552327860720e-001, 2.20049375319072360e-002, -4.09740579183203310e-002, 1.52145111735213370e+000, 1.48366400350912500e-001, 2.85607073734409630e-002, -4.53781680931323280e-003, 1.52743247624671910e+000, 1.01751907812505270e-001, 1.08706683246161150e-001, 8.10845240231484330e-003, 1.49009228214971090e+000, 4.64716068193632560e-002, -1.44370358851376110e-001]) 97 | 98 | # The 3D hand pose, as is tracked in the tracking loop. 99 | currentHandPose = defaultInitPos 100 | 101 | # State. 102 | paused = False 103 | delay = {True:0,False:1} 104 | frame = 0 105 | count=0 106 | tracking = len(oniPath) > 0 107 | actualFPS = 0.0 108 | 109 | print "Entering main Loop." 110 | while True: 111 | loopStart = time.time()*1000; 112 | try: 113 | # Acquire images and image calibrations and break if unsuccessful. 114 | # imgs is a list of numpy.andrray and clbs a list of Core.CameraMeta. 115 | # The two lists are of equal size and elements correspond to one another. 116 | # In OpenNIGrabber, the first image is the depth and the second is the RGB. 117 | # In the media/openni.xml file it is specified that the depth will be aligned 118 | # to the RGB image and that mirroring will be off. The resolution is VGA. 119 | # It is not obligatory to use the OpenNIGrabber. As long as you can somehow provide 120 | # aligned depth and RGB images and corresponding Core.CameraMeta, you can use 3D 121 | # hand tracking. 122 | imgs, clbs = acq.grab() 123 | except: 124 | break 125 | 126 | # Get the depth calibration to extract some basic info. 127 | c = clbs[0] 128 | width,height = int(c.width),int(c.height) 129 | 130 | # Step 1: configure 3D rendering to match depth calibration. 131 | # step1_setupVirtualCamera returns a view matrix and a projection matrix (graphics). 132 | viewMatrix,projectionMatrix = ht.step1_setupVirtualCamera(c) 133 | 134 | # Step 2: compute the bounding box of the previously tracked hand pose. 135 | # For the sake of efficiency, search is performed in the vicinity of 136 | # the previous hand tracking solution. Rendering will be constrained 137 | # in the bounding box (plus some padding) of the previous tracking solution, 138 | # in image space. 139 | # The user might chose to bypass this call and compute a bounding box differently, 140 | # so as to incorporate other information as well. 141 | bb = ht.step2_computeBoundingBox(currentHandPose, width, height, 0.1) 142 | 143 | # Step 3: Zoom rendering to given bounding box. 144 | # The renderer is configures so as to map its projection space 145 | # to the given bounding box, i.e. zoom in. 146 | ht.step3_zoomVirtualCamera(projectionMatrix, bb,width,height) 147 | 148 | # Step 4: Preprocess input. 149 | # RGBD frames are processed to as to isolate the hand. 150 | # This is usually done through skin color detection in the RGB frame. 151 | # The user might chose to bypass this call and do foreground detection 152 | # in some other way. What is required is a labels image which is non-zero 153 | # for foreground and a depth image which contains depth values in mm. 154 | labels, depths = ht.step4_preprocessInput(imgs[1], imgs[0], bb) 155 | 156 | # Step5: Upload observations for GPU evaluation. 157 | # Hypothesis testing is performed on the GPU. Therefore, observations 158 | # are also uploaded to the GPU. 159 | ht.step5_setObservations(labels, depths) 160 | 161 | fps = 0 162 | if tracking: 163 | t = clock() 164 | # Step 6: Track. 165 | # Tracking is initialized with the solution for the previous frame 166 | # and computes the solution for the current frame. The user might 167 | # chose to initialize tracking from a pose other than the solution 168 | # from the previous frame. This solution needs to be 27-D for 3D 169 | # hand tracking with the specified decoder. 170 | score, currentHandPose = ht.step6_track(currentHandPose) 171 | t = clock() - t 172 | fps = 1.0 / t 173 | 174 | 175 | # Step 7 : Visualize. 176 | # This call superimposes a hand tracking solution on a RGB image 177 | viz = ht.step7_visualize(imgs[1], viewMatrix,projectionMatrix, currentHandPose) 178 | cv.putText(viz, 'UI FPS = %f, Track FPS = %f' % (actualFPS , fps), (20, 20), 0, 0.5, (0, 0, 255)) 179 | 180 | cv.imshow("Hand Tracker",viz) 181 | 182 | key = cv.waitKey(delay[paused]) 183 | 184 | # Press 's' to start/stop tracking. 185 | if key & 255 == ord('s'): 186 | tracking = not tracking 187 | currentHandPose = defaultInitPos 188 | 189 | # Press 'q' to quit. 190 | if key & 255 == ord('q'): 191 | break 192 | 193 | # Press 'p' to pause. 194 | if key &255 == ord('p'): 195 | paused = not paused 196 | 197 | frame += 1 198 | loopEnd = time.time()*1000; 199 | actualFPS = (1000.0/(loopEnd-loopStart)) 200 | 201 | 202 | -------------------------------------------------------------------------------- /src/HandObjectTracking.py: -------------------------------------------------------------------------------- 1 | """ 2 | FORTH Model based hand tracker. 3 | Single Hand tracking pipeline using FORTH libraries. 4 | 5 | """ 6 | 7 | # Core stuff, like containers. 8 | import PyMBVCore as Core 9 | # Image acquisition. 10 | import PyMBVAcquisition as Acquisition 11 | # 3D Multi-hypothesis rendering. 12 | import PyMBVRendering as Rendering 13 | # Conversion of hypotheses to 3D renderables. 14 | import PyMBVDecoding as dec 15 | # A library which puts together the aforementioned 16 | # and some extras to make up 3D hand tracking. 17 | import PyHandTracker as HT 18 | 19 | # OpenCV. 20 | import cv2 as cv 21 | # Timing. 22 | from time import clock 23 | 24 | import time 25 | 26 | if __name__ == '__main__': 27 | print "Creating Renderer..." 28 | 29 | # Turn off logging 30 | Core.InitLog(['handTracker', 'log.severity', 'error']) 31 | 32 | # The 3D renderer is a singleton. The single instance is accessed. 33 | renderer = Rendering.RendererOGLCudaExposed.get() 34 | # OpenCV coordinate system is right handed but the renderer's 35 | # coordinate system is left handed. Conversion is handled, but 36 | # in the process front facing triangles become back facing triangles. 37 | # Thus, we inverse the culling order. 38 | # Try to set it to CullBack or CullNone to see the differences. 39 | renderer.culling = Rendering.RendererOGLBase.Culling.CullFront 40 | 41 | # An exposed renderer is one whose data are exposed through 42 | # some API. The hand tracker lib requires such a renderer. 43 | erenderer = Rendering.ExposedRenderer(renderer, renderer) 44 | 45 | # Create the hand tracker lib 46 | # params: 47 | # - width (2048): max width preallocated for rendering 48 | # - height (2048): max height preallocated for rendering 49 | # - tileWidth (64): width of hypothesis rendering tile 50 | # - tileHeight (64): height of hypothesis rendering tile 51 | # With the given parameter the handtracker lib will be able to 52 | # render at most (2048/64)x(2048x64)=1024 hypotheses in parallel. 53 | # The greatest this number the more the hypothesis evaluation 54 | # throughput. Default optimization only requires to render 64 55 | # hypotheses at a time. 56 | ht = HT.HandTrackerLib(2048, 2048, 128, 128, erenderer) 57 | 58 | # Create a decoder, i.e. an object which can transform 59 | # 27-D parameter vectors to 3D renderable hands. 60 | handDec = dec.GenericDecoder() 61 | # A description for a hand can be found at a file. 62 | handDec.loadFromFile("media/hand_right_low_RH.xml") 63 | 64 | 65 | # Create a 6D rigid object decoder 66 | objectDec = dec.SingleRigidDecoder() 67 | objectDec.meshFilename = "media/cube.obj" 68 | objectDec.scale = Core.Vector3(120.0/2.0,60.0/2.0,50.0/2.0) 69 | 70 | # Create slice decoders for each decoder. 71 | # A slice decoder splits the param vector to the proper 72 | # points for each decoder 73 | handDecSlice = dec.SlicedDecoder(handDec) 74 | handDecSlice.slice = Core.UIntVector(range(0,27)) 75 | 76 | objectDecSlice = dec.SlicedDecoder(objectDec) 77 | objectDecSlice.slice = Core.UIntVector(range(27,34)) 78 | 79 | # Create a combination decoder for hand and object 80 | combDec = dec.DecoderCombination(handDecSlice, objectDecSlice) 81 | 82 | # Set the combination decoder to the hand tracker lib. 83 | ht.decoder = combDec 84 | 85 | # Setup randomization variances to use during heuristic search. 86 | posvar = [10, 10, 10] # 3D global translation variance 87 | rotvar = [0.1, 0.1, 0.1, 0.1] # Quaternion global rotation variance 88 | fingervar = [ 0.1, 0.1, 0.1, 0.1] # Per finger relative angles variance 89 | 90 | objectPosVar = [10, 10, 10] # 3D translation variance for the rigid object 91 | objectRotVar = [0.1, 0.1, 0.1, 0.1] # Quaternion for the rigid object rotation 92 | 93 | # 27-D + 6-D = 3D position + 4D rotation + 5 x 4D per finger angles + 3D object pos + 4D object rotation. 94 | ht.variances = Core.DoubleVector( posvar + rotvar + 5 * fingervar + objectPosVar + objectRotVar) 95 | 96 | # update the bounds for the hand-object combination 97 | objectLowBounds = [-2000.0, -2000.0, -2000.0, -1.0, -1.0, -1.0, -1.0] 98 | objectHighBounds = [2000.0, 2000.0, 2000.0, 1.0, 1.0, 1.0, 1.0] 99 | 100 | ht.lowBounds = Core.DoubleVector(list(ht.lowBounds) + objectLowBounds) 101 | ht.highBounds = Core.DoubleVector(list(ht.highBounds) + objectHighBounds) 102 | 103 | print "Variances: ",list(ht.variances) 104 | print "Low Bounds: ",list(ht.lowBounds) 105 | print "High Bounds: ",list(ht.highBounds) 106 | print "Randomization Indices: ",list(ht.randomizationIndices) 107 | 108 | # Set the PSO budget, i.e. particles and generations. 109 | ht.particles = 42 110 | ht.generations = 42 111 | 112 | print "Starting Grabber..." 113 | 114 | # Initialize RGBD acquisition. We will be acquiring images 115 | # from a saved sequence, in oni format. 116 | 117 | # User should define a path to a saved sequence in oni format. 118 | # Set path to empty string to perform live capture from an existing sensor. 119 | oniPath = 'hand-object.oni' 120 | acq = Acquisition.OpenNIGrabber(True, True, 'media/openni.xml', oniPath, True) 121 | acq.initialize() 122 | 123 | # Initialization for the hand pose of the first frame is specified. 124 | # If track is lost, resetting will revert track to this pose. 125 | defaultInitPos = Core.ParamVector([ 0, 80, 900, 0, 0, 1, 0, 1.20946707135219810e-001, 1.57187812868051640e+000, 9.58033504364020840e-003, -1.78593063562731860e-001, 7.89636216585289100e-002, 2.67967456875403400e+000, 1.88385552327860720e-001, 2.20049375319072360e-002, -4.09740579183203310e-002, 1.52145111735213370e+000, 1.48366400350912500e-001, 2.85607073734409630e-002, -4.53781680931323280e-003, 1.52743247624671910e+000, 1.01751907812505270e-001, 1.08706683246161150e-001, 8.10845240231484330e-003, 1.49009228214971090e+000, 4.64716068193632560e-002, -1.44370358851376110e-001, 126 | 127 | -50, 250, 800, -1, 0, 0, 1] # update the object initial position accordingly. 128 | ) 129 | 130 | # The 3D hand pose, as is tracked in the tracking loop. 131 | currentHandPose = defaultInitPos 132 | 133 | # State. 134 | paused = False 135 | delay = {True:0,False:1} 136 | frame = 0 137 | count=0 138 | tracking = len(oniPath) > 0 139 | actualFPS = 0.0 140 | 141 | print "Entering main Loop." 142 | while True: 143 | loopStart = time.time()*1000; 144 | try: 145 | # Acquire images and image calibrations and break if unsuccessful. 146 | # imgs is a list of numpy.andrray and clbs a list of Core.CameraMeta. 147 | # The two lists are of equal size and elements correspond to one another. 148 | # In OpenNIGrabber, the first image is the depth and the second is the RGB. 149 | # In the media/openni.xml file it is specified that the depth will be aligned 150 | # to the RGB image and that mirroring will be off. The resolution is VGA. 151 | # It is not obligatory to use the OpenNIGrabber. As long as you can somehow provide 152 | # aligned depth and RGB images and corresponding Core.CameraMeta, you can use 3D 153 | # hand tracking. 154 | imgs, clbs = acq.grab() 155 | except: 156 | break 157 | 158 | # Get the depth calibration to extract some basic info. 159 | c = clbs[0] 160 | width,height = int(c.width),int(c.height) 161 | 162 | # Step 1: configure 3D rendering to match depth calibration. 163 | # step1_setupVirtualCamera returns a view matrix and a projection matrix (graphics). 164 | viewMatrix, projectionMatrix = ht.step1_setupVirtualCamera(c) 165 | 166 | # Step 2: compute the bounding box of the previously tracked hand pose. 167 | # For the sake of efficiency, search is performed in the vicinity of 168 | # the previous hand tracking solution. Rendering will be constrained 169 | # in the bounding box (plus some padding) of the previous tracking solution, 170 | # in image space. 171 | # The user might chose to bypass this call and compute a bounding box differently, 172 | # so as to incorporate other information as well. 173 | bb = ht.step2_computeBoundingBox(currentHandPose, width, height, 0.1) 174 | 175 | # Step 3: Zoom rendering to given bounding box. 176 | # The renderer is configures so as to map its projection space 177 | # to the given bounding box, i.e. zoom in. 178 | ht.step3_zoomVirtualCamera(projectionMatrix, bb,width,height) 179 | 180 | # Step 4: Preprocess input. 181 | # RGBD frames are processed to as to isolate the hand. 182 | # This is usually done through skin color detection in the RGB frame. 183 | # The user might chose to bypass this call and do foreground detection 184 | # in some other way. What is required is a labels image which is non-zero 185 | # for foreground and a depth image which contains depth values in mm. 186 | labels, depths = ht.step4_preprocessInput(imgs[1], imgs[0], bb) 187 | 188 | # Step5: Upload observations for GPU evaluation. 189 | # Hypothesis testing is performed on the GPU. Therefore, observations 190 | # are also uploaded to the GPU. 191 | ht.step5_setObservations(labels, depths) 192 | 193 | fps = 0 194 | if tracking: 195 | t = clock() 196 | # Step 6: Track. 197 | # Tracking is initialized with the solution for the previous frame 198 | # and computes the solution for the current frame. The user might 199 | # chose to initialize tracking from a pose other than the solution 200 | # from the previous frame. This solution needs to be 27-D for 3D 201 | # hand tracking with the specified decoder. 202 | score, currentHandPose = ht.step6_track(currentHandPose) 203 | t = clock() - t 204 | fps = 1.0 / t 205 | 206 | 207 | # Step 7 : Visualize. 208 | # This call superimposes a hand tracking solution on a RGB image 209 | viz = ht.step7_visualize(imgs[1], viewMatrix,projectionMatrix, currentHandPose) 210 | cv.putText(viz, 'UI FPS = %f, Track FPS = %f' % (actualFPS , fps), (20, 20), 0, 0.5, (0, 0, 255)) 211 | 212 | cv.imshow("Hand Tracker",viz) 213 | 214 | key = cv.waitKey(delay[paused]) 215 | 216 | # Press 's' to start/stop tracking. 217 | if key & 255 == ord('s'): 218 | tracking = not tracking 219 | currentHandPose = defaultInitPos 220 | 221 | # Press 'q' to quit. 222 | if key & 255 == ord('q'): 223 | break 224 | 225 | # Press 'p' to pause. 226 | if key &255 == ord('p'): 227 | paused = not paused 228 | 229 | frame += 1 230 | loopEnd = time.time()*1000; 231 | actualFPS = (1000.0/(loopEnd-loopStart)) 232 | 233 | 234 | -------------------------------------------------------------------------------- /media/hand_right_low_RH.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Notes: 6 | optimizable variables order: 7 | palm_pos.trans_X min: -2000 max: 2000 def: -200 var: 0 8 | palm_pos.trans_Y min: -2000 max: 2000 def: 0 var: 0 9 | palm_pos.trans_Z min: -2000 max: 2000 def: -900 var: 0 10 | palm_pos.qX min: -1 max: 1 def: 0 var: 0 11 | palm_pos.qY min: -1 max: 1 def: 0 var: 0 12 | palm_pos.qZ min: -1 max: 1 def: 1 var: 0 13 | palm_pos.qW min: -1 max: 1 def: 0 var: 0 14 | pinky_pos.Pitch min: 0 max: 1.57 def: 0 var: 0 15 | pinky_pos.Yaw min: 0.7 max: 2.2 def: 1.57 var: 0 16 | pinky2_pos.Pitch min: 0 max: 1.57 def: 0 var: 0 17 | pinky3Pos.Pitch min: 0 max: 1.57 def: 0 var: 0 18 | thumb_pos.Pitch min: 0 max: 1 def: 0 var: 0 19 | thumb_pos.Yaw min: 2.5 max: 3.14 def: 3.14 var: 0 20 | thumb2_pos.Pitch min: 0 max: 1.57 def: 0 var: 0 21 | thumb3_pos.Pitch min: 0 max: 1.57 def: 0 var: 0 22 | ring_pos.Pitch min: 0 max: 1.57 def: 0 var: 0 23 | ring_pos.Yaw min: 0.7 max: 2.2 def: 1.57 var: 0 24 | ring2_pos.Pitch min: 0 max: 1.57 def: 0 var: 0 25 | ring3_pos.Pitch min: 0 max: 1.57 def: 0 var: 0 26 | index_pos.Pitch min: 0 max: 1.57 def: 0 var: 0 27 | index_pos.Yaw min: 0.7 max: 2.2 def: 1.57 var: 0 28 | index2_pos.Pitch min: 0 max: 1.57 def: 0 var: 0 29 | index3_pos.Pitch min: 0 max: 1.57 def: 0 var: 0 30 | middle_pos.Pitch min: 0 max: 1.57 def: 0 var: 0 31 | middle_pos.Yaw min: 0.7 max: 2.2 def: 1.57 var: 0 32 | mid2_pos.Pitch min: 0 max: 1.57 def: 0 var: 0 33 | mid3_pos.Pitch min: 0 max: 1.57 def: 0 var: 0 34 | Total count: 27 35 | 36 | tree arrangement of the optimizable variables: 37 | 38 | -palm_pos ||| OPT 39 | | -scale 40 | | -palm_sph1_p 41 | | -palm_sph2_p 42 | | -palm_mesh_pos 43 | | -pinky_pos ||| OPT 44 | | | -pinky_sph_p 45 | | | -pinky_cyl_pos 46 | | | -pinky2_pos ||| OPT 47 | | | -pinky3Pos ||| OPT 48 | | | | -pinky3_sph_p 49 | | | | -pinky4_sph_p 50 | | | | -pinky3_cyl_pos 51 | | | -pinky2_sph_p 52 | | | -pinky2_cyl_pos 53 | | -thumb_pos ||| OPT 54 | | | -thumb_sph_p 55 | | | -thumb_cyl_p 56 | | | -thumb2_pos ||| OPT 57 | | | -thumb2_sph_p 58 | | | -thumb2_cyl_p 59 | | | -thumb3_pos ||| OPT 60 | | | -thumb4_sph_p 61 | | | -thumb3_cyl_p 62 | | | -thumb3_sph 63 | | -ring_pos ||| OPT 64 | | | -ring_sph_p 65 | | | -ring_cyl_p 66 | | | -ring2_pos ||| OPT 67 | | | -ring2_sph_p 68 | | | -ring2_cyl_p 69 | | | -ring3_pos ||| OPT 70 | | | -ring3_sph_p 71 | | | -ring4_sph_p 72 | | | -ring3_cyl_p 73 | | -index_pos ||| OPT 74 | | | -index_sph_p 75 | | | -index_cyl_p 76 | | | -index2_pos ||| OPT 77 | | | -index2_sph_p 78 | | | -index2_cyl_p 79 | | | -index3_pos ||| OPT 80 | | | -index3_sph_p 81 | | | -index3_cyl_p 82 | | | -index4_sph_p 83 | | -middle_pos ||| OPT 84 | | -mid_sph_p 85 | | -mid_cyl_p 86 | | -mid2_pos ||| OPT 87 | | -mid2_sph_p 88 | | -mid2_cyl_p 89 | | -mid3_pos ||| OPT 90 | | -mid3_sph_p 91 | | -mid3_cyl_p 92 | | -mid4_sph_p 93 | 94 | 95 | 55 96 | 97 | palm_pos 98 | ground 99 | TranslationQuaternion 100 | -200 101 | -2000 102 | 2000 103 | 1 104 | 0 105 | 0 106 | -2000 107 | 2000 108 | 1 109 | 0 110 | -900 111 | -2000 112 | 2000 113 | 1 114 | 0 115 | 0 116 | -1 117 | 1 118 | 1 119 | 0 120 | 0 121 | -1 122 | 1 123 | 1 124 | 0 125 | 1 126 | -1 127 | 1 128 | 1 129 | 0 130 | 0 131 | -1 132 | 1 133 | 1 134 | 0 135 | 136 | 137 | scale 138 | palm_pos 139 | scaling_uniform 140 | 0.89999998 141 | 0.5 142 | 1 143 | 0 144 | 0 145 | 146 | 147 | palm_sph1_p 148 | scale 149 | Trans_scale 150 | 0 151 | 0 152 | 0 153 | 0 154 | 0 155 | 30 156 | 0 157 | 30 158 | 0 159 | 0 160 | 0 161 | 0 162 | 0 163 | 0 164 | 0 165 | 50 166 | 0 167 | 50 168 | 0 169 | 0 170 | 20 171 | 0 172 | 20 173 | 0 174 | 0 175 | 10 176 | 0 177 | 10 178 | 0 179 | 0 180 | 181 | 182 | palm_sph2_p 183 | scale 184 | Trans_scale 185 | 0 186 | 0 187 | 0 188 | 0 189 | 0 190 | -30 191 | -30 192 | 0 193 | 0 194 | 0 195 | 0 196 | 0 197 | 0 198 | 0 199 | 0 200 | 50 201 | 0 202 | 50 203 | 0 204 | 0 205 | 20 206 | 0 207 | 20 208 | 0 209 | 0 210 | 10 211 | 0 212 | 10 213 | 0 214 | 0 215 | 216 | 217 | palm_mesh_pos 218 | scale 219 | Trans_RPYRot_Scaling 220 | 0 221 | 0 222 | 0 223 | 0 224 | 0 225 | 0 226 | 0 227 | 0 228 | 0 229 | 0 230 | 0 231 | 0 232 | 0 233 | 0 234 | 0 235 | 1.5700001 236 | 1.5700001 237 | 1.5700001 238 | 0 239 | 0 240 | 1.5700001 241 | 1.5700001 242 | 1.5700001 243 | 0 244 | 0 245 | 0 246 | 0 247 | 0 248 | 0 249 | 0 250 | 10 251 | 10 252 | 10 253 | 0 254 | 0 255 | 50 256 | 50 257 | 50 258 | 0 259 | 0 260 | 30 261 | 30 262 | 40 263 | 0 264 | 0 265 | 266 | 267 | pinky_pos 268 | scale 269 | TranslationRPYRotation 270 | 40.987499 271 | 40.987499 272 | 40.987499 273 | 0 274 | 0 275 | 40 276 | 40 277 | 40 278 | 0 279 | 0 280 | 0 281 | 0 282 | 0 283 | 0 284 | 0 285 | 0 286 | 0 287 | 0 288 | 0 289 | 0 290 | 0 291 | 0 292 | 1.5700001 293 | 1 294 | 0 295 | 1.5700001 296 | 0.69999999 297 | 2.2 298 | 1 299 | 0 300 | 301 | 302 | pinky_sph_p 303 | pinky_pos 304 | scaling_uniform 305 | 5 306 | 5 307 | 5 308 | 0 309 | 0 310 | 311 | 312 | pinky_cyl_pos 313 | pinky_pos 314 | Trans_RPYRot_Skew 315 | 10 316 | 10 317 | 10 318 | 0 319 | 0 320 | 0 321 | 0 322 | 0 323 | 0 324 | 0 325 | 0 326 | 0 327 | 0 328 | 0 329 | 0 330 | 0 331 | 0 332 | 0 333 | 0 334 | 0 335 | 1.5700001 336 | 0 337 | 1.5700001 338 | 0 339 | 0 340 | 0 341 | 0 342 | 0 343 | 0 344 | 0 345 | 20 346 | 10 347 | 20 348 | 0 349 | 0 350 | 5 351 | 5 352 | 5 353 | 0 354 | 0 355 | 5 356 | 5 357 | 5 358 | 0 359 | 0 360 | 2 361 | 2 362 | 2 363 | 0 364 | 0 365 | 1 366 | 1 367 | 1 368 | 0 369 | 0 370 | 371 | 372 | pinky2_pos 373 | pinky_pos 374 | TranslationRPYRotation 375 | 20 376 | 20 377 | 20 378 | 0 379 | 0 380 | 0 381 | 0 382 | 0 383 | 0 384 | 0 385 | 0 386 | 0 387 | 0 388 | 0 389 | 0 390 | 0 391 | 0 392 | 0 393 | 0 394 | 0 395 | 0 396 | 0 397 | 1.5700001 398 | 1 399 | 0 400 | 0 401 | 0 402 | 0 403 | 0 404 | 0 405 | 406 | 407 | pinky3Pos 408 | pinky2_pos 409 | TranslationRPYRotation 410 | 16 411 | 16 412 | 16 413 | 0 414 | 0 415 | 0 416 | 0 417 | 0 418 | 0 419 | 0 420 | 0 421 | 0 422 | 0 423 | 0 424 | 0 425 | 0 426 | 0 427 | 0 428 | 0 429 | 0 430 | 0 431 | 0 432 | 1.5700001 433 | 1 434 | 0 435 | 0 436 | 0 437 | 0 438 | 0 439 | 0 440 | 441 | 442 | pinky3_sph_p 443 | pinky3Pos 444 | scaling_uniform 445 | 5 446 | 5 447 | 5 448 | 0 449 | 0 450 | 451 | 452 | pinky4_sph_p 453 | pinky3Pos 454 | Trans_scaleU 455 | 20 456 | 20 457 | 20 458 | 0 459 | 0 460 | 0 461 | 0 462 | 0 463 | 0 464 | 0 465 | 0 466 | 0 467 | 0 468 | 0 469 | 0 470 | 5 471 | 0 472 | 5 473 | 0 474 | 0 475 | 476 | 477 | pinky3_cyl_pos 478 | pinky3Pos 479 | Trans_RPYRot_Skew 480 | 10 481 | 10 482 | 10 483 | 0 484 | 0 485 | 0 486 | 0 487 | 0 488 | 0 489 | 0 490 | 0 491 | 0 492 | 0 493 | 0 494 | 0 495 | 0 496 | 0 497 | 0 498 | 0 499 | 0 500 | 1.5700001 501 | 0 502 | 1.5700001 503 | 0 504 | 0 505 | 0 506 | 0 507 | 0 508 | 0 509 | 0 510 | 20 511 | 10 512 | 20 513 | 0 514 | 0 515 | 5 516 | 5 517 | 5 518 | 0 519 | 0 520 | 5 521 | 5 522 | 5 523 | 0 524 | 0 525 | 2 526 | 2 527 | 2 528 | 0 529 | 0 530 | 1 531 | 1 532 | 1 533 | 0 534 | 0 535 | 536 | 537 | pinky2_sph_p 538 | pinky2_pos 539 | scaling_uniform 540 | 5 541 | 5 542 | 5 543 | 0 544 | 0 545 | 546 | 547 | pinky2_cyl_pos 548 | pinky2_pos 549 | Trans_RPYRot_Skew 550 | 8 551 | 8 552 | 8 553 | 0 554 | 0 555 | 0 556 | 0 557 | 0 558 | 0 559 | 0 560 | 0 561 | 0 562 | 0 563 | 0 564 | 0 565 | 0 566 | 0 567 | 0 568 | 0 569 | 0 570 | 1.5700001 571 | 0 572 | 1.5700001 573 | 0 574 | 0 575 | 0 576 | 0 577 | 0 578 | 0 579 | 0 580 | 16 581 | 8 582 | 16 583 | 0 584 | 0 585 | 5 586 | 5 587 | 5 588 | 0 589 | 0 590 | 5 591 | 5 592 | 5 593 | 0 594 | 0 595 | 2 596 | 2 597 | 2 598 | 0 599 | 0 600 | 1 601 | 1 602 | 1 603 | 0 604 | 0 605 | 606 | 607 | thumb_pos 608 | scale 609 | TranslationRPYRotation 610 | 0 611 | 0 612 | 0 613 | 0 614 | 0 615 | -45 616 | -45 617 | -45 618 | 0 619 | 0 620 | 0 621 | 0 622 | 0 623 | 0 624 | 0 625 | -0.5 626 | 0 627 | 0.5 628 | 0 629 | 0 630 | 0 631 | 0 632 | 1 633 | 1 634 | 0 635 | 3.1400001 636 | 2.5 637 | 3.1400001 638 | 1 639 | 0 640 | 641 | 642 | thumb_sph_p 643 | thumb_pos 644 | scaling_uniform 645 | 5 646 | 5 647 | 5 648 | 0 649 | 0 650 | 651 | 652 | thumb_cyl_p 653 | thumb_pos 654 | Trans_RPYRot_Scaling 655 | 30 656 | 30 657 | 30 658 | 0 659 | 0 660 | 0 661 | 0 662 | 0 663 | 0 664 | 0 665 | 0 666 | 0 667 | 0 668 | 0 669 | 0 670 | 0 671 | 0 672 | 0 673 | 0 674 | 0 675 | 1.5700001 676 | 0 677 | 1.5700001 678 | 0 679 | 0 680 | 0 681 | 0 682 | 0 683 | 0 684 | 0 685 | 20 686 | 20 687 | 30 688 | 0 689 | 0 690 | 20 691 | 5 692 | 20 693 | 0 694 | 0 695 | 40 696 | 5 697 | 40 698 | 0 699 | 0 700 | 701 | 702 | thumb2_pos 703 | thumb_pos 704 | TranslationRPYRotation 705 | 60 706 | 60 707 | 60 708 | 0 709 | 0 710 | 0 711 | 0 712 | 0 713 | 0 714 | 0 715 | 0 716 | 0 717 | 0 718 | 0 719 | 0 720 | 0 721 | 0 722 | 0 723 | 0 724 | 0 725 | 0 726 | 0 727 | 1.5700001 728 | 1 729 | 0 730 | 0 731 | 0 732 | 0 733 | 0 734 | 0 735 | 736 | 737 | thumb2_sph_p 738 | thumb2_pos 739 | scaling_uniform 740 | 7 741 | 5 742 | 7 743 | 0 744 | 0 745 | 746 | 747 | thumb2_cyl_p 748 | thumb2_pos 749 | Trans_RPYRot_Skew 750 | 20 751 | 20 752 | 20 753 | 0 754 | 0 755 | 0 756 | 0 757 | 0 758 | 0 759 | 0 760 | 0 761 | 0 762 | 0 763 | 0 764 | 0 765 | 0 766 | 0 767 | 0 768 | 0 769 | 0 770 | 1.5700001 771 | 0 772 | 1.5700001 773 | 0 774 | 0 775 | 0 776 | 0 777 | 0 778 | 0 779 | 0 780 | 40 781 | 20 782 | 40 783 | 0 784 | 0 785 | 7 786 | 5 787 | 7 788 | 0 789 | 0 790 | 7 791 | 5 792 | 7 793 | 0 794 | 0 795 | 2 796 | 2 797 | 2 798 | 0 799 | 0 800 | 1 801 | 1 802 | 1 803 | 0 804 | 0 805 | 806 | 807 | thumb3_pos 808 | thumb2_pos 809 | TranslationRPYRotation 810 | 40 811 | 40 812 | 40 813 | 0 814 | 0 815 | 0 816 | 0 817 | 0 818 | 0 819 | 0 820 | 0 821 | 0 822 | 0 823 | 0 824 | 0 825 | 0 826 | 0 827 | 0 828 | 0 829 | 0 830 | 0 831 | 0 832 | 1.5700001 833 | 1 834 | 0 835 | 0 836 | 0 837 | 0 838 | 0 839 | 0 840 | 841 | 842 | thumb4_sph_p 843 | thumb3_pos 844 | Trans_scaleU 845 | 25 846 | 25 847 | 25 848 | 0 849 | 0 850 | 0 851 | 0 852 | 0 853 | 0 854 | 0 855 | 0 856 | 0 857 | 0 858 | 0 859 | 0 860 | 7 861 | 0 862 | 7 863 | 0 864 | 0 865 | 866 | 867 | thumb3_cyl_p 868 | thumb3_pos 869 | Trans_RPYRot_Skew 870 | 12.5 871 | 12.5 872 | 12.5 873 | 0 874 | 0 875 | 0 876 | 0 877 | 0 878 | 0 879 | 0 880 | 0 881 | 0 882 | 0 883 | 0 884 | 0 885 | 0 886 | 0 887 | 0 888 | 0 889 | 0 890 | 1.5700001 891 | 0 892 | 1.5700001 893 | 0 894 | 0 895 | 0 896 | 0 897 | 0 898 | 0 899 | 0 900 | 25 901 | 12.5 902 | 25 903 | 0 904 | 0 905 | 7 906 | 5 907 | 7 908 | 0 909 | 0 910 | 7 911 | 5 912 | 7 913 | 0 914 | 0 915 | 2 916 | 2 917 | 2 918 | 0 919 | 0 920 | 1 921 | 1 922 | 1 923 | 0 924 | 0 925 | 926 | 927 | thumb3_sph 928 | thumb3_pos 929 | scaling_uniform 930 | 7 931 | 5 932 | 7 933 | 0 934 | 0 935 | 936 | 937 | ring_pos 938 | scale 939 | TranslationRPYRotation 940 | 11.4653 941 | 11.4653 942 | 11.4653 943 | 0 944 | 0 945 | 40 946 | 40 947 | 40 948 | 0 949 | 0 950 | 0 951 | 0 952 | 0 953 | 0 954 | 0 955 | 0 956 | 0 957 | 0 958 | 0 959 | 0 960 | 0 961 | 0 962 | 1.5700001 963 | 1 964 | 0 965 | 1.5700001 966 | 0.69999999 967 | 2.2 968 | 1 969 | 0 970 | 971 | 972 | ring_sph_p 973 | ring_pos 974 | scaling_uniform 975 | 5 976 | 5 977 | 5 978 | 0 979 | 0 980 | 981 | 982 | ring_cyl_p 983 | ring_pos 984 | Trans_RPYRot_Skew 985 | 20 986 | 20 987 | 20 988 | 0 989 | 0 990 | 0 991 | 0 992 | 0 993 | 0 994 | 0 995 | 0 996 | 0 997 | 0 998 | 0 999 | 0 1000 | 0 1001 | 0 1002 | 0 1003 | 0 1004 | 0 1005 | 1.5700001 1006 | 0 1007 | 1.5700001 1008 | 0 1009 | 0 1010 | 0 1011 | 0 1012 | 0 1013 | 0 1014 | 0 1015 | 40 1016 | 20 1017 | 40 1018 | 0 1019 | 0 1020 | 5 1021 | 5 1022 | 5 1023 | 0 1024 | 0 1025 | 5 1026 | 5 1027 | 5 1028 | 0 1029 | 0 1030 | 2 1031 | 2 1032 | 2 1033 | 0 1034 | 0 1035 | 1 1036 | 1 1037 | 1 1038 | 0 1039 | 0 1040 | 1041 | 1042 | ring2_pos 1043 | ring_pos 1044 | TranslationRPYRotation 1045 | 40 1046 | 40 1047 | 40 1048 | 0 1049 | 0 1050 | 0 1051 | 0 1052 | 0 1053 | 0 1054 | 0 1055 | 0 1056 | 0 1057 | 0 1058 | 0 1059 | 0 1060 | 0 1061 | 0 1062 | 0 1063 | 0 1064 | 0 1065 | 0 1066 | 0 1067 | 1.5700001 1068 | 1 1069 | 0 1070 | 0 1071 | 0 1072 | 0 1073 | 0 1074 | 0 1075 | 1076 | 1077 | ring2_sph_p 1078 | ring2_pos 1079 | scaling_uniform 1080 | 5 1081 | 0 1082 | 5 1083 | 0 1084 | 0 1085 | 1086 | 1087 | ring2_cyl_p 1088 | ring2_pos 1089 | Trans_RPYRot_Skew 1090 | 10 1091 | 10 1092 | 10 1093 | 0 1094 | 0 1095 | 0 1096 | 0 1097 | 0 1098 | 0 1099 | 0 1100 | 0 1101 | 0 1102 | 0 1103 | 0 1104 | 0 1105 | 0 1106 | 0 1107 | 0 1108 | 0 1109 | 0 1110 | 1.5700001 1111 | 0 1112 | 1.5700001 1113 | 0 1114 | 0 1115 | 0 1116 | 0 1117 | 0 1118 | 0 1119 | 0 1120 | 20 1121 | 10 1122 | 20 1123 | 0 1124 | 0 1125 | 5 1126 | 5 1127 | 5 1128 | 0 1129 | 0 1130 | 5 1131 | 5 1132 | 5 1133 | 0 1134 | 0 1135 | 2 1136 | 2 1137 | 2 1138 | 0 1139 | 0 1140 | 1 1141 | 1 1142 | 1 1143 | 0 1144 | 0 1145 | 1146 | 1147 | ring3_pos 1148 | ring2_pos 1149 | TranslationRPYRotation 1150 | 20 1151 | 20 1152 | 20 1153 | 0 1154 | 0 1155 | 0 1156 | 0 1157 | 0 1158 | 0 1159 | 0 1160 | 0 1161 | 0 1162 | 0 1163 | 0 1164 | 0 1165 | 0 1166 | 0 1167 | 0 1168 | 0 1169 | 0 1170 | 0 1171 | 0 1172 | 1.5700001 1173 | 1 1174 | 0 1175 | 0 1176 | 0 1177 | 0 1178 | 0 1179 | 0 1180 | 1181 | 1182 | ring3_sph_p 1183 | ring3_pos 1184 | scaling_uniform 1185 | 5 1186 | 5 1187 | 5 1188 | 0 1189 | 0 1190 | 1191 | 1192 | ring4_sph_p 1193 | ring3_pos 1194 | Trans_scaleU 1195 | 20 1196 | 20 1197 | 20 1198 | 0 1199 | 0 1200 | 0 1201 | 0 1202 | 0 1203 | 0 1204 | 0 1205 | 0 1206 | 0 1207 | 0 1208 | 0 1209 | 0 1210 | 5 1211 | 0 1212 | 5 1213 | 0 1214 | 0 1215 | 1216 | 1217 | ring3_cyl_p 1218 | ring3_pos 1219 | Trans_RPYRot_Skew 1220 | 10 1221 | 10 1222 | 10 1223 | 0 1224 | 0 1225 | 0 1226 | 0 1227 | 0 1228 | 0 1229 | 0 1230 | 0 1231 | 0 1232 | 0 1233 | 0 1234 | 0 1235 | 0 1236 | 0 1237 | 0 1238 | 0 1239 | 0 1240 | 1.5700001 1241 | 0 1242 | 1.5700001 1243 | 0 1244 | 0 1245 | 0 1246 | 0 1247 | 0 1248 | 0 1249 | 0 1250 | 20 1251 | 10 1252 | 20 1253 | 0 1254 | 0 1255 | 5 1256 | 5 1257 | 5 1258 | 0 1259 | 0 1260 | 5 1261 | 5 1262 | 5 1263 | 0 1264 | 0 1265 | 2 1266 | 2 1267 | 2 1268 | 0 1269 | 0 1270 | 1 1271 | 1 1272 | 1 1273 | 0 1274 | 0 1275 | 1276 | 1277 | index_pos 1278 | scale 1279 | TranslationRPYRotation 1280 | -40.4869 1281 | -40.4869 1282 | -40.4869 1283 | 0 1284 | 0 1285 | 40 1286 | 40 1287 | 40 1288 | 0 1289 | 0 1290 | 0 1291 | 0 1292 | 0 1293 | 0 1294 | 0 1295 | 0 1296 | 0 1297 | 0 1298 | 0 1299 | 0 1300 | 0 1301 | 0 1302 | 1.5700001 1303 | 1 1304 | 0 1305 | 1.5700001 1306 | 0.69999999 1307 | 2.2 1308 | 1 1309 | 0 1310 | 1311 | 1312 | index_sph_p 1313 | index_pos 1314 | scaling_uniform 1315 | 5 1316 | 5 1317 | 5 1318 | 0 1319 | 0 1320 | 1321 | 1322 | index_cyl_p 1323 | index_pos 1324 | Trans_RPYRot_Skew 1325 | 17.5 1326 | 17.5 1327 | 17.5 1328 | 0 1329 | 0 1330 | 0 1331 | 0 1332 | 0 1333 | 0 1334 | 0 1335 | 0 1336 | 0 1337 | 0 1338 | 0 1339 | 0 1340 | 0 1341 | 0 1342 | 0 1343 | 0 1344 | 0 1345 | 1.5700001 1346 | 0 1347 | 1.5700001 1348 | 0 1349 | 0 1350 | 0 1351 | 0 1352 | 0 1353 | 0 1354 | 0 1355 | 35 1356 | 17.5 1357 | 35 1358 | 0 1359 | 0 1360 | 5 1361 | 5 1362 | 5 1363 | 0 1364 | 0 1365 | 5 1366 | 5 1367 | 5 1368 | 0 1369 | 0 1370 | 2 1371 | 2 1372 | 2 1373 | 0 1374 | 0 1375 | 1 1376 | 1 1377 | 1 1378 | 0 1379 | 0 1380 | 1381 | 1382 | index2_pos 1383 | index_pos 1384 | TranslationRPYRotation 1385 | 35 1386 | 35 1387 | 35 1388 | 0 1389 | 0 1390 | 0 1391 | 0 1392 | 0 1393 | 0 1394 | 0 1395 | 0 1396 | 0 1397 | 0 1398 | 0 1399 | 0 1400 | 0 1401 | 0 1402 | 0 1403 | 0 1404 | 0 1405 | 0 1406 | 0 1407 | 1.5700001 1408 | 1 1409 | 0 1410 | 0 1411 | 0 1412 | 0 1413 | 0 1414 | 0 1415 | 1416 | 1417 | index2_sph_p 1418 | index2_pos 1419 | scaling_uniform 1420 | 5 1421 | 5 1422 | 5 1423 | 0 1424 | 0 1425 | 1426 | 1427 | index2_cyl_p 1428 | index2_pos 1429 | Trans_RPYRot_Skew 1430 | 10 1431 | 10 1432 | 10 1433 | 0 1434 | 0 1435 | 0 1436 | 0 1437 | 0 1438 | 0 1439 | 0 1440 | 0 1441 | 0 1442 | 0 1443 | 0 1444 | 0 1445 | 0 1446 | 0 1447 | 0 1448 | 0 1449 | 0 1450 | 1.5700001 1451 | 0 1452 | 1.5700001 1453 | 0 1454 | 0 1455 | 0 1456 | 0 1457 | 0 1458 | 0 1459 | 0 1460 | 20 1461 | 10 1462 | 20 1463 | 0 1464 | 0 1465 | 5 1466 | 5 1467 | 5 1468 | 0 1469 | 0 1470 | 5 1471 | 5 1472 | 5 1473 | 0 1474 | 0 1475 | 2 1476 | 2 1477 | 2 1478 | 0 1479 | 0 1480 | 1 1481 | 1 1482 | 1 1483 | 0 1484 | 0 1485 | 1486 | 1487 | index3_pos 1488 | index2_pos 1489 | TranslationRPYRotation 1490 | 20 1491 | 20 1492 | 20 1493 | 0 1494 | 0 1495 | 0 1496 | 0 1497 | 0 1498 | 0 1499 | 0 1500 | 0 1501 | 0 1502 | 0 1503 | 0 1504 | 0 1505 | 0 1506 | 0 1507 | 0 1508 | 0 1509 | 0 1510 | 0 1511 | 0 1512 | 1.5700001 1513 | 1 1514 | 0 1515 | 0 1516 | 0 1517 | 0 1518 | 0 1519 | 0 1520 | 1521 | 1522 | index3_sph_p 1523 | index3_pos 1524 | scaling_uniform 1525 | 5 1526 | 5 1527 | 5 1528 | 0 1529 | 0 1530 | 1531 | 1532 | index3_cyl_p 1533 | index3_pos 1534 | Trans_RPYRot_Skew 1535 | 10 1536 | 10 1537 | 10 1538 | 0 1539 | 0 1540 | 0 1541 | 0 1542 | 0 1543 | 0 1544 | 0 1545 | 0 1546 | 0 1547 | 0 1548 | 0 1549 | 0 1550 | 0 1551 | 0 1552 | 0 1553 | 0 1554 | 0 1555 | 1.5700001 1556 | 0 1557 | 1.5700001 1558 | 0 1559 | 0 1560 | 0 1561 | 0 1562 | 0 1563 | 0 1564 | 0 1565 | 20 1566 | 10 1567 | 20 1568 | 0 1569 | 0 1570 | 5 1571 | 5 1572 | 5 1573 | 0 1574 | 0 1575 | 5 1576 | 5 1577 | 5 1578 | 0 1579 | 0 1580 | 2 1581 | 2 1582 | 2 1583 | 0 1584 | 0 1585 | 1 1586 | 1 1587 | 1 1588 | 0 1589 | 0 1590 | 1591 | 1592 | index4_sph_p 1593 | index3_pos 1594 | Trans_scaleU 1595 | 20 1596 | 20 1597 | 20 1598 | 0 1599 | 0 1600 | 0 1601 | 0 1602 | 0 1603 | 0 1604 | 0 1605 | 0 1606 | 0 1607 | 0 1608 | 0 1609 | 0 1610 | 5 1611 | 0 1612 | 5 1613 | 0 1614 | 0 1615 | 1616 | 1617 | middle_pos 1618 | scale 1619 | TranslationRPYRotation 1620 | -12.9642 1621 | -12.9642 1622 | -12.9642 1623 | 0 1624 | 0 1625 | 40 1626 | 40 1627 | 40 1628 | 0 1629 | 0 1630 | 0 1631 | 0 1632 | 0 1633 | 0 1634 | 0 1635 | 0 1636 | 0 1637 | 0 1638 | 0 1639 | 0 1640 | 0 1641 | 0 1642 | 1.5700001 1643 | 1 1644 | 0 1645 | 1.5700001 1646 | 0.69999999 1647 | 2.2 1648 | 1 1649 | 0 1650 | 1651 | 1652 | mid_sph_p 1653 | middle_pos 1654 | scaling_uniform 1655 | 5 1656 | 5 1657 | 5 1658 | 0 1659 | 0 1660 | 1661 | 1662 | mid_cyl_p 1663 | middle_pos 1664 | Trans_RPYRot_Skew 1665 | 22.5 1666 | 22.5 1667 | 22.5 1668 | 0 1669 | 0 1670 | 0 1671 | 0 1672 | 0 1673 | 0 1674 | 0 1675 | 0 1676 | 0 1677 | 0 1678 | 0 1679 | 0 1680 | 0 1681 | 0 1682 | 0 1683 | 0 1684 | 0 1685 | 1.5700001 1686 | 0 1687 | 1.5700001 1688 | 0 1689 | 0 1690 | 0 1691 | 0 1692 | 0 1693 | 0 1694 | 0 1695 | 45 1696 | 22.5 1697 | 45 1698 | 0 1699 | 0 1700 | 5 1701 | 5 1702 | 5 1703 | 0 1704 | 0 1705 | 5 1706 | 5 1707 | 5 1708 | 0 1709 | 0 1710 | 2 1711 | 2 1712 | 2 1713 | 0 1714 | 0 1715 | 1 1716 | 1 1717 | 1 1718 | 0 1719 | 0 1720 | 1721 | 1722 | mid2_pos 1723 | middle_pos 1724 | TranslationRPYRotation 1725 | 45 1726 | 45 1727 | 45 1728 | 0 1729 | 0 1730 | 0 1731 | 0 1732 | 0 1733 | 0 1734 | 0 1735 | 0 1736 | 0 1737 | 0 1738 | 0 1739 | 0 1740 | 0 1741 | 0 1742 | 0 1743 | 0 1744 | 0 1745 | 0 1746 | 0 1747 | 1.5700001 1748 | 1 1749 | 0 1750 | 0 1751 | 0 1752 | 0 1753 | 0 1754 | 0 1755 | 1756 | 1757 | mid2_sph_p 1758 | mid2_pos 1759 | scaling_uniform 1760 | 5 1761 | 5 1762 | 5 1763 | 0 1764 | 0 1765 | 1766 | 1767 | mid2_cyl_p 1768 | mid2_pos 1769 | Trans_RPYRot_Skew 1770 | 12.5 1771 | 12.5 1772 | 12.5 1773 | 0 1774 | 0 1775 | 0 1776 | 0 1777 | 0 1778 | 0 1779 | 0 1780 | 0 1781 | 0 1782 | 0 1783 | 0 1784 | 0 1785 | 0 1786 | 0 1787 | 0 1788 | 0 1789 | 0 1790 | 1.5700001 1791 | 0 1792 | 1.5700001 1793 | 0 1794 | 0 1795 | 0 1796 | 0 1797 | 0 1798 | 0 1799 | 0 1800 | 25 1801 | 12.5 1802 | 25 1803 | 0 1804 | 0 1805 | 5 1806 | 5 1807 | 5 1808 | 0 1809 | 0 1810 | 5 1811 | 5 1812 | 5 1813 | 0 1814 | 0 1815 | 2 1816 | 2 1817 | 2 1818 | 0 1819 | 0 1820 | 1 1821 | 1 1822 | 1 1823 | 0 1824 | 0 1825 | 1826 | 1827 | mid3_pos 1828 | mid2_pos 1829 | TranslationRPYRotation 1830 | 25 1831 | 25 1832 | 25 1833 | 0 1834 | 0 1835 | 0 1836 | 0 1837 | 0 1838 | 0 1839 | 0 1840 | 0 1841 | 0 1842 | 0 1843 | 0 1844 | 0 1845 | 0 1846 | 0 1847 | 0 1848 | 0 1849 | 0 1850 | 0 1851 | 0 1852 | 1.5700001 1853 | 1 1854 | 0 1855 | 0 1856 | 0 1857 | 0 1858 | 0 1859 | 0 1860 | 1861 | 1862 | mid3_sph_p 1863 | mid3_pos 1864 | scaling_uniform 1865 | 5 1866 | 0 1867 | 5 1868 | 0 1869 | 0 1870 | 1871 | 1872 | mid3_cyl_p 1873 | mid3_pos 1874 | Trans_RPYRot_Skew 1875 | 10.5 1876 | 10.5 1877 | 10.5 1878 | 0 1879 | 0 1880 | 0 1881 | 0 1882 | 0 1883 | 0 1884 | 0 1885 | 0 1886 | 0 1887 | 0 1888 | 0 1889 | 0 1890 | 0 1891 | 0 1892 | 0 1893 | 0 1894 | 0 1895 | 1.5700001 1896 | 0 1897 | 1.5700001 1898 | 0 1899 | 0 1900 | 0 1901 | 0 1902 | 0 1903 | 0 1904 | 0 1905 | 21 1906 | 10.5 1907 | 21 1908 | 0 1909 | 0 1910 | 5 1911 | 5 1912 | 5 1913 | 0 1914 | 0 1915 | 5 1916 | 5 1917 | 5 1918 | 0 1919 | 0 1920 | 2 1921 | 2 1922 | 2 1923 | 0 1924 | 0 1925 | 1 1926 | 1 1927 | 1 1928 | 0 1929 | 0 1930 | 1931 | 1932 | mid4_sph_p 1933 | mid3_pos 1934 | Trans_scaleU 1935 | 21 1936 | 21 1937 | 21 1938 | 0 1939 | 0 1940 | 0 1941 | 0 1942 | 0 1943 | 0 1944 | 0 1945 | 0 1946 | 0 1947 | 0 1948 | 0 1949 | 0 1950 | 5 1951 | 0 1952 | 5 1953 | 0 1954 | 0 1955 | 1956 | 37 1957 | 1958 | palm_sph1 1959 | palm_sph1_p 1960 | sphere_low.obj 1961 | green 1962 | 1963 | 1964 | palm_sph2 1965 | palm_sph2_p 1966 | sphere_low.obj 1967 | green 1968 | 1969 | 1970 | pinky_sphere 1971 | pinky_sph_p 1972 | sphere_low.obj 1973 | blue 1974 | 1975 | 1976 | pinky2_sphere 1977 | pinky2_sph_p 1978 | sphere_low.obj 1979 | blue 1980 | 1981 | 1982 | pinky3_sphere 1983 | pinky3_sph_p 1984 | sphere_low.obj 1985 | blue 1986 | 1987 | 1988 | pinky4_sph 1989 | pinky4_sph_p 1990 | sphere_low.obj 1991 | blue 1992 | 1993 | 1994 | ring_sphere 1995 | ring_sph_p 1996 | sphere_low.obj 1997 | blue 1998 | 1999 | 2000 | ring2_sphere 2001 | ring2_sph_p 2002 | sphere_low.obj 2003 | blue 2004 | 2005 | 2006 | ring3_sphere 2007 | ring3_sph_p 2008 | sphere_low.obj 2009 | blue 2010 | 2011 | 2012 | ring4_sphere 2013 | ring4_sph_p 2014 | sphere_low.obj 2015 | blue 2016 | 2017 | 2018 | mid_sphere 2019 | mid_sph_p 2020 | sphere_low.obj 2021 | white 2022 | 2023 | 2024 | mid2_sphere 2025 | mid2_sph_p 2026 | sphere_low.obj 2027 | blue 2028 | 2029 | 2030 | mid3_sphere 2031 | mid3_sph_p 2032 | sphere_low.obj 2033 | blue 2034 | 2035 | 2036 | mid4_sphere 2037 | mid4_sph_p 2038 | sphere_low.obj 2039 | blue 2040 | 2041 | 2042 | index_sphere 2043 | index_sph_p 2044 | sphere_low.obj 2045 | blue 2046 | 2047 | 2048 | index2_sphere 2049 | index2_sph_p 2050 | sphere_low.obj 2051 | blue 2052 | 2053 | 2054 | index3_sphere 2055 | index3_sph_p 2056 | sphere_low.obj 2057 | blue 2058 | 2059 | 2060 | index4_sphere 2061 | index4_sph_p 2062 | sphere_low.obj 2063 | blue 2064 | 2065 | 2066 | thumb_cyl 2067 | thumb_cyl_p 2068 | sphere_low.obj 2069 | red 2070 | 2071 | 2072 | thumb2_sphere 2073 | thumb2_sph_p 2074 | sphere_low.obj 2075 | blue 2076 | 2077 | 2078 | thumb3_sph 2079 | thumb3_sph 2080 | sphere_low.obj 2081 | blue 2082 | 2083 | 2084 | thumb4_sphere 2085 | thumb4_sph_p 2086 | sphere_low.obj 2087 | blue 2088 | 2089 | 2090 | palm1 2091 | palm_mesh_pos 2092 | cylinder_low.obj 2093 | purple 2094 | 2095 | 2096 | pinky_cyl 2097 | pinky_cyl_pos 2098 | cylinder_low.obj 2099 | white 2100 | 2101 | 2102 | pinky2_cyl 2103 | pinky2_cyl_pos 2104 | cylinder_low.obj 2105 | white 2106 | 2107 | 2108 | pinky3_cyl 2109 | pinky3_cyl_pos 2110 | cylinder_low.obj 2111 | white 2112 | 2113 | 2114 | ring_cyl 2115 | ring_cyl_p 2116 | cylinder_low.obj 2117 | white 2118 | 2119 | 2120 | ring2_cyl 2121 | ring2_cyl_p 2122 | cylinder_low.obj 2123 | white 2124 | 2125 | 2126 | ring3_cyl 2127 | ring3_cyl_p 2128 | cylinder_low.obj 2129 | white 2130 | 2131 | 2132 | mid_cyl 2133 | mid_cyl_p 2134 | cylinder_low.obj 2135 | white 2136 | 2137 | 2138 | mid2_cyl 2139 | mid2_cyl_p 2140 | cylinder_low.obj 2141 | white 2142 | 2143 | 2144 | mid3_cyl 2145 | mid3_cyl_p 2146 | cylinder_low.obj 2147 | white 2148 | 2149 | 2150 | index_cyl 2151 | index_cyl_p 2152 | cylinder_low.obj 2153 | white 2154 | 2155 | 2156 | index2_cyl 2157 | index2_cyl_p 2158 | cylinder_low.obj 2159 | white 2160 | 2161 | 2162 | index3_cyl 2163 | index3_cyl_p 2164 | cylinder_low.obj 2165 | white 2166 | 2167 | 2168 | thumb2_cyl 2169 | thumb2_cyl_p 2170 | cylinder_low.obj 2171 | white 2172 | 2173 | 2174 | thumb3_cyl 2175 | thumb3_cyl_p 2176 | cylinder_low.obj 2177 | white 2178 | 2179 | 6 2180 | 2181 | close_hand 2182 | add 2183 | -0.80000001 2184 | 0 2185 | 0 2186 | 0 2187 | 0 2188 | 0 2189 | 12 2190 | pinky_pos 2191 | Pitch 2192 | ring_pos 2193 | Pitch 2194 | index_pos 2195 | Pitch 2196 | middle_pos 2197 | Pitch 2198 | pinky2_pos 2199 | Pitch 2200 | pinky3Pos 2201 | Pitch 2202 | ring2_pos 2203 | Pitch 2204 | ring3_pos 2205 | Pitch 2206 | mid2_pos 2207 | Pitch 2208 | mid3_pos 2209 | Pitch 2210 | index2_pos 2211 | Pitch 2212 | index3_pos 2213 | Pitch 2214 | 2215 | 2216 | fingers_tips_radius 2217 | multiply 2218 | 0.80000001 2219 | 0 2220 | 0 2221 | 0 2222 | 1 2223 | 0 2224 | 10 2225 | pinky3_cyl_pos 2226 | skew_topRadius 2227 | ring3_cyl_p 2228 | skew_topRadius 2229 | index3_cyl_p 2230 | skew_topRadius 2231 | mid3_cyl_p 2232 | skew_topRadius 2233 | thumb3_cyl_p 2234 | skew_topRadius 2235 | pinky4_sph_p 2236 | scale 2237 | thumb4_sph_p 2238 | scale 2239 | ring4_sph_p 2240 | scale 2241 | index4_sph_p 2242 | scale 2243 | mid4_sph_p 2244 | scale 2245 | 2246 | 2247 | finger_midHighRadius 2248 | multiply 2249 | 0.89999998 2250 | 0 2251 | 0 2252 | 0 2253 | 1 2254 | 0 2255 | 15 2256 | thumb3_sph 2257 | scale 2258 | pinky2_cyl_pos 2259 | skew_topRadius 2260 | thumb2_cyl_p 2261 | skew_topRadius 2262 | index2_cyl_p 2263 | skew_topRadius 2264 | mid2_cyl_p 2265 | skew_topRadius 2266 | ring2_cyl_p 2267 | skew_topRadius 2268 | pinky3_sph_p 2269 | scale 2270 | index3_sph_p 2271 | scale 2272 | mid3_sph_p 2273 | scale 2274 | ring3_sph_p 2275 | scale 2276 | pinky3_cyl_pos 2277 | skew_baseRadius 2278 | thumb3_cyl_p 2279 | skew_baseRadius 2280 | index3_cyl_p 2281 | skew_baseRadius 2282 | mid3_cyl_p 2283 | skew_baseRadius 2284 | ring3_cyl_p 2285 | skew_baseRadius 2286 | 2287 | 2288 | finger_midLowRadius 2289 | multiply 2290 | 0.94999999 2291 | 0 2292 | 0 2293 | 0 2294 | 1 2295 | 0 2296 | 14 2297 | pinky2_cyl_pos 2298 | skew_baseRadius 2299 | thumb2_cyl_p 2300 | skew_baseRadius 2301 | ring2_cyl_p 2302 | skew_baseRadius 2303 | index2_cyl_p 2304 | skew_baseRadius 2305 | mid2_cyl_p 2306 | skew_baseRadius 2307 | mid2_sph_p 2308 | scale 2309 | index2_sph_p 2310 | scale 2311 | ring2_sph_p 2312 | scale 2313 | thumb2_sph_p 2314 | scale 2315 | pinky2_sph_p 2316 | scale 2317 | pinky_cyl_pos 2318 | skew_topRadius 2319 | ring_cyl_p 2320 | skew_topRadius 2321 | index_cyl_p 2322 | skew_topRadius 2323 | mid_cyl_p 2324 | skew_topRadius 2325 | 2326 | 2327 | finger_bottomRadius 2328 | multiply 2329 | 1 2330 | 0 2331 | 0 2332 | 0 2333 | 1 2334 | 0 2335 | 8 2336 | mid_cyl_p 2337 | skew_baseRadius 2338 | pinky_cyl_pos 2339 | skew_baseRadius 2340 | ring_cyl_p 2341 | skew_baseRadius 2342 | index_cyl_p 2343 | skew_baseRadius 2344 | pinky_sph_p 2345 | scale 2346 | ring_sph_p 2347 | scale 2348 | index_sph_p 2349 | scale 2350 | mid_sph_p 2351 | scale 2352 | 2353 | 2354 | fingers_thickness 2355 | multiply 2356 | 2 2357 | 0 2358 | 0 2359 | 0 2360 | 1 2361 | 0 2362 | 51 2363 | pinky_sph_p 2364 | scale 2365 | thumb_sph_p 2366 | scale 2367 | ring_sph_p 2368 | scale 2369 | index_sph_p 2370 | scale 2371 | pinky2_sph_p 2372 | scale 2373 | pinky3_sph_p 2374 | scale 2375 | pinky4_sph_p 2376 | scale 2377 | thumb2_sph_p 2378 | scale 2379 | thumb3_sph 2380 | scale 2381 | thumb4_sph_p 2382 | scale 2383 | index2_sph_p 2384 | scale 2385 | index3_sph_p 2386 | scale 2387 | index4_sph_p 2388 | scale 2389 | mid_sph_p 2390 | scale 2391 | mid2_sph_p 2392 | scale 2393 | mid3_sph_p 2394 | scale 2395 | mid4_sph_p 2396 | scale 2397 | ring2_sph_p 2398 | scale 2399 | ring3_sph_p 2400 | scale 2401 | ring4_sph_p 2402 | scale 2403 | pinky_cyl_pos 2404 | skew_baseRadius 2405 | pinky_cyl_pos 2406 | skew_topRadius 2407 | pinky2_cyl_pos 2408 | skew_baseRadius 2409 | pinky2_cyl_pos 2410 | skew_topRadius 2411 | pinky3_cyl_pos 2412 | skew_baseRadius 2413 | pinky3_cyl_pos 2414 | skew_topRadius 2415 | thumb2_cyl_p 2416 | skew_baseRadius 2417 | thumb2_cyl_p 2418 | skew_topRadius 2419 | thumb3_cyl_p 2420 | skew_topRadius 2421 | thumb3_cyl_p 2422 | skew_baseRadius 2423 | ring_cyl_p 2424 | skew_baseRadius 2425 | ring_cyl_p 2426 | skew_topRadius 2427 | ring2_cyl_p 2428 | skew_topRadius 2429 | ring2_cyl_p 2430 | skew_baseRadius 2431 | ring3_cyl_p 2432 | skew_baseRadius 2433 | ring3_cyl_p 2434 | skew_topRadius 2435 | index_cyl_p 2436 | skew_topRadius 2437 | index_cyl_p 2438 | skew_baseRadius 2439 | index2_cyl_p 2440 | skew_baseRadius 2441 | index2_cyl_p 2442 | skew_topRadius 2443 | index3_cyl_p 2444 | skew_topRadius 2445 | index3_cyl_p 2446 | skew_baseRadius 2447 | mid_cyl_p 2448 | skew_baseRadius 2449 | mid_cyl_p 2450 | skew_topRadius 2451 | mid2_cyl_p 2452 | skew_topRadius 2453 | mid2_cyl_p 2454 | skew_baseRadius 2455 | mid3_cyl_p 2456 | skew_baseRadius 2457 | mid3_cyl_p 2458 | skew_topRadius 2459 | palm_mesh_pos 2460 | scale_X 2461 | palm_sph1_p 2462 | scaleZ 2463 | palm_sph2_p 2464 | scaleZ 2465 | 2466 | 0 2467 | 2468 | 2469 | --------------------------------------------------------------------------------