void makeCloudMap(void) { GLfloat win_tex_w = (float)win_width/tex_width; GLfloat win_tex_h = (float)win_height/tex_height; long cx=0,cy=0; for( int y = 0; y < 240; ++y ){ for( int x = 0; x < 320; ++x){ Vector4 tmp = NuiTransformDepthImageToSkeleton(x, y, depth[y][x]); NuiImageGetColorPixelCoordinatesFromDepthPixel(NUI_IMAGE_RESOLUTION_320x240, NULL, x, y, depth[y][x], &cx, &cy); CloudMap[y][x][0] = (short)(tmp.z*1000); TexMap[y][x][0] = (short)cx*win_tex_w; CloudMap[y][x][1] = -(short)(tmp.x*1000); TexMap[y][x][1] = (short)cy*win_tex_h; CloudMap[y][x][2] = (short)(tmp.y*1000); TexMap[y][x][2] = (short)(tmp.z*1000); indices[y][x] = y*win_width+x; } } }
void drawNuiSkeleton(int playerID) { int scaleX = DEFAULT_WIDTH; int scaleY = DEFAULT_HEIGHT; long x=0,y=0; unsigned short depth=0; float fx=0,fy=0; long cx=0,cy=0; int display_pos[NUI_SKELETON_POSITION_COUNT][2]; for (int i = 0; i < NUI_SKELETON_POSITION_COUNT; i++) { // Overlay on depth image //NuiTransformSkeletonToDepthImage( skels[playerID][i], &fx, &fy); //display_pos[i][0] = (int) ( fx / 320.0 * DEFAULT_WIDTH); //display_pos[i][1] = (int) ( fy / 240.0 * DEFAULT_HEIGHT); // Overlay on color image NuiTransformSkeletonToDepthImage( skels[playerID][i], &x, &y, &depth); NuiImageGetColorPixelCoordinatesFromDepthPixel(NUI_IMAGE_RESOLUTION_640x480, NULL, x, y, depth, &cx, &cy); display_pos[i][0] = (int) cx; display_pos[i][1] = (int) cy; } glColor3ub(255, 255, 0); glLineWidth(6); glBegin(GL_LINE_STRIP); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_HIP_CENTER][0], scaleY - display_pos[NUI_SKELETON_POSITION_HIP_CENTER][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_SPINE][0], scaleY - display_pos[NUI_SKELETON_POSITION_SPINE][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_SHOULDER_CENTER][0], scaleY - display_pos[NUI_SKELETON_POSITION_SHOULDER_CENTER][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_HEAD][0], scaleY - display_pos[NUI_SKELETON_POSITION_HEAD][1]); glEnd(); glBegin(GL_LINE_STRIP); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_SHOULDER_CENTER][0], scaleY - display_pos[NUI_SKELETON_POSITION_SHOULDER_CENTER][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_SHOULDER_LEFT][0], scaleY - display_pos[NUI_SKELETON_POSITION_SHOULDER_LEFT][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_ELBOW_LEFT][0], scaleY - display_pos[NUI_SKELETON_POSITION_ELBOW_LEFT][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_WRIST_LEFT][0], scaleY - display_pos[NUI_SKELETON_POSITION_WRIST_LEFT][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_HAND_LEFT][0], scaleY - display_pos[NUI_SKELETON_POSITION_HAND_LEFT][1]); glEnd(); glBegin(GL_LINE_STRIP); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_SHOULDER_CENTER][0], scaleY - display_pos[NUI_SKELETON_POSITION_SHOULDER_CENTER][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_SHOULDER_RIGHT][0], scaleY - display_pos[NUI_SKELETON_POSITION_SHOULDER_RIGHT][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_ELBOW_RIGHT][0], scaleY - display_pos[NUI_SKELETON_POSITION_ELBOW_RIGHT][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_WRIST_RIGHT][0], scaleY - display_pos[NUI_SKELETON_POSITION_WRIST_RIGHT][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_HAND_RIGHT][0], scaleY - display_pos[NUI_SKELETON_POSITION_HAND_RIGHT][1]); glEnd(); glBegin(GL_LINE_STRIP); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_HIP_CENTER][0], scaleY - display_pos[NUI_SKELETON_POSITION_HIP_CENTER][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_HIP_LEFT][0], scaleY - display_pos[NUI_SKELETON_POSITION_HIP_LEFT][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_KNEE_LEFT][0], scaleY - display_pos[NUI_SKELETON_POSITION_KNEE_LEFT][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_ANKLE_LEFT][0], scaleY - display_pos[NUI_SKELETON_POSITION_ANKLE_LEFT][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_FOOT_LEFT][0], scaleY - display_pos[NUI_SKELETON_POSITION_FOOT_LEFT][1]); glEnd(); glBegin(GL_LINE_STRIP); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_HIP_CENTER][0], scaleY - display_pos[NUI_SKELETON_POSITION_HIP_CENTER][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_HIP_RIGHT][0], scaleY - display_pos[NUI_SKELETON_POSITION_HIP_RIGHT][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_KNEE_RIGHT][0], scaleY - display_pos[NUI_SKELETON_POSITION_KNEE_RIGHT][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_ANKLE_RIGHT][0], scaleY - display_pos[NUI_SKELETON_POSITION_ANKLE_RIGHT][1]); glVertex2i( scaleX - display_pos[NUI_SKELETON_POSITION_FOOT_RIGHT][0], scaleY - display_pos[NUI_SKELETON_POSITION_FOOT_RIGHT][1]); glEnd(); glColor3ub(0, 0, 0); }
// Takes in an x and y depth value, returns corresponding x and y values of the color image void KinectGrabber::Kinect_ColorFromDepth(LONG depthX, LONG depthY, LONG *pColorX, LONG *pColorY) { NuiImageGetColorPixelCoordinatesFromDepthPixel(NUI_IMAGE_RESOLUTION_640x480, NULL, LONG(depthX/2), LONG(depthY/2), m_depthBuffer[depthY*DEPTH_WIDTH + depthX] << 3, pColorX, pColorY); }
void KinectImpl::drawNuiSkeleton(int width, int height, int playerID) { int scaleX = width; int scaleY = height; long x=0,y=0; unsigned short depth=0; float fx=0,fy=0; long cx=0,cy=0; float display_posf[NUI_SKELETON_POSITION_COUNT][2]; for (int i = 0; i < NUI_SKELETON_POSITION_COUNT; i++) { switch(showedTextureIndex){ case IMAGE_TEXTURE: NuiTransformSkeletonToDepthImage( skels[playerID][i], &x, &y, &depth); NuiImageGetColorPixelCoordinatesFromDepthPixel(NUI_IMAGE_RESOLUTION_640x480, NULL, x, y, depth, &cx, &cy); display_posf[i][0] = 1.0f - (cx / 640.0f) * 2.0f; display_posf[i][1] = 1.0f - (cy / 480.0f) * 2.0f; break; case DEPTH_TEXTURE: NuiTransformSkeletonToDepthImage( skels[playerID][i], &fx, &fy); display_posf[i][0] = 1.0f - fx / 320.0f * 2.0f; display_posf[i][1] = 1.0f - fy / 240.0f * 2.0f; break; default: break; } } glColor3ub(255, 255, 0); glLineWidth(6); glBegin(GL_LINE_STRIP); glVertex2f( display_posf[NUI_SKELETON_POSITION_HIP_CENTER][0], display_posf[NUI_SKELETON_POSITION_HIP_CENTER][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_SPINE][0], display_posf[NUI_SKELETON_POSITION_SPINE][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_SHOULDER_CENTER][0], display_posf[NUI_SKELETON_POSITION_SHOULDER_CENTER][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_HEAD][0], display_posf[NUI_SKELETON_POSITION_HEAD][1]); glEnd(); glBegin(GL_LINE_STRIP); glVertex2f( display_posf[NUI_SKELETON_POSITION_SHOULDER_CENTER][0], display_posf[NUI_SKELETON_POSITION_SHOULDER_CENTER][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_SHOULDER_LEFT][0], display_posf[NUI_SKELETON_POSITION_SHOULDER_LEFT][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_ELBOW_LEFT][0], display_posf[NUI_SKELETON_POSITION_ELBOW_LEFT][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_WRIST_LEFT][0], display_posf[NUI_SKELETON_POSITION_WRIST_LEFT][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_HAND_LEFT][0], display_posf[NUI_SKELETON_POSITION_HAND_LEFT][1]); glEnd(); glBegin(GL_LINE_STRIP); glVertex2f( display_posf[NUI_SKELETON_POSITION_SHOULDER_CENTER][0], display_posf[NUI_SKELETON_POSITION_SHOULDER_CENTER][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_SHOULDER_RIGHT][0], display_posf[NUI_SKELETON_POSITION_SHOULDER_RIGHT][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_ELBOW_RIGHT][0], display_posf[NUI_SKELETON_POSITION_ELBOW_RIGHT][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_WRIST_RIGHT][0], display_posf[NUI_SKELETON_POSITION_WRIST_RIGHT][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_HAND_RIGHT][0], display_posf[NUI_SKELETON_POSITION_HAND_RIGHT][1]); glEnd(); glBegin(GL_LINE_STRIP); glVertex2f( display_posf[NUI_SKELETON_POSITION_HIP_CENTER][0], display_posf[NUI_SKELETON_POSITION_HIP_CENTER][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_HIP_LEFT][0], display_posf[NUI_SKELETON_POSITION_HIP_LEFT][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_KNEE_LEFT][0], display_posf[NUI_SKELETON_POSITION_KNEE_LEFT][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_ANKLE_LEFT][0], display_posf[NUI_SKELETON_POSITION_ANKLE_LEFT][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_FOOT_LEFT][0], display_posf[NUI_SKELETON_POSITION_FOOT_LEFT][1]); glEnd(); glBegin(GL_LINE_STRIP); glVertex2f( display_posf[NUI_SKELETON_POSITION_HIP_CENTER][0], display_posf[NUI_SKELETON_POSITION_HIP_CENTER][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_HIP_RIGHT][0], display_posf[NUI_SKELETON_POSITION_HIP_RIGHT][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_KNEE_RIGHT][0], display_posf[NUI_SKELETON_POSITION_KNEE_RIGHT][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_ANKLE_RIGHT][0], display_posf[NUI_SKELETON_POSITION_ANKLE_RIGHT][1]); glVertex2f( display_posf[NUI_SKELETON_POSITION_FOOT_RIGHT][0], display_posf[NUI_SKELETON_POSITION_FOOT_RIGHT][1]); glEnd(); glColor3ub(0, 0, 0); }
void CSkeletalViewerApp::Nui_GotDepthAlert( ) { const NUI_IMAGE_FRAME * pImageFrame = NULL; HRESULT hr = NuiImageStreamGetNextFrame( m_pDepthStreamHandle, 0, &pImageFrame ); if( FAILED( hr ) ) { return; } NuiImageBuffer * pTexture = pImageFrame->pFrameTexture; KINECT_LOCKED_RECT LockedRect; pTexture->LockRect( 0, &LockedRect, NULL, 0 ); if( LockedRect.Pitch != 0 ) { BYTE * pBuffer = (BYTE*) LockedRect.pBits; USHORT * pPlayerRun = m_playerMap; for( int y = 0 ; y < 480 ; y++ ) { for( int x = 0 ; x < 640 ; x++ ) { *pPlayerRun = 0; *pPlayerRun++; } } // draw the bits to the bitmap RGBQUAD * rgbrun = m_rgbWk; USHORT * pBufferRun = (USHORT*) pBuffer; USHORT player, depth; long colorX = 0, colorY = 0; for( int y = 0 ; y < 240 ; y++ ) { for( int x = 0 ; x < 320 ; x++ ) { depth = *pBufferRun & 0xfff8; if (FrameCount == 0) { initialdepth[x + y*320] = depth; } //TODO if first frame, save depth values as background player = *pBufferRun & 7; NuiImageGetColorPixelCoordinatesFromDepthPixel( NUI_IMAGE_RESOLUTION_640x480, 0, x, y, depth, &colorX, &colorY); USHORT writeover = 0; //HACK player id based: writeover = player; //HACK background subtraction if (depth < initialdepth[x + y*320] - 10) { //HACK writeover = 10; } m_playerMap[colorY * 640 + colorX] = writeover; m_playerMap[colorY * 640 + colorX + 1] = writeover; m_playerMap[(colorY + 1)* 640 + colorX] = writeover; m_playerMap[(colorY + 1)* 640 + colorX + 1] = writeover; RGBQUAD quad = Nui_ShortToQuad_Depth( *pBufferRun ); pBufferRun++; *rgbrun = quad; rgbrun++; } } UINT bgColor = 0x00ffeedd; UINT * pVideoRun = m_videoCache; pPlayerRun = m_playerMap; for( int y = 0 ; y < 480 ; y++ ) { for( int x = 0 ; x < 640; x++ ) { if (*pPlayerRun == 0) { *pVideoRun = bgColor; } pVideoRun++; pPlayerRun++; } } m_DrawVideo.DrawFrame( (BYTE*) m_videoCache ); m_DrawDepth.DrawFrame( (BYTE*) m_rgbWk ); ULONGLONG diff = (ULONGLONG) ((1.0 / m_FramesTotal - 1.0 / 20) * 1000); //diff = 0; m_videoDelay = GetTickCount64() + diff; } else { OutputDebugString( L"Buffer length of received texture is bogus\r\n" ); } FrameCount++; NuiImageStreamReleaseFrame( m_pDepthStreamHandle, pImageFrame ); }