HandModelV2.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * Copyright (C) 2011-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5  *
6  * ArmarX is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * ArmarX is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * @package
19  * @author
20  * @date
21  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22  * GNU General Public License
23  */
24 #include "HandModelV2.h"
25 
27 
28 #include <iostream>
29 #include <fstream>
30 
31 
32 
33 namespace visionx
34 {
35 
36  CHandModelV2::CFinger::CFinger(std::vector<float> aJointOffsets, std::vector<Vec3d> aFingerTipCorners)
37  {
38  for (size_t i = 0; i < aJointOffsets.size(); i++)
39  {
40  m_aJointOffsets.push_back(aJointOffsets.at(i));
41  m_aJointAngles.push_back(0);
42  }
43  m_aFingerJointsInFingerBaseCS.resize(aJointOffsets.size() + 1);
44  Math3d::SetVec(m_aFingerJointsInFingerBaseCS.at(0), 0, 0, 0);
45 
46  for (size_t i = 0; i < aFingerTipCorners.size(); i++)
47  {
48  m_aFingerTipCornersInLocalCS.push_back(aFingerTipCorners.at(i));
49  }
50  m_aFingerTipCornersInFingerBaseCS.resize(aFingerTipCorners.size());
51 
52  // initial calculation, all angles 0
53  UpdateJointAngles(m_aJointAngles);
54  }
55 
56 
57  void CHandModelV2::CFinger::UpdateJointAngles(std::vector<float> aNewJointValues)
58  {
59  Mat3d mRotLocal, mRotGlobal = Math3d::unit_mat;
60  Vec3d vTemp = Math3d::zero_vec;
61 
62  // joint angles and positions
63  const size_t n = (m_aJointAngles.size() <= aNewJointValues.size()) ? m_aJointAngles.size() : aNewJointValues.size();
64  for (size_t i = 0; i < n; i++)
65  {
66  m_aJointAngles.at(i) = aNewJointValues.at(i);
67  Math3d::SetRotationMatY(mRotLocal, aNewJointValues.at(i));
68  Math3d::MulMatMat(mRotGlobal, mRotLocal, mRotGlobal);
69  vTemp.x = m_aJointOffsets.at(i);
70  Math3d::MulMatVec(mRotGlobal, vTemp, m_aFingerJointsInFingerBaseCS.at(i), m_aFingerJointsInFingerBaseCS.at(i + 1));
71  }
72 
73  Vec3d vFingerTipPosition = m_aFingerJointsInFingerBaseCS.at(m_aJointAngles.size());
74  for (size_t i = 0; i < m_aFingerTipCornersInLocalCS.size(); i++)
75  {
76  Math3d::MulMatVec(mRotGlobal, m_aFingerTipCornersInLocalCS.at(i), vFingerTipPosition, m_aFingerTipCornersInFingerBaseCS.at(i));
77  }
78  }
79 
80 
81 
82  CHandModelV2::CHandModelV2(std::string sConfigFileName, CStereoCalibration* pStereoCalibration)
83  {
84  m_pStereoCalibration = pStereoCalibration;
85 
86  //****************************************
87  // read hand config file
88  //****************************************
89 
90  std::ifstream sFileStream(sConfigFileName.c_str(), std::ifstream::in);
91  if (!sFileStream.good())
92  {
93  ARMARX_WARNING_S << "CHandModelV2 constructor: file " << sConfigFileName << " could not be opened";
94  return;
95  }
96 
97  setlocale(LC_NUMERIC, "C");
98 
99  std::string sLine;
100  Vec3d vTemp;
101  float fTemp;
102  std::vector<std::vector<float> > aJointOffsets;
103  aJointOffsets.resize(5);
104 
105  // offset to thumb base
106  sLine = GetNextNonCommentLine(sFileStream);
107  sscanf(sLine.c_str(), "%f %f %f", &vTemp.x, &vTemp.y, &vTemp.z);
108  m_aOffsetsToFingers.push_back(vTemp);
109 
110  // distance from thumb base joint to second joint
111  sLine = GetNextNonCommentLine(sFileStream);
112  sscanf(sLine.c_str(), "%f", &fTemp);
113  aJointOffsets.at(0).push_back(fTemp);
114 
115  // distance from second thumb joint to fingertip
116  sLine = GetNextNonCommentLine(sFileStream);
117  sscanf(sLine.c_str(), "%f", &fTemp);
118  aJointOffsets.at(0).push_back(fTemp);
119 
120 
121 
122  // offset from palm to index base
123  sLine = GetNextNonCommentLine(sFileStream);
124  sscanf(sLine.c_str(), "%f %f %f", &vTemp.x, &vTemp.y, &vTemp.z);
125  m_aOffsetsToFingers.push_back(vTemp);
126 
127  // distance from index base joint to second joint
128  sLine = GetNextNonCommentLine(sFileStream);
129  sscanf(sLine.c_str(), "%f", &fTemp);
130  aJointOffsets.at(1).push_back(fTemp);
131 
132  // distance from second index joint to fingertip
133  sLine = GetNextNonCommentLine(sFileStream);
134  sscanf(sLine.c_str(), "%f", &fTemp);
135  aJointOffsets.at(1).push_back(fTemp);
136 
137 
138  // offset from palm to middle base
139  sLine = GetNextNonCommentLine(sFileStream);
140  sscanf(sLine.c_str(), "%f %f %f", &vTemp.x, &vTemp.y, &vTemp.z);
141  m_aOffsetsToFingers.push_back(vTemp);
142 
143  // distance from middle base joint to second joint
144  sLine = GetNextNonCommentLine(sFileStream);
145  sscanf(sLine.c_str(), "%f", &fTemp);
146  aJointOffsets.at(2).push_back(fTemp);
147 
148  // distance from second middle joint to fingertip
149  sLine = GetNextNonCommentLine(sFileStream);
150  sscanf(sLine.c_str(), "%f", &fTemp);
151  aJointOffsets.at(2).push_back(fTemp);
152 
153 
154  // offset from palm to ring base
155  sLine = GetNextNonCommentLine(sFileStream);
156  sscanf(sLine.c_str(), "%f %f %f", &vTemp.x, &vTemp.y, &vTemp.z);
157  m_aOffsetsToFingers.push_back(vTemp);
158 
159  // distance from ring base joint to second joint
160  sLine = GetNextNonCommentLine(sFileStream);
161  sscanf(sLine.c_str(), "%f", &fTemp);
162  aJointOffsets.at(3).push_back(fTemp);
163 
164  // distance from second ring joint to fingertip
165  sLine = GetNextNonCommentLine(sFileStream);
166  sscanf(sLine.c_str(), "%f", &fTemp);
167  aJointOffsets.at(3).push_back(fTemp);
168 
169 
170  // offset from palm to pinky base
171  sLine = GetNextNonCommentLine(sFileStream);
172  sscanf(sLine.c_str(), "%f %f %f", &vTemp.x, &vTemp.y, &vTemp.z);
173  m_aOffsetsToFingers.push_back(vTemp);
174 
175  // distance from pinky base joint to second joint
176  sLine = GetNextNonCommentLine(sFileStream);
177  sscanf(sLine.c_str(), "%f", &fTemp);
178  aJointOffsets.at(4).push_back(fTemp);
179 
180  // distance from second pinky joint to fingertip
181  sLine = GetNextNonCommentLine(sFileStream);
182  sscanf(sLine.c_str(), "%f", &fTemp);
183  aJointOffsets.at(4).push_back(fTemp);
184 
185 
186  // read fingertip points
187 
188  int nNumFingertipPoints;
189  sLine = GetNextNonCommentLine(sFileStream);
190  sscanf(sLine.c_str(), "%d", &nNumFingertipPoints);
191 
192  float fFingerTipOffsetZ;
193  sLine = GetNextNonCommentLine(sFileStream);
194  sscanf(sLine.c_str(), "%f", &fFingerTipOffsetZ);
195 
196 
197  std::vector<Vec3d> aFingertipPoints;
198  sLine = GetNextNonCommentLine(sFileStream);
199  for (int i = 0; i < nNumFingertipPoints; i++)
200  {
201  sscanf(sLine.c_str(), "%f %f %f", &vTemp.x, &vTemp.y, &vTemp.z);
202  vTemp.z += fFingerTipOffsetZ;
203  aFingertipPoints.push_back(vTemp);
204  std::getline(sFileStream, sLine);
205  }
206 
207 
208  // tracking ball
209  sLine = GetNextNonCommentLine(sFileStream);
210  sscanf(sLine.c_str(), "%f %f %f", &m_vTrackingBallOffset.x, &m_vTrackingBallOffset.y, &m_vTrackingBallOffset.z);
211  sLine = GetNextNonCommentLine(sFileStream);
212  sscanf(sLine.c_str(), "%f", &m_fTrackingBallRadius);
213 
214 
215 
216  //****************************************
217  // construct fingers
218  //****************************************
219 
220  // thumb
221  std::vector<Vec3d> aFingertipPointsThumb;
222  aFingertipPointsThumb.resize(nNumFingertipPoints);
223  for (int i = 0; i < nNumFingertipPoints; i++)
224  {
225  Math3d::SetVec(aFingertipPointsThumb.at(i), -aFingertipPoints.at(i).x, aFingertipPoints.at(i).y, aFingertipPoints.at(i).z);
226  }
227  CFinger* pNewFinger = new CFinger(aJointOffsets.at(0), aFingertipPointsThumb);
228  m_aFingers.push_back(pNewFinger);
229 
230  // other fingers
231  for (int i = 1; i <= 4; i++)
232  {
233  pNewFinger = new CFinger(aJointOffsets.at(i), aFingertipPoints);
234  m_aFingers.push_back(pNewFinger);
235  }
236 
237 
238 
239  //****************************************
240  // init variables
241  //****************************************
242 
243  m_aFingerJointsInWorldCS.resize(5);
244  for (int i = 0; i < 5; i++)
245  {
246  m_aFingerJointsInWorldCS.at(i).resize(m_aFingers.at(i)->m_aFingerJointsInFingerBaseCS.size());
247  for (size_t j = 0; j < m_aFingerJointsInWorldCS.at(i).size(); j++)
248  {
249  Math3d::SetVec(m_aFingerJointsInWorldCS.at(i).at(j), Math3d::zero_vec);
250  }
251  }
252 
254  for (int i = 0; i < 5; i++)
255  {
256  m_aFingerTipCornersInWorldCS.at(i).resize(m_aFingers.at(i)->m_aFingerTipCornersInFingerBaseCS.size());
257  for (size_t j = 0; j < m_aFingerTipCornersInWorldCS.at(i).size(); j++)
258  {
259  Math3d::SetVec(m_aFingerTipCornersInWorldCS.at(i).at(j), Math3d::zero_vec);
260  }
261  }
262 
263  m_aFingerTipPolygonsLeftCam.resize(5);
265 
266  m_fPalmJointAngle = 0;
267  Math3d::SetVec(m_vHandPosition, Math3d::zero_vec);
268  Math3d::SetMat(m_mHandOrientation, Math3d::unit_mat);
269  }
270 
271 
272 
273 
274  std::string CHandModelV2::GetNextNonCommentLine(std::ifstream& sFileStream)
275  {
276  std::string sLine;
277 
278  do
279  {
280  std::getline(sFileStream, sLine);
281  }
282  while (sLine.at(0) == '#');
283 
284  return sLine;
285  }
286 
287 
288 
289 
290  void CHandModelV2::UpdateHand(Vec3d vHandPosition, Mat3d mHandOrientation, float fPalmJointAngle, std::vector<std::vector<float> >& aFingerJointAngles)
291  {
292  Math3d::SetVec(m_vHandPosition, vHandPosition);
293  Math3d::SetMat(m_mHandOrientation, mHandOrientation);
294 
295  m_fPalmJointAngle = fPalmJointAngle;
296 
297  for (size_t i = 0; i < m_aFingers.size(); i++)
298  {
299  m_aFingers.at(i)->UpdateJointAngles(aFingerJointAngles.at(i));
300  }
301 
302  Vec3d vOffsetToFingerBaseRotated, vTemp;
303 
304  // thumb
305  Math3d::MulMatVec(m_mHandOrientation, m_aOffsetsToFingers.at(0), vOffsetToFingerBaseRotated);
306  for (size_t i = 0; i < m_aFingers.at(0)->m_aFingerJointsInFingerBaseCS.size(); i++)
307  {
308  Math3d::MulMatVec(m_mHandOrientation, m_aFingers.at(0)->m_aFingerJointsInFingerBaseCS.at(i), vOffsetToFingerBaseRotated, vTemp);
309  Math3d::AddVecVec(vTemp, m_vHandPosition, m_aFingerJointsInWorldCS.at(0).at(i));
310  }
311  for (size_t i = 0; i < m_aFingers.at(0)->m_aFingerTipCornersInFingerBaseCS.size(); i++)
312  {
313  Math3d::MulMatVec(m_mHandOrientation, m_aFingers.at(0)->m_aFingerTipCornersInFingerBaseCS.at(i), vOffsetToFingerBaseRotated, vTemp);
314  Math3d::AddVecVec(vTemp, m_vHandPosition, m_aFingerTipCornersInWorldCS.at(0).at(i));
315  }
316 
317  // other fingers
318  Mat3d mPalmJointRotation, mAbsoluteRotationAfterPalmJoint;
319  Math3d::SetRotationMatY(mPalmJointRotation, m_fPalmJointAngle);
320  Math3d::MulMatMat(m_mHandOrientation, mPalmJointRotation, mAbsoluteRotationAfterPalmJoint);
321 
322  for (int j = 1; j <= 4; j++)
323  {
324  Math3d::MulMatVec(mAbsoluteRotationAfterPalmJoint, m_aOffsetsToFingers.at(j), vOffsetToFingerBaseRotated);
325  for (size_t i = 0; i < m_aFingers.at(j)->m_aFingerJointsInFingerBaseCS.size(); i++)
326  {
327  Math3d::MulMatVec(mAbsoluteRotationAfterPalmJoint, m_aFingers.at(j)->m_aFingerJointsInFingerBaseCS.at(i), vOffsetToFingerBaseRotated, vTemp);
328  Math3d::AddVecVec(vTemp, m_vHandPosition, m_aFingerJointsInWorldCS.at(j).at(i));
329  }
330 
331  for (size_t i = 0; i < m_aFingers.at(j)->m_aFingerTipCornersInFingerBaseCS.size(); i++)
332  {
333  Math3d::MulMatVec(mAbsoluteRotationAfterPalmJoint, m_aFingers.at(j)->m_aFingerTipCornersInFingerBaseCS.at(i), vOffsetToFingerBaseRotated, vTemp);
334  Math3d::AddVecVec(vTemp, m_vHandPosition, m_aFingerTipCornersInWorldCS.at(j).at(i));
335  }
336  }
337 
338 
339  // project the fingertips and calculate convex polygons
341 
342 
343  // tracking ball
344  Vec3d vTrackingBallPositionInWorldCS;
345  Math3d::MulMatVec(m_mHandOrientation, m_vTrackingBallOffset, m_vHandPosition, vTrackingBallPositionInWorldCS);
346 
347  m_pStereoCalibration->GetLeftCalibration()->WorldToImageCoordinates(vTrackingBallPositionInWorldCS, m_vTrackingBallPosLeftCam, false);
348  float fFocalLengthLeft = 0.5f * (m_pStereoCalibration->GetLeftCalibration()->GetCameraParameters().focalLength.x + m_pStereoCalibration->GetLeftCalibration()->GetCameraParameters().focalLength.y);
349  m_fTrackingBallRadiusLeftCam = fFocalLengthLeft * m_fTrackingBallRadius / vTrackingBallPositionInWorldCS.z;
350 
351  m_pStereoCalibration->GetRightCalibration()->WorldToImageCoordinates(vTrackingBallPositionInWorldCS, m_vTrackingBallPosRightCam, false);
352  float fFocalLengthRight = 0.5f * (m_pStereoCalibration->GetRightCalibration()->GetCameraParameters().focalLength.x + m_pStereoCalibration->GetRightCalibration()->GetCameraParameters().focalLength.y);
353  m_fTrackingBallRadiusRightCam = fFocalLengthRight * m_fTrackingBallRadius / vTrackingBallPositionInWorldCS.z;
354  }
355 
356 
357 
358  void CHandModelV2::UpdateHand(double* pConfig)
359  {
360  Vec3d vHandPosition = {(float)pConfig[0], (float)pConfig[1], (float) pConfig[2]};
361  Mat3d mHandOrientation;
362  Math3d::SetRotationMat(mHandOrientation, pConfig[3], pConfig[4], pConfig[5]);
363 
364  float fPalmJointAngle = -pConfig[6];
365 
366  std::vector<std::vector<float> > aFingerJointAngles;
367  aFingerJointAngles.resize(5);
368  aFingerJointAngles.at(0).push_back(pConfig[7]);
369  aFingerJointAngles.at(0).push_back(pConfig[8]);
370  aFingerJointAngles.at(1).push_back(-pConfig[9]);
371  aFingerJointAngles.at(1).push_back(-pConfig[9]);
372  aFingerJointAngles.at(2).push_back(-pConfig[10]);
373  aFingerJointAngles.at(2).push_back(-pConfig[10]);
374  aFingerJointAngles.at(3).push_back(-pConfig[11]);
375  aFingerJointAngles.at(3).push_back(-pConfig[11]);
376  aFingerJointAngles.at(4).push_back(-pConfig[11]);
377  aFingerJointAngles.at(4).push_back(-pConfig[11]);
378 
379  UpdateHand(vHandPosition, mHandOrientation, fPalmJointAngle, aFingerJointAngles);
380  }
381 
382 
383 
384 
385 
387  {
388  Vec2d vPos2D;
389 
390  Vec3d* pBuffer1 = new Vec3d[DSHT_MAX_POLYGON_CORNERS + 1];
391  Vec3d* pBuffer2 = new Vec3d[DSHT_MAX_POLYGON_CORNERS + 1];
392 
393  for (int i = 0; i < DSHT_NUM_FINGERS; i++)
394  {
395  Math3d::SetVec(m_aFingerTipPolygonsLeftCam.at(i).center3d, Math3d::zero_vec);
396  Math3d::SetVec(m_aFingerTipPolygonsRightCam.at(i).center3d, Math3d::zero_vec);
397 
398  for (size_t j = 0; j < m_aFingerTipCornersInWorldCS.at(i).size(); j++)
399  {
400  Vec3d& vPoint = m_aFingerTipCornersInWorldCS.at(i).at(j);
401  m_pStereoCalibration->GetLeftCalibration()->WorldToImageCoordinates(vPoint, vPos2D, false);
402  m_aFingerTipPolygonsLeftCam.at(i).hull[j].x = vPos2D.x;
403  m_aFingerTipPolygonsLeftCam.at(i).hull[j].y = vPos2D.y;
404  Math3d::AddToVec(vPoint, m_aFingerTipPolygonsLeftCam.at(i).center3d);
405  m_pStereoCalibration->GetRightCalibration()->WorldToImageCoordinates(vPoint, vPos2D, false);
406  m_aFingerTipPolygonsRightCam.at(i).hull[j].x = vPos2D.x;
407  m_aFingerTipPolygonsRightCam.at(i).hull[j].y = vPos2D.y;
408  Math3d::AddToVec(vPoint, m_aFingerTipPolygonsRightCam.at(i).center3d);
409  }
410 
411  Math3d::MulVecScalar(m_aFingerTipPolygonsLeftCam.at(i).center3d, 1.0f / m_aFingerTipCornersInWorldCS.at(i).size(), m_aFingerTipPolygonsLeftCam.at(i).center3d);
412  Math3d::MulVecScalar(m_aFingerTipPolygonsRightCam.at(i).center3d, 1.0f / m_aFingerTipCornersInWorldCS.at(i).size(), m_aFingerTipPolygonsRightCam.at(i).center3d);
413 
414  m_aFingerTipPolygonsLeftCam.at(i).nCorners = m_aFingerTipCornersInWorldCS.at(i).size();
416  m_aFingerTipPolygonsRightCam.at(i).nCorners = m_aFingerTipCornersInWorldCS.at(i).size();
418  }
419 
420  delete[] pBuffer1;
421  delete[] pBuffer2;
422  }
423 }
424 
DSHT_MAX_POLYGON_CORNERS
#define DSHT_MAX_POLYGON_CORNERS
Definition: HandLocalisationConstants.h:46
visionx::CHandModelV2::CFinger
Definition: HandModelV2.h:43
visionx
ArmarX headers.
Definition: OpenPoseStressTest.h:38
visionx::CHandModelV2::m_fPalmJointAngle
float m_fPalmJointAngle
Definition: HandModelV2.h:87
GfxTL::Vec2d
VectorXD< 2, double > Vec2d
Definition: VectorXD.h:694
visionx::CHandModelV2::m_pStereoCalibration
CStereoCalibration * m_pStereoCalibration
Definition: HandModelV2.h:83
visionx::CHandModelV2::m_aFingerTipPolygonsRightCam
std::vector< ConvexPolygonCalculations::Polygon > m_aFingerTipPolygonsRightCam
Definition: HandModelV2.h:71
visionx::CHandModelV2::m_vTrackingBallPosRightCam
Vec2d m_vTrackingBallPosRightCam
Definition: HandModelV2.h:73
visionx::CHandModelV2::m_aFingers
std::vector< CFinger * > m_aFingers
Definition: HandModelV2.h:85
visionx::CHandModelV2::CFinger::UpdateJointAngles
void UpdateJointAngles(std::vector< float > aNewJointValues)
Definition: HandModelV2.cpp:57
visionx::CHandModelV2::m_aFingerJointsInWorldCS
std::vector< std::vector< Vec3d > > m_aFingerJointsInWorldCS
Definition: HandModelV2.h:65
visionx::CHandModelV2::m_vTrackingBallOffset
Vec3d m_vTrackingBallOffset
Definition: HandModelV2.h:89
GfxTL::Vec3d
VectorXD< 3, double > Vec3d
Definition: VectorXD.h:695
visionx::CHandModelV2::m_vHandPosition
Vec3d m_vHandPosition
Definition: HandModelV2.h:68
visionx::CHandModelV2::CFinger::m_aFingerTipCornersInFingerBaseCS
std::vector< Vec3d > m_aFingerTipCornersInFingerBaseCS
Definition: HandModelV2.h:50
visionx::CHandModelV2::CFinger::m_aFingerJointsInFingerBaseCS
std::vector< Vec3d > m_aFingerJointsInFingerBaseCS
Definition: HandModelV2.h:51
visionx::CHandModelV2::GetNextNonCommentLine
std::string GetNextNonCommentLine(std::ifstream &sFileStream)
Definition: HandModelV2.cpp:274
visionx::CHandModelV2::m_vTrackingBallPosLeftCam
Vec2d m_vTrackingBallPosLeftCam
Definition: HandModelV2.h:73
ARMARX_WARNING_S
#define ARMARX_WARNING_S
Definition: Logging.h:206
visionx::CHandModelV2::CalcProjectedPolygons
void CalcProjectedPolygons()
Definition: HandModelV2.cpp:386
visionx::CHandModelV2::m_aFingerTipCornersInWorldCS
std::vector< std::vector< Vec3d > > m_aFingerTipCornersInWorldCS
Definition: HandModelV2.h:66
visionx::CHandModelV2::m_aOffsetsToFingers
std::vector< Vec3d > m_aOffsetsToFingers
Definition: HandModelV2.h:86
HandModelV2.h
visionx::CHandModelV2::m_fTrackingBallRadiusLeftCam
float m_fTrackingBallRadiusLeftCam
Definition: HandModelV2.h:74
visionx::CHandModelV2::CFinger::CFinger
CFinger(std::vector< float > aJointOffsets, std::vector< Vec3d > aFingerTipCorners)
Definition: HandModelV2.cpp:36
visionx::CHandModelV2::m_mHandOrientation
Mat3d m_mHandOrientation
Definition: HandModelV2.h:69
float
#define float
Definition: 16_Level.h:22
visionx::CHandModelV2::m_fTrackingBallRadius
float m_fTrackingBallRadius
Definition: HandModelV2.h:90
DSHT_NUM_FINGERS
#define DSHT_NUM_FINGERS
Definition: HandLocalisationConstants.h:39
visionx::CHandModelV2::m_fTrackingBallRadiusRightCam
float m_fTrackingBallRadiusRightCam
Definition: HandModelV2.h:74
Logging.h
visionx::ConvexPolygonCalculations::CalcConvexHull
void CalcConvexHull(Vec3d *in, int num_all_points, Vec3d *hull_left, int *num_hull_points_left, Vec3d *hull_right, int *num_hull_points_right, Vec3d *temp1, Vec3d *temp2)
Definition: Polygon.cpp:134
visionx::CHandModelV2::UpdateHand
virtual void UpdateHand(double *pConfig)
Definition: HandModelV2.cpp:358
visionx::CHandModelV2::m_aFingerTipPolygonsLeftCam
std::vector< ConvexPolygonCalculations::Polygon > m_aFingerTipPolygonsLeftCam
Definition: HandModelV2.h:71
visionx::CHandModelV2::CHandModelV2
CHandModelV2()
Definition: HandModelV2.h:77