35 std::vector<Vec3d> aFingerTipCorners)
37 for (
size_t i = 0; i < aJointOffsets.size(); i++)
39 m_aJointOffsets.push_back(aJointOffsets.at(i));
40 m_aJointAngles.push_back(0);
45 for (
size_t i = 0; i < aFingerTipCorners.size(); i++)
47 m_aFingerTipCornersInLocalCS.push_back(aFingerTipCorners.at(i));
58 Mat3d mRotLocal, mRotGlobal = Math3d::unit_mat;
59 Vec3d vTemp = Math3d::zero_vec;
62 const size_t n = (m_aJointAngles.size() <= aNewJointValues.size()) ? m_aJointAngles.size()
63 : aNewJointValues.size();
64 for (
size_t i = 0; i <
n; i++)
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,
72 m_aFingerJointsInFingerBaseCS.at(i),
73 m_aFingerJointsInFingerBaseCS.at(i + 1));
76 Vec3d vFingerTipPosition = m_aFingerJointsInFingerBaseCS.at(m_aJointAngles.size());
77 for (
size_t i = 0; i < m_aFingerTipCornersInLocalCS.size(); i++)
79 Math3d::MulMatVec(mRotGlobal,
80 m_aFingerTipCornersInLocalCS.at(i),
82 m_aFingerTipCornersInFingerBaseCS.at(i));
94 std::ifstream sFileStream(sConfigFileName.c_str(), std::ifstream::in);
95 if (!sFileStream.good())
98 <<
" could not be opened";
102 setlocale(LC_NUMERIC,
"C");
107 std::vector<std::vector<float>> aJointOffsets;
108 aJointOffsets.resize(5);
112 sscanf(sLine.c_str(),
"%f %f %f", &vTemp.x, &vTemp.y, &vTemp.z);
117 sscanf(sLine.c_str(),
"%f", &fTemp);
118 aJointOffsets.at(0).push_back(fTemp);
122 sscanf(sLine.c_str(),
"%f", &fTemp);
123 aJointOffsets.at(0).push_back(fTemp);
128 sscanf(sLine.c_str(),
"%f %f %f", &vTemp.x, &vTemp.y, &vTemp.z);
133 sscanf(sLine.c_str(),
"%f", &fTemp);
134 aJointOffsets.at(1).push_back(fTemp);
138 sscanf(sLine.c_str(),
"%f", &fTemp);
139 aJointOffsets.at(1).push_back(fTemp);
144 sscanf(sLine.c_str(),
"%f %f %f", &vTemp.x, &vTemp.y, &vTemp.z);
149 sscanf(sLine.c_str(),
"%f", &fTemp);
150 aJointOffsets.at(2).push_back(fTemp);
154 sscanf(sLine.c_str(),
"%f", &fTemp);
155 aJointOffsets.at(2).push_back(fTemp);
160 sscanf(sLine.c_str(),
"%f %f %f", &vTemp.x, &vTemp.y, &vTemp.z);
165 sscanf(sLine.c_str(),
"%f", &fTemp);
166 aJointOffsets.at(3).push_back(fTemp);
170 sscanf(sLine.c_str(),
"%f", &fTemp);
171 aJointOffsets.at(3).push_back(fTemp);
176 sscanf(sLine.c_str(),
"%f %f %f", &vTemp.x, &vTemp.y, &vTemp.z);
181 sscanf(sLine.c_str(),
"%f", &fTemp);
182 aJointOffsets.at(4).push_back(fTemp);
186 sscanf(sLine.c_str(),
"%f", &fTemp);
187 aJointOffsets.at(4).push_back(fTemp);
192 int nNumFingertipPoints;
194 sscanf(sLine.c_str(),
"%d", &nNumFingertipPoints);
196 float fFingerTipOffsetZ;
198 sscanf(sLine.c_str(),
"%f", &fFingerTipOffsetZ);
201 std::vector<Vec3d> aFingertipPoints;
203 for (
int i = 0; i < nNumFingertipPoints; i++)
205 sscanf(sLine.c_str(),
"%f %f %f", &vTemp.x, &vTemp.y, &vTemp.z);
206 vTemp.z += fFingerTipOffsetZ;
207 aFingertipPoints.push_back(vTemp);
208 std::getline(sFileStream, sLine);
214 sscanf(sLine.c_str(),
228 std::vector<Vec3d> aFingertipPointsThumb;
229 aFingertipPointsThumb.resize(nNumFingertipPoints);
230 for (
int i = 0; i < nNumFingertipPoints; i++)
232 Math3d::SetVec(aFingertipPointsThumb.at(i),
233 -aFingertipPoints.at(i).x,
234 aFingertipPoints.at(i).y,
235 aFingertipPoints.at(i).z);
237 CFinger* pNewFinger =
new CFinger(aJointOffsets.at(0), aFingertipPointsThumb);
241 for (
int i = 1; i <= 4; i++)
243 pNewFinger =
new CFinger(aJointOffsets.at(i), aFingertipPoints);
253 for (
int i = 0; i < 5; i++)
256 m_aFingers.at(i)->m_aFingerJointsInFingerBaseCS.size());
264 for (
int i = 0; i < 5; i++)
267 m_aFingers.at(i)->m_aFingerTipCornersInFingerBaseCS.size());
289 std::getline(sFileStream, sLine);
290 }
while (sLine.at(0) ==
'#');
297 Mat3d mHandOrientation,
298 float fPalmJointAngle,
299 std::vector<std::vector<float>>& aFingerJointAngles)
306 for (
size_t i = 0; i <
m_aFingers.size(); i++)
308 m_aFingers.at(i)->UpdateJointAngles(aFingerJointAngles.at(i));
311 Vec3d vOffsetToFingerBaseRotated, vTemp;
316 for (
size_t i = 0; i <
m_aFingers.at(0)->m_aFingerJointsInFingerBaseCS.size(); i++)
319 m_aFingers.at(0)->m_aFingerJointsInFingerBaseCS.at(i),
320 vOffsetToFingerBaseRotated,
324 for (
size_t i = 0; i <
m_aFingers.at(0)->m_aFingerTipCornersInFingerBaseCS.size(); i++)
327 m_aFingers.at(0)->m_aFingerTipCornersInFingerBaseCS.at(i),
328 vOffsetToFingerBaseRotated,
334 Mat3d mPalmJointRotation, mAbsoluteRotationAfterPalmJoint;
336 Math3d::MulMatMat(
m_mHandOrientation, mPalmJointRotation, mAbsoluteRotationAfterPalmJoint);
338 for (
int j = 1; j <= 4; j++)
340 Math3d::MulMatVec(mAbsoluteRotationAfterPalmJoint,
342 vOffsetToFingerBaseRotated);
343 for (
size_t i = 0; i <
m_aFingers.at(j)->m_aFingerJointsInFingerBaseCS.size(); i++)
345 Math3d::MulMatVec(mAbsoluteRotationAfterPalmJoint,
346 m_aFingers.at(j)->m_aFingerJointsInFingerBaseCS.at(i),
347 vOffsetToFingerBaseRotated,
352 for (
size_t i = 0; i <
m_aFingers.at(j)->m_aFingerTipCornersInFingerBaseCS.size(); i++)
354 Math3d::MulMatVec(mAbsoluteRotationAfterPalmJoint,
355 m_aFingers.at(j)->m_aFingerTipCornersInFingerBaseCS.at(i),
356 vOffsetToFingerBaseRotated,
368 Vec3d vTrackingBallPositionInWorldCS;
372 vTrackingBallPositionInWorldCS);
376 float fFocalLengthLeft =
385 float fFocalLengthRight =
396 Vec3d vHandPosition = {(
float)pConfig[0], (
float)pConfig[1], (
float)pConfig[2]};
397 Mat3d mHandOrientation;
398 Math3d::SetRotationMat(mHandOrientation, pConfig[3], pConfig[4], pConfig[5]);
400 float fPalmJointAngle = -pConfig[6];
402 std::vector<std::vector<float>> aFingerJointAngles;
403 aFingerJointAngles.resize(5);
404 aFingerJointAngles.at(0).push_back(pConfig[7]);
405 aFingerJointAngles.at(0).push_back(pConfig[8]);
406 aFingerJointAngles.at(1).push_back(-pConfig[9]);
407 aFingerJointAngles.at(1).push_back(-pConfig[9]);
408 aFingerJointAngles.at(2).push_back(-pConfig[10]);
409 aFingerJointAngles.at(2).push_back(-pConfig[10]);
410 aFingerJointAngles.at(3).push_back(-pConfig[11]);
411 aFingerJointAngles.at(3).push_back(-pConfig[11]);
412 aFingerJointAngles.at(4).push_back(-pConfig[11]);
413 aFingerJointAngles.at(4).push_back(-pConfig[11]);
415 UpdateHand(vHandPosition, mHandOrientation, fPalmJointAngle, aFingerJointAngles);
435 vPoint, vPos2D,
false);
440 vPoint, vPos2D,
false);