/// <summary>
/// Handle new skeleton data
/// </summary>
void CSkeletonBasics::ProcessSkeleton()
{
    NUI_SKELETON_FRAME skeletonFrame = {0};

    HRESULT hr = m_pNuiSensor->NuiSkeletonGetNextFrame(0, &skeletonFrame);
    if ( FAILED(hr) )
    {
        return;
    }

    // smooth out the skeleton data
    m_pNuiSensor->NuiTransformSmooth(&skeletonFrame, NULL);

    // Endure Direct2D is ready to draw
    hr = EnsureDirect2DResources( );
    if ( FAILED(hr) )
    {
        return;
    }

    m_pRenderTarget->BeginDraw();
    m_pRenderTarget->Clear( );
    
    RECT rct;
    GetClientRect( GetDlgItem( m_hWnd, IDC_VIDEOVIEW ), &rct);
    int width = rct.right;
    int height = rct.bottom;

    for (int i = 0 ; i < NUI_SKELETON_COUNT; ++i)
    {
        NUI_SKELETON_TRACKING_STATE trackingState = skeletonFrame.SkeletonData[i].eTrackingState;

        if (NUI_SKELETON_TRACKED == trackingState)
        {
            // We're tracking the skeleton, draw it
            DrawSkeleton(skeletonFrame.SkeletonData[i], width, height);
        }
        else if (NUI_SKELETON_POSITION_ONLY == trackingState)
        {
            // we've only received the center point of the skeleton, draw that
            D2D1_ELLIPSE ellipse = D2D1::Ellipse(
                SkeletonToScreen(skeletonFrame.SkeletonData[i].Position, width, height),
                g_JointThickness,
                g_JointThickness
                );

            m_pRenderTarget->DrawEllipse(ellipse, m_pBrushJointTracked);
        }
    }

    hr = m_pRenderTarget->EndDraw();

    // Device lost, need to recreate the render target
    // We'll dispose it now and retry drawing
    if (D2DERR_RECREATE_TARGET == hr)
    {
        hr = S_OK;
        DiscardDirect2DResources();
    }
}
/// <summary>
/// Draws a skeleton
/// </summary>
/// <param name="skel">skeleton to draw</param>
/// <param name="windowWidth">width (in pixels) of output buffer</param>
/// <param name="windowHeight">height (in pixels) of output buffer</param>
void CSkeletonBasics::DrawSkeleton(const NUI_SKELETON_DATA & skel, int windowWidth, int windowHeight)
{      
    int i;

    for (i = 0; i < NUI_SKELETON_POSITION_COUNT; ++i)
    {
        m_Points[i] = SkeletonToScreen(skel.SkeletonPositions[i], windowWidth, windowHeight);
    }

    // Render Torso
    DrawBone(skel, NUI_SKELETON_POSITION_HEAD, NUI_SKELETON_POSITION_SHOULDER_CENTER);
    DrawBone(skel, NUI_SKELETON_POSITION_SHOULDER_CENTER, NUI_SKELETON_POSITION_SHOULDER_LEFT);
    DrawBone(skel, NUI_SKELETON_POSITION_SHOULDER_CENTER, NUI_SKELETON_POSITION_SHOULDER_RIGHT);
    DrawBone(skel, NUI_SKELETON_POSITION_SHOULDER_CENTER, NUI_SKELETON_POSITION_SPINE);
    DrawBone(skel, NUI_SKELETON_POSITION_SPINE, NUI_SKELETON_POSITION_HIP_CENTER);
    DrawBone(skel, NUI_SKELETON_POSITION_HIP_CENTER, NUI_SKELETON_POSITION_HIP_LEFT);
    DrawBone(skel, NUI_SKELETON_POSITION_HIP_CENTER, NUI_SKELETON_POSITION_HIP_RIGHT);

    // Left Arm
    DrawBone(skel, NUI_SKELETON_POSITION_SHOULDER_LEFT, NUI_SKELETON_POSITION_ELBOW_LEFT);
    DrawBone(skel, NUI_SKELETON_POSITION_ELBOW_LEFT, NUI_SKELETON_POSITION_WRIST_LEFT);
    DrawBone(skel, NUI_SKELETON_POSITION_WRIST_LEFT, NUI_SKELETON_POSITION_HAND_LEFT);

    // Right Arm
    DrawBone(skel, NUI_SKELETON_POSITION_SHOULDER_RIGHT, NUI_SKELETON_POSITION_ELBOW_RIGHT);
    DrawBone(skel, NUI_SKELETON_POSITION_ELBOW_RIGHT, NUI_SKELETON_POSITION_WRIST_RIGHT);
    DrawBone(skel, NUI_SKELETON_POSITION_WRIST_RIGHT, NUI_SKELETON_POSITION_HAND_RIGHT);

    // Left Leg
    DrawBone(skel, NUI_SKELETON_POSITION_HIP_LEFT, NUI_SKELETON_POSITION_KNEE_LEFT);
    DrawBone(skel, NUI_SKELETON_POSITION_KNEE_LEFT, NUI_SKELETON_POSITION_ANKLE_LEFT);
    DrawBone(skel, NUI_SKELETON_POSITION_ANKLE_LEFT, NUI_SKELETON_POSITION_FOOT_LEFT);

    // Right Leg
    DrawBone(skel, NUI_SKELETON_POSITION_HIP_RIGHT, NUI_SKELETON_POSITION_KNEE_RIGHT);
    DrawBone(skel, NUI_SKELETON_POSITION_KNEE_RIGHT, NUI_SKELETON_POSITION_ANKLE_RIGHT);
    DrawBone(skel, NUI_SKELETON_POSITION_ANKLE_RIGHT, NUI_SKELETON_POSITION_FOOT_RIGHT);
    
    // Draw the joints in a different color
    for (i = 0; i < NUI_SKELETON_POSITION_COUNT; ++i)
    {
        D2D1_ELLIPSE ellipse = D2D1::Ellipse( m_Points[i], g_JointThickness, g_JointThickness );

        if ( skel.eSkeletonPositionTrackingState[i] == NUI_SKELETON_POSITION_INFERRED )
        {
            m_pRenderTarget->DrawEllipse(ellipse, m_pBrushJointInferred);
        }
        else if ( skel.eSkeletonPositionTrackingState[i] == NUI_SKELETON_POSITION_TRACKED )
        {
            m_pRenderTarget->DrawEllipse(ellipse, m_pBrushJointTracked);
        }
    }
}
예제 #3
0
파일: main.cpp 프로젝트: dtbinh/kinect
void drawKinectData() {
    glBindTexture(GL_TEXTURE_2D, textureId);
    getKinectData(data);
	getSkeletalData();
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, (GLvoid*)data);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_QUADS);
	glColor3f(1.f, 1.f, 1.f);
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f(0, 0, 0);
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f(width, 0, 0);
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f(width, height, 0.0f);
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f(0, height, 0.0f);
    glEnd();

	// Torso & Head
	const Vector4& hip = skeletonPosition[NUI_SKELETON_POSITION_HIP_CENTER];
	const Vector4& spn = skeletonPosition[NUI_SKELETON_POSITION_SPINE];
	const Vector4& shc = skeletonPosition[NUI_SKELETON_POSITION_SHOULDER_CENTER];
	const Vector4& head = skeletonPosition[NUI_SKELETON_POSITION_HEAD];
	// Left Arm etc
	const Vector4& lh = skeletonPosition[NUI_SKELETON_POSITION_HAND_LEFT];
	const Vector4& le = skeletonPosition[NUI_SKELETON_POSITION_ELBOW_LEFT];
	const Vector4& lw = skeletonPosition[NUI_SKELETON_POSITION_WRIST_LEFT];
	const Vector4& ls = skeletonPosition[NUI_SKELETON_POSITION_SHOULDER_LEFT];
	// Right Arm etc
	const Vector4& rh = skeletonPosition[NUI_SKELETON_POSITION_HAND_RIGHT];
	const Vector4& re = skeletonPosition[NUI_SKELETON_POSITION_ELBOW_RIGHT];
	const Vector4& rw = skeletonPosition[NUI_SKELETON_POSITION_WRIST_RIGHT];
	const Vector4& rs = skeletonPosition[NUI_SKELETON_POSITION_SHOULDER_RIGHT];
	// Left Leg etc
	const Vector4& lhip = skeletonPosition[NUI_SKELETON_POSITION_HIP_LEFT];
	const Vector4& lk = skeletonPosition[NUI_SKELETON_POSITION_KNEE_LEFT];
	const Vector4& la = skeletonPosition[NUI_SKELETON_POSITION_ANKLE_LEFT];
	const Vector4& lf = skeletonPosition[NUI_SKELETON_POSITION_FOOT_LEFT];
	// Right Leg etc
	const Vector4& rhip = skeletonPosition[NUI_SKELETON_POSITION_HIP_RIGHT];
	const Vector4& rk = skeletonPosition[NUI_SKELETON_POSITION_KNEE_RIGHT];
	const Vector4& ra = skeletonPosition[NUI_SKELETON_POSITION_ANKLE_RIGHT];
	const Vector4& rf = skeletonPosition[NUI_SKELETON_POSITION_FOOT_RIGHT];
	
	glLineWidth(20.0);
	glBegin(GL_LINES);
	glColor3f(1.f, 0.f, 0.f);

	if (testTracked){

		// Torso & Head
		if (hip.w == 1 && spn.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(hip)[0], SkeletonToScreen(hip)[1]);
			glVertex2f(SkeletonToScreen(spn)[0], SkeletonToScreen(spn)[1]);
		}
		if (spn.w == 1 && shc.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(spn)[0], SkeletonToScreen(spn)[1]);
			glVertex2f(SkeletonToScreen(shc)[0], SkeletonToScreen(shc)[1]);
		}
		if (shc.w == 1 && head.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(shc)[0], SkeletonToScreen(shc)[1]);
			glVertex2f(SkeletonToScreen(head)[0], SkeletonToScreen(head)[1]);
		}
		// Left Arm etc
		if (lh.w == 1 && lw.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(lh)[0], SkeletonToScreen(lh)[1]);
			glVertex2f(SkeletonToScreen(lw)[0], SkeletonToScreen(lw)[1]);
		}
		if (lw.w == 1 && le.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(lw)[0], SkeletonToScreen(lw)[1]);
			glVertex2f(SkeletonToScreen(le)[0], SkeletonToScreen(le)[1]);
		}
		if (le.w == 1 && ls.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(le)[0], SkeletonToScreen(le)[1]);
			glVertex2f(SkeletonToScreen(ls)[0], SkeletonToScreen(ls)[1]);
		}
		if (ls.w == 1 && shc.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(ls)[0], SkeletonToScreen(ls)[1]);
			glVertex2f(SkeletonToScreen(shc)[0], SkeletonToScreen(shc)[1]);
		}
		// Right Arm etc
		if (rh.w == 1 && rw.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(rh)[0], SkeletonToScreen(rh)[1]);
			glVertex2f(SkeletonToScreen(rw)[0], SkeletonToScreen(rw)[1]);
		}
		if (rw.w == 1 && re.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(rw)[0], SkeletonToScreen(rw)[1]);
			glVertex2f(SkeletonToScreen(re)[0], SkeletonToScreen(re)[1]);
		}
		if (re.w == 1 && rs.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(re)[0], SkeletonToScreen(re)[1]);
			glVertex2f(SkeletonToScreen(rs)[0], SkeletonToScreen(rs)[1]);
		}
		if (rs.w == 1 && shc.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(rs)[0], SkeletonToScreen(rs)[1]);
			glVertex2f(SkeletonToScreen(shc)[0], SkeletonToScreen(shc)[1]);
		}
		// Left Leg etc
		if (lf.w == 1 && la.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(lf)[0], SkeletonToScreen(lf)[1]);
			glVertex2f(SkeletonToScreen(la)[0], SkeletonToScreen(la)[1]);
		}
		if (la.w == 1 && lk.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(la)[0], SkeletonToScreen(la)[1]);
			glVertex2f(SkeletonToScreen(lk)[0], SkeletonToScreen(lk)[1]);
		}
		if (lk.w == 1 && lhip.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(lk)[0], SkeletonToScreen(lk)[1]);
			glVertex2f(SkeletonToScreen(lhip)[0], SkeletonToScreen(lhip)[1]);
		}
		if (lhip.w == 1 && hip.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(lhip)[0], SkeletonToScreen(lhip)[1]);
			glVertex2f(SkeletonToScreen(hip)[0], SkeletonToScreen(hip)[1]);
		}
		// Right Leg etc
		if (rf.w == 1 && ra.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(rf)[0], SkeletonToScreen(rf)[1]);
			glVertex2f(SkeletonToScreen(ra)[0], SkeletonToScreen(ra)[1]);
		}
		if (ra.w == 1 && rk.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(ra)[0], SkeletonToScreen(ra)[1]);
			glVertex2f(SkeletonToScreen(rk)[0], SkeletonToScreen(rk)[1]);
		}
		if (rk.w == 1 && rhip.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(rk)[0], SkeletonToScreen(rk)[1]);
			glVertex2f(SkeletonToScreen(rhip)[0], SkeletonToScreen(rhip)[1]);
		}
		if (rhip.w == 1 && hip.w == 1){ // checking to see if both points are tracked
			glVertex2f(SkeletonToScreen(rhip)[0], SkeletonToScreen(rhip)[1]);
			glVertex2f(SkeletonToScreen(hip)[0], SkeletonToScreen(hip)[1]);
		}
	}
	glEnd();

	// Leg angles and their output to screen.
	float fVal1 = 0;
	float fVal2 = 0;
	float facingAngle = 0;
	if (testTracked && rhip.w == 1 && lhip.w == 1 && rk.w == 1 && lk.w == 1){ // checking to see if all the needed joints are tracked
		Vector3D* UpperLegRotZ = NULL;
		Vector3D* UpperLegRotX = NULL;

		int screen_position[2];
		if (active_leg == 1){ // Left leg is selected. Default value.
			UpperLegRotZ = new Vector3D(lk.x - lhip.x, lk.y - lhip.y, 0);
			UpperLegRotX = new Vector3D(0, lk.y - lhip.y, lk.z - lhip.z);
			screen_position[0] = SkeletonToScreen(lhip)[0];
			screen_position[1] = SkeletonToScreen(lhip)[1];
		}
		else if (active_leg == 2){ // Left leg is selected.
			UpperLegRotZ = new Vector3D(rk.x - rhip.x, rk.y - rhip.y, 0);
			UpperLegRotX = new Vector3D(0, rk.y - rhip.y, rk.z - rhip.z);
			screen_position[0] = SkeletonToScreen(rhip)[0]+20; // 20 pixels moved to center it better above joint
			screen_position[1] = SkeletonToScreen(rhip)[1];
		}
		// Creating vector to measure leg angle against and calculating the angles for rotation around z-achsis and x-achsis.		
		Vector3D& jointAttachedPendulum = Vector3D(0, -1, 0);
		Vector3D& planeNormal = Vector3D(0, 0, 1);
		fVal1 = twoVectorAngle(*UpperLegRotZ, jointAttachedPendulum, planeNormal);
		planeNormal = Vector3D(-1, 0, 0);
		fVal2 = twoVectorAngle(*UpperLegRotX, jointAttachedPendulum, planeNormal); 
		// Constructing the calculation for a camera facing vector
		Vector3D& rightHipPointToLeft = Vector3D(lhip.x - rhip.x, 0, lhip.z - rhip.z); 
		planeNormal = Vector3D(0, -1, 0);
		Vector3D& straightFacing = Vector3D(-1, 0, 0); // must align with rightHipPointToLeftVector for skeleton to be facing straight forward
		facingAngle = twoVectorAngle(rightHipPointToLeft, straightFacing, planeNormal);

		delete UpperLegRotZ;
		UpperLegRotZ = NULL;
		delete UpperLegRotX;
		UpperLegRotX = NULL;

		// Write angle of the rotation around z to screen by converting float to char array and printing to screen above the joints.
		glColor3f(0.f, 1.f, 0.f);
		glRasterPos2f(screen_position[0] - 30, screen_position[1] - 20);
		char cVal[32];
		sprintf_s(cVal, "%f", fVal1);
		outputText = cVal;
		for (int i = 0; i < 5; i++) {
			glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, outputText[i]);
		}
		// New screen position for angle of the rotation around x.
		glRasterPos2f(screen_position[0] - 30, screen_position[1] - 40);
		sprintf_s(cVal, "%f", fVal2);
		outputText = cVal;
		for (int i = 0; i < 5; i++) {
			glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, outputText[i]);
		}
		// screen position for facing angle
		glRasterPos2f(545, 140);
		sprintf_s(cVal, "%f", facingAngle);
		outputText = cVal;
		for (int i = 0; i < 5; i++) {
			glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, outputText[i]);
		}		

		glLineWidth(5.0);
		glBegin(GL_LINES);
		// blue arrow for facing
		glColor3f(0.f, 0.f, 1.f);
		glLineWidth(5.0);
		// arrow shaft
		glVertex2f(570 + sin(facingAngle) * 50, 70 - cos(facingAngle) * 50);
		glVertex2f(570 - sin(facingAngle) * 50 , 70 + cos(facingAngle) * 50); 
		// arrow tip part 1
		glVertex2f(570 - sin(facingAngle+0.4) * 30, 70 + cos(facingAngle+0.4) * 30);
		glVertex2f(570 - sin(facingAngle) * 50, 70 + cos(facingAngle) * 50);
		// arrow tip part 2
		glVertex2f(570 - sin(facingAngle - 0.4) * 30, 70 + cos(facingAngle - 0.4) * 30);
		glVertex2f(570 - sin(facingAngle) * 50, 70 + cos(facingAngle) * 50);
		glEnd();

	}
	// Nag message about menu appears on screen if menu has not been used yet.
	if (menu_used == FALSE){
		outputText = "Left click on screen to use menu!";
		glColor3f(255, 0, 0);
		glRasterPos2f(10, 20);
		int len;
		len = (int)strlen(outputText);
		for (int i = 0; i < len; i++) {
			glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, outputText[i]);
		}
	}
	// Guards:
	// catch legs that are not fully tracked and bad angles
	if (lk.w == 0 || lhip.w == 0){
		guard_trap = TRUE;
	}
	if (fVal1 > 45.29){
		guard_trap = TRUE;
	}
	if (guarded_data == FALSE){
		guard_trap = FALSE;
	}
	// Program actions
	if (record_data == TRUE && save_data == FALSE){
		appendData(fVal1, fVal2, facingAngle);
	}
	else if (record_data == TRUE && save_data == TRUE && guard_trap == FALSE){
		record_data = FALSE;
		save_data = FALSE;
		appendData(fVal1, fVal2, facingAngle);
		writePickle();
	}
	else if (record_data == FALSE && save_data == TRUE && data_stream->next != NULL && guard_trap == FALSE){
		save_data == FALSE;
		writePickle();
	}

}
/// <summary>
/// Handle new skeleton data
/// </summary>
void CSkeletonBasics::ProcessSkeleton()
{
    NUI_SKELETON_FRAME skeletonFrame = {0};

    HRESULT hr = m_pNuiSensor->NuiSkeletonGetNextFrame(0, &skeletonFrame);
    if ( FAILED(hr) )
    {
        return;
    }

    // smooth out the skeleton data
    m_pNuiSensor->NuiTransformSmooth(&skeletonFrame, NULL);

    // Endure Direct2D is ready to draw
    hr = EnsureDirect2DResources( );
    if ( FAILED(hr) )
    {
        return;
    }

    m_pRenderTarget->BeginDraw();
    m_pRenderTarget->Clear( );

    RECT rct;
    GetClientRect( GetDlgItem( m_hWnd, IDC_VIDEOVIEW ), &rct);
    int width = rct.right;
    int height = rct.bottom;

    for (int i = 0 ; i < NUI_SKELETON_COUNT; ++i)
    {
        NUI_SKELETON_TRACKING_STATE trackingState = skeletonFrame.SkeletonData[i].eTrackingState;

        if (NUI_SKELETON_TRACKED == trackingState)
        {
            // We're tracking the skeleton, draw it
            DrawSkeleton(skeletonFrame.SkeletonData[i], width, height);
			
			// Write commands into keyboard buffer depending on gesture
			if ((skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].y > skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_SHOULDER_RIGHT].y) &&
				(skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].y < skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_SHOULDER_LEFT].y))
			{
				SetStatusMessage(L"rechte Hand ist oben");
				// Write "D" in keyboard buffer
				//keybd_event(0x44, 0x20, 0, 0); //1. Ascii Tabelle 2. Scan Code

				unsigned char berndmessage[] = "d";
				port1.sendArray(berndmessage, 1);
				unsigned char heinrichmessage[] = "d";
				port2.sendArray2(heinrichmessage, 1);
			}

			if ((skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].y > skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_SHOULDER_LEFT].y) &&
				(skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].y < skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_SHOULDER_RIGHT].y))
			{
				// Write "A" in keyboard buffer
				SetStatusMessage(L"linke Hand ist oben");
				// keybd_event(0x41, 0x1E, 0, 0);

				unsigned char berndmessage[] = "a";
				port1.sendArray(berndmessage, 1);
				unsigned char heinrichmessage[] = "a";
				port2.sendArray2(heinrichmessage, 1);
			}

			if ((skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].y > skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_SHOULDER_LEFT].y) &&
				(skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].y > skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_SHOULDER_RIGHT].y))
			{
				// Write "W" in keyboard buffer
				SetStatusMessage(L"beide Hände sind oben");
				//putchar('w');
				//keybd_event( 0x77, 0, KEYEVENTF_EXTENDEDKEY | 0,0 ); --> gibt immerhin die keys aus
				//keybd_event(0x57, 0x11, 0, 0 ); //Fährt!!

				unsigned char berndmessage[] = "w";
				port1.sendArray(berndmessage, 1);
				unsigned char heinrichmessage[] = "w";
				port2.sendArray2(heinrichmessage, 1);
			}

			if ((skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].y < skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_KNEE_LEFT].y) &&
				(skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].y < skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_KNEE_RIGHT].y))
			{
				// Write "S" in keyboard buffer
				SetStatusMessage(L"beide Hände unterhalb der Knie");
				//keybd_event(0x53, 0x1F, 0, 0);

				unsigned char berndmessage[] = "s";
				port1.sendArray(berndmessage, 1);
				unsigned char heinrichmessage[] = "s";
				port2.sendArray2(heinrichmessage, 1);
			}

			if ((skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].y > skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_KNEE_LEFT].y) &&
				(skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].y > skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_KNEE_RIGHT].y) &&
				(skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].y < skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_SHOULDER_LEFT].y) &&
				(skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].y < skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_SHOULDER_RIGHT].y))
			{
				// Write "P" in keyboard buffer
				SetStatusMessage(L"beide Hände sind unten");
				//keybd_event(0x4F, 0x18, 0, 0);

				unsigned char berndmessage[] = "p";
				port1.sendArray(berndmessage, 1);
				unsigned char heinrichmessage[] = "p";
				port2.sendArray2(heinrichmessage, 1);
			}

        }
        else if (NUI_SKELETON_POSITION_ONLY == trackingState)
        {
            // we've only received the center point of the skeleton, draw that
            D2D1_ELLIPSE ellipse = D2D1::Ellipse(
                SkeletonToScreen(skeletonFrame.SkeletonData[i].Position, width, height),
                g_JointThickness,
                g_JointThickness
                );

            m_pRenderTarget->DrawEllipse(ellipse, m_pBrushJointTracked);
        }
    }



	/*
	// ---> ANFANG zweite Person
	for (int j = 0; j < NUI_SKELETON_COUNT; ++j)
	{
		NUI_SKELETON_TRACKING_STATE trackingState = skeletonFrame.SkeletonData[j].eTrackingState;

		if (NUI_SKELETON_TRACKED == trackingState)
		{
			// We're tracking the skeleton, draw it
			DrawSkeleton(skeletonFrame.SkeletonData[j], width, height);

			// Write commands into keyboard buffer depending on gesture
			if ((skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].y > skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_SHOULDER_RIGHT].y) &&
				(skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].y < skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_SHOULDER_LEFT].y))
			{
				SetStatusMessage(L"zweite Person: rechte Hand ist oben");
				// Write "K" in keyboard buffer
				keybd_event(0x4B, 0x25, 0, 0); //1. Ascii Tabelle 2. Scan Code
			}

			if ((skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].y > skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_SHOULDER_LEFT].y) &&
				(skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].y < skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_SHOULDER_RIGHT].y))
			{
				// Write "H" in keyboard buffer
				SetStatusMessage(L"zweite Person: linke Hand ist oben");
				keybd_event(0x48, 0x23, 0, 0);
			}

			if ((skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].y > skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_SHOULDER_LEFT].y) &&
				(skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].y > skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_SHOULDER_RIGHT].y))
			{
				// Write "U" in keyboard buffer
				SetStatusMessage(L"zweite Person: beide Hände sind oben");
				keybd_event(0x55, 0x16, 0, 0); //Fährt!!
			}

			if ((skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].y < skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_KNEE_LEFT].y) &&
				(skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].y < skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_KNEE_RIGHT].y))
			{
				// Write "J" in keyboard buffer
				SetStatusMessage(L"zweite Person: beide Hände unterhalb der Knie");
				keybd_event(0x4A, 0x24, 0, 0);
			}

			if ((skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].y > skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_KNEE_LEFT].y) &&
				(skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].y > skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_KNEE_RIGHT].y) &&
				(skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].y < skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_SHOULDER_LEFT].y) &&
				(skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].y < skeletonFrame.SkeletonData[j].SkeletonPositions[NUI_SKELETON_POSITION_SHOULDER_RIGHT].y))
			{
				// Write "P" in keyboard buffer
				SetStatusMessage(L"zweite Person: beide Hände sind unten");
				keybd_event(0x50, 0x19, 0, 0);
			}

		}
		else if (NUI_SKELETON_POSITION_ONLY == trackingState)
		{
			// we've only received the center point of the skeleton, draw that
			D2D1_ELLIPSE ellipse = D2D1::Ellipse(
				SkeletonToScreen(skeletonFrame.SkeletonData[j].Position, width, height),
				g_JointThickness,
				g_JointThickness
				);

			m_pRenderTarget->DrawEllipse(ellipse, m_pBrushJointTracked);
		}
	}
	// --> ENDE zweite Person
	*/



    hr = m_pRenderTarget->EndDraw();

    // Device lost, need to recreate the render target
    // We'll dispose it now and retry drawing
    if (D2DERR_RECREATE_TARGET == hr)
    {
        hr = S_OK;
        DiscardDirect2DResources();
    }
}
예제 #5
0
/// <summary>
/// Handle new skeleton data
/// </summary>
void CDataCollection::ProcessSkeleton()
{
	NUI_SKELETON_FRAME skeletonFrame = {0};

	HRESULT hr = m_pNuiSensor->NuiSkeletonGetNextFrame(0, &skeletonFrame);

	
	if(m_bSaveSkeStart)
	{
		int framecount = m_pSkeData->GetFrameSaved();
		::SetDlgItemInt(m_hWnd, static_cast<int>(IDC_FRAME_SHOW),framecount, FALSE );
	}
	
	if ( FAILED(hr) )
	{
		return;
	}

	// smooth out the skeleton data
	m_pNuiSensor->NuiTransformSmooth(&skeletonFrame, NULL);

	//m_pSkeData->AddOneFrame(skeletonFrame);
	for (int i = 0 ; i < NUI_SKELETON_COUNT; i++)
	{
		NUI_SKELETON_TRACKING_STATE trackingState = skeletonFrame.SkeletonData[i].eTrackingState;
		if (NUI_SKELETON_TRACKED ==trackingState)
		{
			m_pSkeData->AddOneFrame(skeletonFrame.SkeletonData[i].SkeletonPositions);
			break;
		}
	}

	if(m_bSaveSkeStart) {
	if (m_pSkeData->SavingIsStopped()) {
	
	    KillTimer (m_hWnd, TIMER_SEC) ;
	    StringCchPrintf( statusmsg, cStatusMessageMaxLen, L"Skeleton video saved to %s", skefname);
	    MessageBox(m_hWnd, statusmsg, L"File saved!", MB_OK); 

		
		m_bSaveSkeStart=false;
	}
	}
	// Endure Direct2D is ready to draw
	hr = EnsureDirect2DResources( );
	if ( FAILED(hr) )
	{
		return;
	}

	m_pRenderTarget->BeginDraw();
	m_pRenderTarget->Clear( );

	RECT rct;
	GetClientRect( GetDlgItem( m_hWnd, IDC_SKELETON ), &rct);
	int width = rct.right;
	int height = rct.bottom;
//	WCHAR statusMessage[cStatusMessageMaxLen];
	
	
	int i;
	//currentframetime=GetTickCount();
	for ( i = 0 ; i < NUI_SKELETON_COUNT; ++i)
	{
		NUI_SKELETON_TRACKING_STATE trackingState = skeletonFrame.SkeletonData[i].eTrackingState;
		

		if (NUI_SKELETON_TRACKED == trackingState)
		{
			// We're tracking the skeleton, draw it
			DrawSkeleton(skeletonFrame.SkeletonData[i], width, height);
			break;
		}
		else if (NUI_SKELETON_POSITION_ONLY == trackingState)
		{
	
			
			// we've only received the center point of the skeleton, draw that
			D2D1_ELLIPSE ellipse = D2D1::Ellipse(
				SkeletonToScreen(skeletonFrame.SkeletonData[i].Position, width, height),
				g_JointThickness,
				g_JointThickness
				);

			m_pRenderTarget->DrawEllipse(ellipse, m_pBrushJointTracked);
		}

		

		
	}
	
	
	hr = m_pRenderTarget->EndDraw();

	// Device lost, need to recreate the render target
	// We'll dispose it now and retry drawing
	if (D2DERR_RECREATE_TARGET == hr)
	{
		hr = S_OK;
		DiscardDirect2DResources();
	}
	
}