/// <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); } } }
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(); } }
/// <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(); } }