Kinect: захват/отпускание

Я новичок в программировании Kinect. Тем не менее, я читал различные учебники и тексты об этом. Кроме того, я работал над примерами кода ("Controls Basis-WPF"). К сожалению, ни один из источников не учит меня захвату и выпуску кода так, как я понимаю.

Я хотел бы динамически создавать KinectTileButtons. Во время работы программы пользователь должен иметь возможность размещать кнопки в нужных ему положениях. Игрок использует свою руку в качестве курсора. Например: В верхнем левом углу есть кнопка b1. Пока рука пользователя не находится на b1, баттон не меняет своего положения. Если рука пользователя находится на кнопке И он делает жест "ЗАХВАТ", положение кнопки аналогично положению его руки (переменное положение). Когда он ОТПУСКАЕТ, положение кнопки остается постоянным и не изменится до тех пор, пока пользователь не схватит кнопку в следующий раз.

Я очень благодарен за любые советы, предложения или примеры кода, потому что я действительно не знаю, как мне продолжать работать над этой проблемой.

Заранее спасибо


person user3428544    schedule 17.03.2014    source источник


Ответы (1)


То, что вы должны сделать, это изменить расположение кнопок в окне. У меня было бы несколько глобальных bool для обозначения того, что они захватывают и удерживают. Затем я бы поставил условие в обновлении, чтобы переместить метку в положение руки. Вот некоторый псевдокод:

bool grabbing = false;
bool selected = false;
var button;
var handElement;

Start()
{
    button = window.Button;
    handElement = window.handElement;
    ...
    sensor.Start();
}

Update() //all frames ready
{
    using (SkeletonFrame sf = e.OpenSkeletonFrame())
    {
        ... //get skeleton and position

        ... //tell if grabbing
        if (/*however you do the grab gesture*/)
            grabbing = true;

        if (selected && grabbing)
        {
            button.X = handElement.X;
            button.Y = handElement.Y;
        }
    }
}

Button_OnClick()//or whatever it is called for the Kinect UI control
{
    selected = true;
}

Извините за псевдокод, просто я раньше не работал с Kinect UI, и мне не хотелось иметь половину псевдокода с элементами, которых я не знаю, однако я знаю, что в нем есть события вроде OnClick() для когда он удерживается, и я не знаю, что вы подразумеваете под жестом «GRAB», но я предполагаю, что вы знаете, как его реализовать, если знаете, что это такое. Удачи!

Знайте также, что это работает только для одной кнопки. Если бы вы делали это для многих, я бы предложил класс... что-то вроде:

class MoveableButton : KinectButton//again, don't know the exact name of this
{
    private int X, Y;
    private bool selected = false, grabbing = false;

    public void Selected()
    {
        selected = true;
    }

    public void Grabbed()
    {
        grabbing = true;
    }

    public void LetGo()
    {
        grabbing = false;
        selected = false;
    }

    public void Update(UIElement hand)
    {
        if (selected && grabbing)
        {
            this.X = hand.X;
            this.Y = hand.Y;
        }
    }
}

Затем вы бы вызывали соответствующие методы во время определенных кадров, у меня был бы массив из них для цикла для Update.

person Liam McInroy    schedule 17.03.2014
comment
Большое спасибо за ответ. В настоящее время GRABBING реализован в private void InteractionStreamOnInteractionFrameReady...if (hand.HandEventType == InteractionHandEventType.Grip). К сожалению, этого недостаточно, потому что в течение одной секунды происходит несколько захватов и выпусков. Поэтому мне нужно более точное решение, которое точно разделяет разные состояния (нормальное, захват, освобождение). - person user3428544; 17.03.2014
comment
Итак, любые другие предложения? - person user3428544; 18.03.2014
comment
@user3428544 user3428544 Это все усложняет - person Liam McInroy; 18.03.2014
comment
@user3428544 user3428544 Итак, проблема в том, что InteractionHandEventType.Grip недостаточно точен? - person Liam McInroy; 24.03.2014
comment
Тип события достаточно точен, но не так, как он запускается. - person user3428544; 08.04.2014
comment
@ user3428544 Что ты имеешь в виду? - person Liam McInroy; 09.04.2014