Kinect をOpenTK
アプリケーションで使用しています。あるクラスではWindowLoaded
、メソッドを使用します。このメソッドは、ループ呼び出しSensorSkeletonFrameReady
で、計算された右手の座標をコンソールに書き込みます。
メイン ウィンドウ クラスで を呼び出しますOnRenderFrame
。これは、ループで立方体をビューポートに描画します。
したがって、基本的にSensorSkeletonFrameReady
は kinectControl からOnRenderFrame
メイン ウィンドウ クラスに座標を送信する必要があります。
スレッドでこれを達成しようとしましたが、値を送信する方法がわかりません。
編集:
これはメインウィンドウ クラスです。
...
public class MainWindow : GameWindow
{
...
/*Kinect thread start*/
kinectControl kinectObject = new kinectControl();
Thread oThread = new Thread(new ThreadStart(kinectObject.WindowLoaded));
oThread.Start();
...
protected override void OnRenderFrame(FrameEventArgs e)
{
...
//Here I need get coordinates from kinectControl
DrawCube();
...
そして、これは kinectControl クラスです:
...
private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
...
foreach (Skeleton skeleton in skeletons)
{
Joint rightHand = skeleton.Joints[JointType.HandRight];
Joint leftHand = skeleton.Joints[JointType.HandLeft];
Joint head = skeleton.Joints[JointType.Head];
double leftY = leftHand.Position.Y;
double headY = head.Position.Y;
// get the individual points of the right hand
double rightX = rightHand.Position.X;
double rightY = rightHand.Position.Y;
double rightZ = rightHand.Position.Z;
//here I need send this coordinates to mainwindow class
...
Edit2: 解決策を見つけました。イベントを登録する代わりに、OnRenderFrame メソッドの OpenNextFrame メソッドでポーリングを使用します。
public void findSkeleton()//random name of function
{
Skeleton[] skeletons = new Skeleton[0];
SkeletonFrame skeletonFrame = this.sensor.SkeletonStream.OpenNextFrame(0);
if (skeletonFrame != null)
{
skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
skeletonFrame.CopySkeletonDataTo(skeletons);
}
...//rest is the same as in SensorSkeletonFrameReady event