Начинающий программист: уроки Java (обработка) и Leap Motion Controller?

#java #processing #leap-motion

#java #обработка #leap-motion

Вопрос:

У меня очень мало опыта в программировании, и для прототипа моего университетского проекта мне нужно закодировать изображение (изображение в обработке) для перемещения с помощью рук (ввод контроллера Leap Motion).

На данный момент я застрял на том, как заставить мое изображение перемещаться, используя положение моей руки, но появляется ошибка, в которой говорится, что изображение может использовать только числа с плавающей запятой в качестве входных данных, поскольку положение руки вычисляется с использованием класса PVector. Я пытался использовать float[] (name) = handpos.array(); , чтобы сделать его значением с плавающей запятой, но тогда я не могу получить значения x и y из позиции, необходимой для изображения.

Вот код, который я сделал до сих пор, в цикле for, где я планировал добавить изображение для отображения.

 import de.voidplus.leapmotion.*;

LeapMotion leap;

//Assets
PImage hand;
//Colours
color ocean = color(50,113,250);

void setup(){
  size(700, 700);
  background(255);
  leap = new LeapMotion(this);
  hand = loadImage("images/hand.png");
  imageMode(CENTER);
}

void draw() {
background (ocean);
int fps = leap.getFrameRate();
  for (Hand hand : leap.getHands ()) {
    Finger index = hand.getIndexFinger();
    PVector hpos = hand.getPosition(); 
    PVector ipos = index.getPosition(); 
}
 
}
  

Ответ №1:

Ответ Дитриха правильный ( 1).

Есть несколько предостережений. Ошибка, которую вы получаете (ожидает такие параметры, как: «изображение (изображение, плавающее, плавающее)»), вызвана затенением переменной

Вы, вероятно, пытаетесь отобразить hand изображение внутри цикла for, однако цикл использует локальную переменную с тем же именем ( hand ) , которая в данном случае является экземпляром LeapMotion Hand , а не a PImage .

Переменная цикла for ( Hand экземпляр) затеняет глобальную переменную ( PImage переменную).

Ошибка возникает из-за того, что он пытается отобразить LeapMotion Hand вместо вашего PImage .

Вы могли бы просто переименовать локальную переменную:

 import de.voidplus.leapmotion.*;

LeapMotion leap;

//Assets
PImage hand;
//Colours
color ocean = color(50, 113, 250);

void setup() {
  size(700, 700);
  background(255);
  leap = new LeapMotion(this);
  hand = loadImage("images/hand.png");
  imageMode(CENTER);
}

void draw() {
  background (ocean);
  int fps = leap.getFrameRate();
  for (Hand leapHand : leap.getHands ()) {
    Finger index = leapHand.getIndexFinger();
    PVector hpos = leapHand.getPosition(); 
    PVector ipos = index.getPosition();
    image(hand, hpos.x, hpos.y);
  }
}
  

Это будет отображать несколько изображений на руку.

Если вы хотите отобразить одно изображение для одной руки, вы можете сделать несколько вещей.

Вы можете извлечь позицию из цикла, что означает, что самая последняя рука будет контролировать положение изображения:

 import de.voidplus.leapmotion.*;

LeapMotion leap;

//Assets
PImage hand;
//Colours
color ocean = color(50, 113, 250);

PVector handPosition = new PVector();

void setup() {
  size(700, 700);
  background(255);
  leap = new LeapMotion(this);
  hand = loadImage("images/hand.png");
  imageMode(CENTER);
}

void draw() {
  background (ocean);
  int fps = leap.getFrameRate();
  // hand inside is the loop is a Leap Hand instance, shadowing the PImage
  for (Hand hand : leap.getHands ()) {
    Finger index = hand.getIndexFinger();
    PVector hpos = hand.getPosition(); 
    PVector ipos = index.getPosition();
    handPosition.set(hand.getPosition());
  }
  // hand here is your PImage
  image(hand, handPosition.x, handPosition.y);
  
}
  

или вы могли бы использовать, например, из первых рук:

 import de.voidplus.leapmotion.*;

LeapMotion leap;

//Assets
PImage hand;
//Colours
color ocean = color(50, 113, 250);

PVector handPosition = new PVector();

void setup() {
  size(700, 700);
  background(255);
  leap = new LeapMotion(this);
  hand = loadImage("images/hand.png");
  imageMode(CENTER);
}

void draw() {
  background (ocean);
  int fps = leap.getFrameRate();
  // try to read first hand data
  Hand firstHand = leap.getHand(0);
  // check if there is actual data (at least one hand is present)
  if(firstHand != null){
    // read hand's position
    PVector handPosition = hand.getPosition();
    // render image to hand's position
    image(hand, handPosition.x, handPosition.y);
  }
  
}
  

Есть много способов сделать это, это зависит от того, что имеет смысл для пользовательского интерфейса вашего проекта.

Ответ №2:

Если я правильно понимаю вашу проблему, вы можете сделать это следующим образом:

 image(hand, hpos.x, hpos.y)
  

Комментарии:

1. Сначала я попробовал это, но ошибка: функция «image ()» ожидает появления параметров типа: «изображение (PImage, float, float)».