This commit is contained in:
parent
b5823a1059
commit
680b1ca2bb
@ -36,9 +36,13 @@
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.Research.Kinect, Version=1.0.0.45, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
|
||||
<Reference Include="Microsoft.Kinect, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>C:\Program Files\Microsoft SDKs\Kinect\v1.7\Assemblies\Microsoft.Kinect.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Core" />
|
||||
|
@ -1,11 +1,9 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Kinect;
|
||||
using System.Drawing;
|
||||
|
||||
namespace KinectWorkshop
|
||||
{
|
||||
public class DepthFrameConverter
|
||||
/*public class DepthFrameConverter
|
||||
{
|
||||
const int RED_IDX = 2;
|
||||
const int GREEN_IDX = 1;
|
||||
@ -14,71 +12,94 @@ namespace KinectWorkshop
|
||||
|
||||
// Converts a 16-bit grayscale depth frame which includes player indexes into a 32-bit frame
|
||||
// that displays different players in different colors
|
||||
public byte[] ConvertDepthFrameWithUser(byte[] depthFrame16)
|
||||
public byte[] ConvertDepthFrameWithUser(DepthImagePixel[] depthFrame, int width, int height)
|
||||
{
|
||||
for (int i16 = 0, i32 = 0; i16 < depthFrame16.Length && i32 < depthFrame32.Length; i16 += 2, i32 += 4)
|
||||
Color c = Color.Empty;
|
||||
byte[] ret = new byte[width * height * 4];
|
||||
for (int x = 1; x < width; x++)
|
||||
{
|
||||
int player = depthFrame16[i16] & 0x07;
|
||||
//if ((y - 1) * 320 + x * 4 == i16)
|
||||
//{
|
||||
// player = 8;
|
||||
//}
|
||||
int realDepth = (depthFrame16[i16 + 1] << 5) | (depthFrame16[i16] >> 3);
|
||||
// transform 13-bit depth information into an 8-bit intensity appropriate
|
||||
// for display (we disregard information in most significant bit)
|
||||
byte intensity = (byte)(255 - (255 * realDepth / 0x0fff));
|
||||
|
||||
depthFrame32[i32 + RED_IDX] = 0;
|
||||
depthFrame32[i32 + GREEN_IDX] = 0;
|
||||
depthFrame32[i32 + BLUE_IDX] = 0;
|
||||
|
||||
// choose different display colors based on player
|
||||
switch (player)
|
||||
for (int y = 0; y < height; y++)
|
||||
{
|
||||
case 0:
|
||||
depthFrame32[i32 + RED_IDX] = (byte)(intensity / 2);
|
||||
depthFrame32[i32 + GREEN_IDX] = (byte)(intensity / 2);
|
||||
depthFrame32[i32 + BLUE_IDX] = (byte)(intensity / 2);
|
||||
break;
|
||||
case 1:
|
||||
depthFrame32[i32 + RED_IDX] = intensity;
|
||||
break;
|
||||
case 2:
|
||||
depthFrame32[i32 + GREEN_IDX] = intensity;
|
||||
break;
|
||||
case 3:
|
||||
depthFrame32[i32 + RED_IDX] = (byte)(intensity / 4);
|
||||
depthFrame32[i32 + GREEN_IDX] = (byte)(intensity);
|
||||
depthFrame32[i32 + BLUE_IDX] = (byte)(intensity);
|
||||
break;
|
||||
case 4:
|
||||
depthFrame32[i32 + RED_IDX] = (byte)(intensity);
|
||||
depthFrame32[i32 + GREEN_IDX] = (byte)(intensity);
|
||||
depthFrame32[i32 + BLUE_IDX] = (byte)(intensity / 4);
|
||||
break;
|
||||
case 5:
|
||||
depthFrame32[i32 + RED_IDX] = (byte)(intensity);
|
||||
depthFrame32[i32 + GREEN_IDX] = (byte)(intensity / 4);
|
||||
depthFrame32[i32 + BLUE_IDX] = (byte)(intensity);
|
||||
break;
|
||||
case 6:
|
||||
depthFrame32[i32 + RED_IDX] = (byte)(intensity / 2);
|
||||
depthFrame32[i32 + GREEN_IDX] = (byte)(intensity / 2);
|
||||
depthFrame32[i32 + BLUE_IDX] = (byte)(intensity);
|
||||
break;
|
||||
case 7:
|
||||
depthFrame32[i32 + RED_IDX] = (byte)(255 - intensity);
|
||||
depthFrame32[i32 + GREEN_IDX] = (byte)(255 - intensity);
|
||||
depthFrame32[i32 + BLUE_IDX] = (byte)(255 - intensity);
|
||||
break;
|
||||
case 8:
|
||||
depthFrame32[i32 + RED_IDX] = 255;
|
||||
depthFrame32[i32 + GREEN_IDX] = 0;
|
||||
depthFrame32[i32 + BLUE_IDX] = 0;
|
||||
break;
|
||||
int i = ((y * width) + x) * 4;
|
||||
short depth = (depthFrame[x + y * width]).Depth;
|
||||
c = Color.Empty;
|
||||
if(depth > 0 && depth <= 4000)
|
||||
{
|
||||
int depthdist = (int)((depth / 4090f) * 255f);
|
||||
c = System.Drawing.Color.FromArgb((int)(depthdist / 2f), depthdist, (int)(depthdist * 0.7f));
|
||||
}
|
||||
ret[i] = c.B;
|
||||
ret[i] = c.G;
|
||||
ret[i] = c.R;
|
||||
ret[i] = 255;
|
||||
}
|
||||
|
||||
}
|
||||
return depthFrame32;
|
||||
|
||||
/* for (int i16 = 0, i32 = 0; i16 < depthFrame16.Length && i32 < depthFrame32.Length; i16 += 2, i32 += 4)
|
||||
{
|
||||
int player = depthFrame16[i16] & 0x07;
|
||||
//if ((y - 1) * 320 + x * 4 == i16)
|
||||
//{
|
||||
// player = 8;
|
||||
//}
|
||||
int realDepth = (depthFrame16[i16 + 1] << 5) | (depthFrame16[i16] >> 3);
|
||||
// transform 13-bit depth information into an 8-bit intensity appropriate
|
||||
// for display (we disregard information in most significant bit)
|
||||
byte intensity = (byte)(255 - (255 * realDepth / 0x0fff));
|
||||
|
||||
depthFrame32[i32 + RED_IDX] = 0;
|
||||
depthFrame32[i32 + GREEN_IDX] = 0;
|
||||
depthFrame32[i32 + BLUE_IDX] = 0;
|
||||
|
||||
// choose different display colors based on player
|
||||
switch (player)
|
||||
{
|
||||
case 0:
|
||||
depthFrame32[i32 + RED_IDX] = (byte)(intensity / 2);
|
||||
depthFrame32[i32 + GREEN_IDX] = (byte)(intensity / 2);
|
||||
depthFrame32[i32 + BLUE_IDX] = (byte)(intensity / 2);
|
||||
break;
|
||||
case 1:
|
||||
depthFrame32[i32 + RED_IDX] = intensity;
|
||||
break;
|
||||
case 2:
|
||||
depthFrame32[i32 + GREEN_IDX] = intensity;
|
||||
break;
|
||||
case 3:
|
||||
depthFrame32[i32 + RED_IDX] = (byte)(intensity / 4);
|
||||
depthFrame32[i32 + GREEN_IDX] = (byte)(intensity);
|
||||
depthFrame32[i32 + BLUE_IDX] = (byte)(intensity);
|
||||
break;
|
||||
case 4:
|
||||
depthFrame32[i32 + RED_IDX] = (byte)(intensity);
|
||||
depthFrame32[i32 + GREEN_IDX] = (byte)(intensity);
|
||||
depthFrame32[i32 + BLUE_IDX] = (byte)(intensity / 4);
|
||||
break;
|
||||
case 5:
|
||||
depthFrame32[i32 + RED_IDX] = (byte)(intensity);
|
||||
depthFrame32[i32 + GREEN_IDX] = (byte)(intensity / 4);
|
||||
depthFrame32[i32 + BLUE_IDX] = (byte)(intensity);
|
||||
break;
|
||||
case 6:
|
||||
depthFrame32[i32 + RED_IDX] = (byte)(intensity / 2);
|
||||
depthFrame32[i32 + GREEN_IDX] = (byte)(intensity / 2);
|
||||
depthFrame32[i32 + BLUE_IDX] = (byte)(intensity);
|
||||
break;
|
||||
case 7:
|
||||
depthFrame32[i32 + RED_IDX] = (byte)(255 - intensity);
|
||||
depthFrame32[i32 + GREEN_IDX] = (byte)(255 - intensity);
|
||||
depthFrame32[i32 + BLUE_IDX] = (byte)(255 - intensity);
|
||||
break;
|
||||
case 8:
|
||||
depthFrame32[i32 + RED_IDX] = 255;
|
||||
depthFrame32[i32 + GREEN_IDX] = 0;
|
||||
depthFrame32[i32 + BLUE_IDX] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return depthFrame32;*
|
||||
return ret;
|
||||
}
|
||||
|
||||
internal byte[] ConvertDepthFrame(byte[] depthFrame16)
|
||||
@ -112,5 +133,5 @@ namespace KinectWorkshop
|
||||
}
|
||||
return depthFrame32;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
@ -4,12 +4,11 @@
|
||||
Title="MainWindow" Height="520" Width="660" Loaded="Window_Loaded" KeyUp="Window_KeyUp">
|
||||
<Grid>
|
||||
<Image Name="imgDepth" Width="640" Height="480" />
|
||||
<!--<StackPanel Orientation="Vertical">
|
||||
<!-- <StackPanel Orientation="Vertical">
|
||||
<Image Name="imgRgb" Width="320" Height="240" />
|
||||
<Image Name="imgDepthPlayer" Width="320" Height="240" />
|
||||
</StackPanel>-->
|
||||
</StackPanel> -->
|
||||
|
||||
<Canvas Name="MainCanvas">
|
||||
</Canvas>
|
||||
<Canvas Name="MainCanvas"/>
|
||||
</Grid>
|
||||
</Window>
|
||||
|
@ -11,7 +11,7 @@ using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
using Microsoft.Research.Kinect.Nui;
|
||||
using Microsoft.Kinect;
|
||||
|
||||
namespace Demo1
|
||||
{
|
||||
@ -21,7 +21,14 @@ namespace Demo1
|
||||
public partial class MainWindow : Window
|
||||
{
|
||||
private KinectWorkshop.DepthFrameConverter cv = new KinectWorkshop.DepthFrameConverter();
|
||||
private Camera _cam;
|
||||
private KinectSensor r;
|
||||
//private DepthImagePixel[] depthPixels;
|
||||
//private byte[] colorPixels;
|
||||
//private DepthImageFormat DepthFormat = DepthImageFormat.Resolution320x240Fps30;
|
||||
//private ColorImageFormat ColorFormat = ColorImageFormat.RgbResolution640x480Fps30;
|
||||
//private ColorImagePoint[] colorCoordinates;
|
||||
//private bool init = false;
|
||||
|
||||
public MainWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
@ -29,24 +36,29 @@ namespace Demo1
|
||||
|
||||
private void Window_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (Runtime.Kinects.Count == 0)
|
||||
if (KinectSensor.KinectSensors.Count == 0)
|
||||
{
|
||||
MessageBox.Show("Keine Kinect");
|
||||
return;
|
||||
}
|
||||
try
|
||||
{
|
||||
Runtime r = Runtime.Kinects[0];
|
||||
r.Initialize(RuntimeOptions.UseSkeletalTracking | RuntimeOptions.UseDepthAndPlayerIndex);
|
||||
r = KinectSensor.KinectSensors[0];
|
||||
r.Start();
|
||||
//r.Initialize(RuntimeOptions.UseSkeletalTracking | RuntimeOptions.UseDepthAndPlayerIndex);
|
||||
|
||||
//r.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(r_VideoFrameReady);
|
||||
//r.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);
|
||||
|
||||
r.DepthFrameReady += new EventHandler<ImageFrameReadyEventArgs>(r_DepthFrameReady);
|
||||
r.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.DepthAndPlayerIndex);
|
||||
r.SkeletonEngine.TransformSmooth = true;
|
||||
r.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(r_SkeletonFrameReady);
|
||||
_cam = r.NuiCamera;
|
||||
//r.DepthFrameReady += r_DepthFrameReady;
|
||||
//r.DepthStream.Enable();
|
||||
//r.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.DepthAndPlayerIndex);
|
||||
//r.SkeletonFrameReady += r_SkeletonFrameReady;
|
||||
r.SkeletonStream.Enable(new TransformSmoothParameters() { Smoothing = 0.1f });
|
||||
//r.SkeletonEngine.TransformSmooth = true;
|
||||
//r.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(r_SkeletonFrameReady);
|
||||
//_cam = r.NuiCamera;
|
||||
//r.AllFramesReady += R_AllFramesReady;
|
||||
r.SkeletonFrameReady += this.r_SkeletonFrameReady;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@ -54,46 +66,118 @@ namespace Demo1
|
||||
}
|
||||
}
|
||||
|
||||
/*private void R_AllFramesReady(object sender, AllFramesReadyEventArgs e)
|
||||
{
|
||||
if(r == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
bool depthReceived = false;
|
||||
bool colorReceived = false;
|
||||
|
||||
using (DepthImageFrame depthFrame = e.OpenDepthImageFrame())
|
||||
{
|
||||
if (null != depthFrame)
|
||||
{
|
||||
// Copy the pixel data from the image to a temporary array
|
||||
depthFrame.CopyDepthImagePixelDataTo(this.depthPixels);
|
||||
|
||||
depthReceived = true;
|
||||
if(!init) {
|
||||
this.colorCoordinates = new ColorImagePoint[r.DepthStream.FramePixelDataLength];
|
||||
init = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
|
||||
{
|
||||
if (null != colorFrame)
|
||||
{
|
||||
// Copy the pixel data from the image to a temporary array
|
||||
colorFrame.CopyPixelDataTo(this.colorPixels);
|
||||
|
||||
colorReceived = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (true == depthReceived)
|
||||
{
|
||||
r.CoordinateMapper.MapDepthFrameToColorFrame(
|
||||
DepthFormat,
|
||||
this.depthPixels,
|
||||
ColorFormat,
|
||||
this.colorCoordinates);
|
||||
|
||||
// ...
|
||||
|
||||
int depthIndex = x + (y * this.depthWidth);
|
||||
DepthImagePixel depthPixel = this.depthPixels[depthIndex];
|
||||
|
||||
// scale color coordinates to depth resolution
|
||||
int X = colorImagePoint.X / this.colorToDepthDivisor;
|
||||
int Y = colorImagePoint.Y / this.colorToDepthDivisor;
|
||||
|
||||
// depthPixel is the depth for the (X,Y) pixel in the color frame
|
||||
}
|
||||
|
||||
}*/
|
||||
|
||||
void r_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
|
||||
{
|
||||
SkeletonFrame skf = e.OpenSkeletonFrame();
|
||||
if(skf == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Skeleton[] sks = new Skeleton[skf.SkeletonArrayLength];
|
||||
skf.CopySkeletonDataTo(sks);
|
||||
this.MainCanvas.Children.Clear();
|
||||
foreach (SkeletonData sk in e.SkeletonFrame.Skeletons)
|
||||
foreach (Skeleton sk in sks)
|
||||
{
|
||||
if (sk.TrackingState == SkeletonTrackingState.Tracked)
|
||||
{
|
||||
this.SetLines(sk);
|
||||
this.SetPoints(sk);
|
||||
this.drawPlayer(sk);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SetLines(SkeletonData sk)
|
||||
private void drawPlayer(Skeleton sk)
|
||||
{
|
||||
JointID[,] id = {
|
||||
{ JointID.Head, JointID.ShoulderCenter },
|
||||
{ JointID.ShoulderCenter, JointID.ShoulderLeft },
|
||||
{ JointID.ShoulderCenter, JointID.ShoulderRight },
|
||||
{ JointID.ShoulderLeft, JointID.ElbowLeft },
|
||||
{ JointID.ShoulderRight, JointID.ElbowRight },
|
||||
{ JointID.ElbowLeft, JointID.WristLeft },
|
||||
{ JointID.ElbowRight, JointID.WristRight },
|
||||
{ JointID.WristLeft, JointID.HandLeft },
|
||||
{ JointID.WristRight, JointID.HandRight },
|
||||
{ JointID.ShoulderCenter, JointID.Spine },
|
||||
{ JointID.Spine, JointID.HipCenter },
|
||||
{ JointID.HipCenter, JointID.HipLeft },
|
||||
{ JointID.HipCenter, JointID.HipRight },
|
||||
{ JointID.HipLeft, JointID.KneeLeft },
|
||||
{ JointID.HipRight, JointID.KneeRight },
|
||||
{ JointID.KneeLeft, JointID.AnkleLeft },
|
||||
{ JointID.KneeRight, JointID.AnkleRight },
|
||||
{ JointID.AnkleLeft, JointID.FootLeft },
|
||||
{ JointID.AnkleRight, JointID.FootRight }
|
||||
this.SetPoints(sk);
|
||||
this.SetLines(sk);
|
||||
}
|
||||
|
||||
private void SetLines(Skeleton sk)
|
||||
{
|
||||
JointType[,] id = {
|
||||
{ JointType.Head, JointType.ShoulderCenter },
|
||||
{ JointType.ShoulderCenter, JointType.ShoulderLeft },
|
||||
{ JointType.ShoulderCenter, JointType.ShoulderRight },
|
||||
{ JointType.ShoulderLeft, JointType.ElbowLeft },
|
||||
{ JointType.ShoulderRight, JointType.ElbowRight },
|
||||
{ JointType.ElbowLeft, JointType.WristLeft },
|
||||
{ JointType.ElbowRight, JointType.WristRight },
|
||||
{ JointType.WristLeft, JointType.HandLeft },
|
||||
{ JointType.WristRight, JointType.HandRight },
|
||||
{ JointType.ShoulderCenter, JointType.Spine },
|
||||
{ JointType.Spine, JointType.HipCenter },
|
||||
{ JointType.HipCenter, JointType.HipLeft },
|
||||
{ JointType.HipCenter, JointType.HipRight },
|
||||
{ JointType.HipLeft, JointType.KneeLeft },
|
||||
{ JointType.HipRight, JointType.KneeRight },
|
||||
{ JointType.KneeLeft, JointType.AnkleLeft },
|
||||
{ JointType.KneeRight, JointType.AnkleRight },
|
||||
{ JointType.AnkleLeft, JointType.FootLeft },
|
||||
{ JointType.AnkleRight, JointType.FootRight }
|
||||
};
|
||||
for (int i = 0; i < id.Length / 2; i++)
|
||||
{
|
||||
Joint r1 = sk.Joints[id[i, 0]].ScaleTo(640, 480);
|
||||
Joint r2 = sk.Joints[id[i, 1]].ScaleTo(640, 480);
|
||||
|
||||
/**** */
|
||||
Line l = new Line();
|
||||
l.Stroke = Brushes.Blue;
|
||||
l.StrokeThickness = 5.0;
|
||||
@ -101,11 +185,13 @@ namespace Demo1
|
||||
l.X1 = r1.Position.X;
|
||||
l.Y2 = r2.Position.Y;
|
||||
l.X2 = r2.Position.X;
|
||||
/**** */
|
||||
|
||||
this.MainCanvas.Children.Add(l);
|
||||
}
|
||||
}
|
||||
|
||||
private void SetPoints(SkeletonData sk)
|
||||
private void SetPoints(Skeleton sk)
|
||||
{
|
||||
foreach (Joint joint in sk.Joints)
|
||||
{
|
||||
@ -121,28 +207,37 @@ namespace Demo1
|
||||
}
|
||||
}
|
||||
|
||||
void r_DepthFrameReady(object sender, ImageFrameReadyEventArgs e)
|
||||
/*void r_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
|
||||
{
|
||||
PlanarImage img = e.ImageFrame.Image;
|
||||
byte[] bh = cv.ConvertDepthFrameWithUser(img.Bits);
|
||||
imgDepth.Source = BitmapSource.Create(img.Width, img.Height,
|
||||
96, 96, PixelFormats.Bgr32, null,
|
||||
bh, img.Width * 4);
|
||||
//PlanarImage img = e.ImageFrame.Image;
|
||||
DepthImageFrame img = e.OpenDepthImageFrame();
|
||||
if(img == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
DepthImagePixel[] bs = new DepthImagePixel[img.PixelDataLength];
|
||||
img.CopyDepthImagePixelDataTo(bs);
|
||||
byte[] bh = cv.ConvertDepthFrameWithUser(bs, img.Width, img.Height);
|
||||
imgDepth.Source = BitmapSource.Create(img.Width, img.Height, 96, 96, PixelFormats.Bgr32, null, bh, img.Width * 4);
|
||||
//bh = cv.ConvertDepthFrameHiddenPlayer(img.Bits);
|
||||
//byte[] bh = cv.ConvertDepthFrame(img.Bits);
|
||||
//imgDepthPlayer.Source = BitmapSource.Create(img.Width, img.Height,
|
||||
// 96, 96, PixelFormats.Bgr32, null,
|
||||
// bh, img.Width * 4);
|
||||
}
|
||||
}*/
|
||||
|
||||
private void Window_KeyUp(object sender, KeyEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (e.Key == Key.OemPlus)
|
||||
_cam.ElevationAngle += 1;
|
||||
if (e.Key == Key.OemMinus)
|
||||
_cam.ElevationAngle -= 1;
|
||||
if (e.Key == Key.Up)
|
||||
{
|
||||
int k = r.ElevationAngle;
|
||||
k++;
|
||||
r.ElevationAngle = k;
|
||||
}
|
||||
if (e.Key == Key.Down)
|
||||
r.ElevationAngle -= 1;
|
||||
}
|
||||
catch (ArgumentOutOfRangeException outOfRangeException)
|
||||
{
|
||||
|
@ -1,4 +1,5 @@
|
||||
using Microsoft.Research.Kinect.Nui;
|
||||
using Microsoft.Kinect;
|
||||
using System.Windows;
|
||||
|
||||
namespace Demo1
|
||||
{
|
||||
@ -6,17 +7,15 @@ namespace Demo1
|
||||
{
|
||||
public static Joint ScaleTo(this Joint joint, int width, int height, float skeletonMaxX, float skeletonMaxY)
|
||||
{
|
||||
Vector pos = new Vector()
|
||||
SkeletonPoint pos = new SkeletonPoint()
|
||||
{
|
||||
X = Scale(width, skeletonMaxX, joint.Position.X),
|
||||
Y = Scale(height, skeletonMaxY, -joint.Position.Y),
|
||||
Z = joint.Position.Z,
|
||||
W = joint.Position.W
|
||||
Z = joint.Position.Z
|
||||
};
|
||||
|
||||
Joint j = new Joint()
|
||||
{
|
||||
ID = joint.ID,
|
||||
TrackingState = joint.TrackingState,
|
||||
Position = pos
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user