/
tnuitracker.cpp
61 lines (48 loc) · 1.7 KB
/
tnuitracker.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "tnuitracker.h"
#include "tnuiskeletonstream.h"
#include "tnuiimagestream.h"
#include "tnuisensor.h"
#include <QPointF>
QPointF MapToScreen(const Vector4 &point)
{
//@to-do: It's not fixed
const NUI_IMAGE_RESOLUTION resolution = NUI_IMAGE_RESOLUTION_640x480;
long x, y;
ushort depth;
NuiTransformSkeletonToDepthImage(point, &x, &y, &depth, resolution); // Returns coordinates in depth space
long backupX = x, backupY = y;
if (FAILED(NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution(resolution, resolution, NULL, x, y, depth, &x, &y))) {
x = backupX;
y = backupY;
}
return QPointF(x, y);
}
TNuiSkeletonStream *TNuiTracker::m_skeletonStream;
TNuiTracker::TNuiTracker(TNuiSensor *sensor, NUI_SKELETON_POSITION_INDEX target)
: QObject(sensor)
, m_target(target)
{
static TNuiSkeletonStream *stream = m_skeletonStream = new TNuiSkeletonStream(sensor);
connect(stream, &TNuiSkeletonStream::readyRead, this, &TNuiTracker::handleNewFrame);
stream->tryOpen();
}
void TNuiTracker::handleNewFrame()
{
if (m_target == NUI_SKELETON_POSITION_COUNT)
return;
NUI_SKELETON_FRAME frame;
m_skeletonStream->readFrame(frame);
//@todo: Track more players
for (int i = 0; i < NUI_SKELETON_COUNT; i++) {
if (frame.SkeletonData[i].dwTrackingID != 0) {
const Vector4 &pos3d = frame.SkeletonData[i].SkeletonPositions[m_target];
m_screenPos = MapToScreen(pos3d);
emit screenPosChanged(m_screenPos);
m_realPos.setX(pos3d.x);
m_realPos.setY(pos3d.y);
m_realPos.setZ(pos3d.z);
emit realPosChanged(m_realPos);
break;
}
}
}