예제 #1
0
bool Detect::getGesture(std::string& ret)
{
	if(false == LeapController->isConnected())
	{
		return false;
	}
	HandList HL = LeapController->frame().hands();
	Hand     hand = HL[0];
	FingerList fingers = hand.fingers();
	GestureModel * gm = new GestureModel;
	Leap::Matrix handTransform = hand.basis();
	handTransform.origin = hand.palmPosition();
	handTransform = handTransform.rigidInverse();
	//get gesture data
	int i = 0;
	for (FingerList::const_iterator fl = fingers.begin(); fl != fingers.end(); ++fl) {
		const Finger finger = *fl;
		// Get finger bones
		for (int b = 0; b < 4; ++b) {
			Bone::Type boneType = static_cast<Bone::Type>(b);
			Bone bone = finger.bone(boneType);
			Leap::Vector ori = bone.prevJoint();
			Leap::Vector tP = handTransform.transformPoint(ori);
			gm->GestureData[i][b][0][0] = tP[0];
			gm->GestureData[i][b][0][1] = tP[1];
			gm->GestureData[i][b][0][2] = tP[2];
			tP = handTransform.transformPoint(bone.nextJoint());
			gm->GestureData[i][b][1][0] = tP[0];
			gm->GestureData[i][b][1][1] = tP[1];
			gm->GestureData[i][b][1][2] = tP[2];
			tP = handTransform.transformPoint(bone.direction());
			gm->GestureData[i][b][2][0] = gm->GestureData[i][b][1][0] - gm->GestureData[i][b][0][0];
			gm->GestureData[i][b][2][1] = gm->GestureData[i][b][1][1] - gm->GestureData[i][b][0][1];
			gm->GestureData[i][b][2][2] = gm->GestureData[i][b][1][2] - gm->GestureData[i][b][0][2];
		}
		i++;
	}

	//compare
	for (int index = 0; index < GestureList.size(); index++)
	{
		if (true == compareGesture(GestureList[index], gm))
		{
			ret = GestureList[index]->GestureName;
			return true;
		}
	}
	ret = " ";
	return false;
}
예제 #2
0
//--------------------------------------------------------------
void testApp::recordArmXML (Hand & hand){
	
	if (bRecordingThisFrame){
		Arm arm = hand.arm();
		if (arm.isValid()){
			
			float armWidth = arm.width();
			XML.setValue("AW", armWidth, lastTagNumber);
			
			ofPoint palmPt   = leap.getofPoint ( hand.palmPosition());
			ofPoint wristPt  = leap.getofPoint ( arm.wristPosition());
			ofPoint elbowPt  = leap.getofPoint ( arm.elbowPosition());
			ofPoint palmNorm = leap.getofPoint ( hand.palmNormal());
			
			int palmPtTagNum = XML.addTag("PM");
			XML.setValue("PM:X", palmPt.x, palmPtTagNum);
			XML.setValue("PM:Y", palmPt.y, palmPtTagNum);
			XML.setValue("PM:Z", palmPt.z, palmPtTagNum);
			
			int wristPtTagNum = XML.addTag("W");
			XML.setValue("W:X", wristPt.x, wristPtTagNum);
			XML.setValue("W:Y", wristPt.y, wristPtTagNum);
			XML.setValue("W:Z", wristPt.z, wristPtTagNum);
			
			int elbowPtTagNum = XML.addTag("E");
			XML.setValue("E:X", elbowPt.x, elbowPtTagNum);
			XML.setValue("E:Y", elbowPt.y, elbowPtTagNum);
			XML.setValue("E:Z", elbowPt.z, elbowPtTagNum);
			
			int palmNormTagNum = XML.addTag("PN");
			XML.setValue("PN:X", palmNorm.x, palmNormTagNum);
			XML.setValue("PN:Y", palmNorm.y, palmNormTagNum);
			XML.setValue("PN:Z", palmNorm.z, palmNormTagNum);
			
			
			//---------------
			// Export the hand basis matrix
			Leap::Matrix handMatrix = hand.basis();
			ofPoint handBasisX = leap.getofPoint( handMatrix.xBasis);
			ofPoint handBasisY = leap.getofPoint( handMatrix.yBasis);
			ofPoint handBasisZ = leap.getofPoint( handMatrix.zBasis);
			
			int handMatrixTagNum = XML.addTag("HM");
			if( XML.pushTag("HM", handMatrixTagNum) ){
				
				XML.setValue("XX", handBasisX.x, handMatrixTagNum);
				XML.setValue("XY", handBasisX.y, handMatrixTagNum);
				XML.setValue("XZ", handBasisX.z, handMatrixTagNum);
				
				XML.setValue("YX", handBasisY.x, handMatrixTagNum);
				XML.setValue("YY", handBasisY.y, handMatrixTagNum);
				XML.setValue("YZ", handBasisY.z, handMatrixTagNum);
				
				XML.setValue("ZX", handBasisZ.x, handMatrixTagNum);
				XML.setValue("ZY", handBasisZ.y, handMatrixTagNum);
				XML.setValue("ZZ", handBasisZ.z, handMatrixTagNum);
				
				XML.popTag(); // pop HM (Hand Matrix)
			}
			
			//---------------
			// Export the arm basis matrix
			Leap::Matrix armMatrix = arm.basis();
			ofPoint armBasisX = leap.getofPoint( armMatrix.xBasis);
			ofPoint armBasisY = leap.getofPoint( armMatrix.yBasis);
			ofPoint armBasisZ = leap.getofPoint( armMatrix.zBasis);
			
			int armMatrixTagNum = XML.addTag("AM");
			if( XML.pushTag("AM", armMatrixTagNum) ){
				
				XML.setValue("XX", armBasisX.x, armMatrixTagNum);
				XML.setValue("XY", armBasisX.y, armMatrixTagNum);
				XML.setValue("XZ", armBasisX.z, armMatrixTagNum);
				
				XML.setValue("YX", armBasisY.x, armMatrixTagNum);
				XML.setValue("YY", armBasisY.y, armMatrixTagNum);
				XML.setValue("YZ", armBasisY.z, armMatrixTagNum);
				
				XML.setValue("ZX", armBasisZ.x, armMatrixTagNum);
				XML.setValue("ZY", armBasisZ.y, armMatrixTagNum);
				XML.setValue("ZZ", armBasisZ.z, armMatrixTagNum);
				
				XML.popTag(); // pop AM (Arm Matrix)
			}
			
		}
	}
}
예제 #3
0
//--------------------------------------------------------------
void LeapVisualizer::drawArm (Hand & hand,ofxLeapMotion & leap){
	
	// Draw the wrist and elbow points.
	Arm arm = hand.arm();
	if (arm.isValid()){
		
		ofPoint handPt   = leap.getofPoint ( hand.palmPosition());
		ofPoint handNorm = leap.getofPoint ( hand.palmNormal());
		ofPoint wristPt  = leap.getofPoint ( arm.wristPosition());
		ofPoint elbowPt  = leap.getofPoint ( arm.elbowPosition());
		
		float basisLen = 50.0;
		
		
		if (bDrawSimple){
			ofSetColor(ofColor::white);
			ofDrawSphere(handPt,  8.0);
			ofDrawSphere(wristPt, 8.0);
			ofDrawSphere(elbowPt, 8.0);
			
			ofLine(handPt, wristPt);
			ofLine(wristPt, elbowPt);
			ofLine(handPt, handPt+ basisLen*handNorm);
			ofDrawSphere(handPt+ basisLen*handNorm, 2.0);
			
			// draw the rotation vectors of the hand.
			{
				Leap::Matrix handMatrix = hand.basis();
				ofPoint handBasisX = leap.getofPoint( handMatrix.xBasis);
				ofPoint handBasisY = leap.getofPoint( handMatrix.yBasis);
				ofPoint handBasisZ = leap.getofPoint( handMatrix.zBasis);
				
				glLineWidth(2.0);
				ofSetColor(ofColor::red  );	ofLine(handPt, handPt + basisLen*handBasisX);
				ofSetColor(ofColor::green);	ofLine(handPt, handPt + basisLen*handBasisY);
				ofSetColor(ofColor::blue );	ofLine(handPt, handPt + basisLen*handBasisZ);
				glLineWidth(1.0);
				
				// draw the identity of the hand (left or right)
				string whichHandString = "RIGHT";
				if (hand.isLeft()){
					whichHandString = "LEFT";
				}
				// float handConfidence = hand.confidence();
				// whichHandString += " " + ofToString(handConfidence);
				
				ofSetColor(ofColor::white);
				ofDrawBitmapString(whichHandString, (handPt + (basisLen*1.2)*handBasisY));
			}
			
			// draw the rotation vectors of the arm.
			{
				Leap::Matrix armMatrix = arm.basis();
				ofPoint armBasisX = leap.getofPoint( armMatrix.xBasis);
				ofPoint armBasisY = leap.getofPoint( armMatrix.yBasis);
				ofPoint armBasisZ = leap.getofPoint( armMatrix.zBasis);
				
				glLineWidth(2.0);
				ofSetColor(ofColor::red  );	ofLine(wristPt, wristPt + basisLen*armBasisX);
				ofSetColor(ofColor::green);	ofLine(wristPt, wristPt + basisLen*armBasisY);
				ofSetColor(ofColor::blue );	ofLine(wristPt, wristPt + basisLen*armBasisZ);
				glLineWidth(1.0);
			}
			
		} else {
			
			// Draw a cylinder between two points, properly oriented in space.
			float armWidth = arm.width();
			float dx = wristPt.x - elbowPt.x;
			float dy = wristPt.y - elbowPt.y;
			float dz = wristPt.z - elbowPt.z;
			float dh = sqrt(dx*dx + dy*dy + dz*dz);
			
			ofPushMatrix();
			{
				ofTranslate( (elbowPt.x+wristPt.x)/2, (elbowPt.y+wristPt.y)/2, (elbowPt.z+wristPt.z)/2 );
				
				float theta =   90 - RAD_TO_DEG * asin(dz/dh);
				float phi   =        RAD_TO_DEG * atan2(dy,dx);
				ofRotate(phi,   0,0,1);
				ofRotate(theta, 0,1,0);
				ofRotate(90,	1,0,0);
				
				// Get the arm Matrix, which provides its orthogonal basis vectors.
				Leap::Matrix armMatrix = arm.basis();
				ofPoint armBasisY = leap.getofPoint( armMatrix.yBasis);
				float ax = armBasisY.x;
				float ay = armBasisY.y;
				float az = armBasisY.z;
				
				// Compute the longitudinal rotation of the arm.
				// Sheesh, I really need to learn 3D matrix math.
				ofNode armBasisYNode;
				armBasisYNode.setPosition(armBasisY);
				armBasisYNode.rotateAround(0-   phi, ofVec3f(0,0,1), ofVec3f(0,0,0));
				armBasisYNode.rotateAround(0- theta, ofVec3f(0,1,0), ofVec3f(0,0,0));
				armBasisYNode.rotateAround(0-    90, ofVec3f(1,0,0), ofVec3f(0,0,0));
				ofPoint newArmBasisY = armBasisYNode.getPosition();
				float armRotation = RAD_TO_DEG * atan2f(newArmBasisY.z, newArmBasisY.x);
				
				ofPushMatrix();
				{
					ofRotate(armRotation, 0,-1,0);
					float armThicknessRatio = 0.6;
					glScalef(armThicknessRatio, 1.0, 1.0);
					ofSetColor(ofColor::magenta);
					
					// Oblate arm cylinder
					ofDrawCylinder (armWidth/2.0, dh);
					
					// Wrist endcap
					ofPushMatrix();
					ofTranslate(ofPoint(0, dh/2,0));
					glScalef(1.0, armThicknessRatio, 1.0);
					ofDrawSphere(armWidth/2.0);
					ofPopMatrix();
					
					// Elbow endcap
					ofPushMatrix();
					ofTranslate(ofPoint(0, -dh/2,0));
					glScalef(1.0, armThicknessRatio, 1.0);
					ofDrawSphere(armWidth/2.0);
					ofPopMatrix();
					
				} // Close popMatrix
				ofPopMatrix();
			} // Close popMatrix
			ofPopMatrix();
		} // Close if !drawSimple
	} // Close if arm isValid
}