こんにちは、もとい、こんばんは。
脇保です。
今日は久しぶりにJavaをいじってみました。
Javaで何をしたかというと、LeapMotionを使った、ツールが欲しいと思いまして。
LeapMotion、曖昧な使い方ができるインターフェースだと思います。
すごく語弊のある形で書くと。
正確性の求められる操作では厳しいかもですが、ある程度緩い操作なら、
こちらのほうが素早くできるかもと思いまして。
LeapMotionはかなり前に中古で買って持っていて、これで何かしたいなと。
で、いざ買ったらそれで満足して放置してた訳ですが。
んで、Javaを再びいじりたいと思い、その取っ掛かりに候補と上がったのが、
LeapMotionという訳です。
さて、早速作業に入りましょう。
先ず、何はなくとも最新版のLeapMotionのデベロッパーキットを
手に入れないと何も始まりません。
LeapMotionのデベロッパー向け公式サイトにアクセスします。
https://developer.leapmotion.com/get-started
で、ログインするなり、まだ登録してない人は登録するなりします。
すると、最新版のデベロッパーキットをダウンロードできます。
今回使うのは、Windows環境でJava言語。
LeapSDKlibフォルダに、LeapJava.jarファイルがあります。
そして、今いるフォルダに、x64とx86というフォルダがあるので、
それも後で使います。
次にEclipse(でなくても(例えばNetBeans)でもいいけど)。
Eclepse日本語版公式サイトから、最新版をダウンロードします。
http://mergedoc.osdn.jp/
ダウンロードが終わったら、今度はサンプルを開きます。
LeapSDKsamplesに、Sample.javaがあります。
で、新規JavaProjectを作り、Cllassを作ります。
Cllassを作ったら、サンプルを貼り付けます。
次に、JavaProjectを右クリックして、
ビルド・パス(B)>外部アーカイブの追加(V )を、
右クリックメニューの中から探して、選択します。
すると、ファイル選択ウインドウが出るので、
先ほど解凍したLeapMotionデベロッパーキットの、
LeapSDKlibフォルダの、LeapJava.jarファイルを、
選択します。
次に、登録された、参照ライブラリのLeapJavaを選択して、
右クリックします。
先ほどと同じく、
ビルド・パス(B)>ビルドパスの構成(C )を、
右クリックメニューの中から探して、選択します。
そしたら、ネイティブライブラリ・ロケーションパスというものを、
設定します。
この値に、先に記した、LeapSDKlibフォルダにある、
x64かx86を選択します。
32Bitなら、x86、
64Bitなら、x64、
になります。
これで、漸くサンプルを実行する環境が整いました。
で、実行します。
サンプルは、ログに色々とLeaMotionの値が吐き出されるというものでした。
先ずは、実行結果を見ながら、ソースとにらめっこ。
で、流れが判ったら、早速書いていきます。
因みに、これだけだと判りづらいかもですが、
公式サイト
https://developer.leapmotion.com/documentation/java/devguide/Sample_Tutorial.html
に、HelloWorldがあるので、これを参考にするといいかもです。
記事は英語ですが、ダウンロードしたキットのソースと、
記事はある程度一緒なので、とても参考になります。
で、早速書きます。
新規にProjectを立ち上げるもよし、書き換えて編集するもよし。
因みに自分はサンプルをいじって作りました。
今回するべきことは、
値をGUI上に持っていきたい(ウィンドウ上にログを表示したい)
値を取得して変数に入れたい
変数の値を処理にかけて色々何かしたい。
です。
面白そうです、頑張って作っていこう。
参考にしたサイト
Hello World
https://developer.leapmotion.com/documentation/java/devguide/Sample_Tutorial.html
LeapMotionのサンプルプログラムで遊んだ
http://artak.hatenablog.com/entry/2014/02/17/221344
以下、ソース
import java.awt.BorderLayout;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import com.leapmotion.leap.Arm;
import com.leapmotion.leap.Bone;
import com.leapmotion.leap.Controller;
import com.leapmotion.leap.Finger;
import com.leapmotion.leap.Frame;
import com.leapmotion.leap.Hand;
import com.leapmotion.leap.Listener;
import com.leapmotion.leap.Vector;
/**
* @author yuhi
*
*/
class GValue
{
/**
* グローバル変数
*/
public static String s1;
public static Integer hnd;
public static Integer fing;
public static Integer hndOfLorR;
public static Vector elbPos;
public static Vector wstPos;
}
class GSwing
{
/**
* グローバルSwingオブジェクト
*/
public static JFrame frame = new JFrame(“タイトル”);
public static JPanel p = new JPanel();
public static JTextArea label1 = new JTextArea(20,20);
public static JScrollPane scp = new JScrollPane(label1);
}
public class Sample {
/**
* @param args
*/
public static void form_create()
{
GSwing.frame.setBounds(200, 200, 400, 400);
GSwing.frame.setVisible(true);
GSwing.p.add(GSwing.scp);
GSwing.frame.add(GSwing.p, BorderLayout.CENTER);
}
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
// Create a sample listener and controller
form_create();
SampleListener2 listener = new SampleListener2();
Controller controller = new Controller();
// Have the sample listener receive events from the controller
controller.addListener(listener);
// Keep this process running until Enter is pressed
GValue.s1 =”Press Enter to quit…”;
GSwing.label1.setText(GValue.s1);
GSwing.p.repaint();
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
// Remove the sample listener when done
controller.removeListener(listener);
}
}
class SampleListener1 extends Listener {
public void onConnect(Controller controller) {
GValue.s1 = “Connected”;
GSwing.label1.setText(GValue.s1);
GSwing.p.repaint();
}
public void onFrame(Controller controller) {
Frame frame = controller.frame();
GValue.s1 = “Frame id: ” + frame.id()
+ “, timestamp: ” + frame.timestamp()
+ “, hands: ” + frame.hands().count()
+ “, fingers: ” + frame.fingers().count();
GSwing.label1.setText(GValue.s1);
GSwing.p.repaint();
}
}
class SampleListener2 extends Listener {
public class AppFrame extends Frame {
public void paint(){
if ( GValue.hnd > 0 ) {
//ここに行いたい処理を書く
//JOptionPane.showMessageDialog(null, “手の数:” + GValue.hnd.toString());
}
if ( GValue.fing > 0 ) {
//ここに行いたい処理を書く
//JOptionPane.showMessageDialog(null, “指の数:” + GValue.fing.toString());
}
if ( GValue.hndOfLorR > 0 ) {
//ここに行いたい処理を書く
//JOptionPane.showMessageDialog(null, “右手か左手か:” + GValue.hndOfLorR.toString());
}
}
}
AppFrame f;
public void onFrame(Controller controller) {
// Get the most recent frame and report some basic information
Frame frame = controller.frame();
GValue.s1 = “Frame id: ” + frame.id()+”n”
+ “, timestamp: ” + frame.timestamp()+”n”
+ “, hands: ” + frame.hands().count()+”n”
+ “, fingers: ” + frame.fingers().count()+”n”;
GValue.hnd = frame.hands().count();
GValue.fing = frame.fingers().count();
GSwing.label1.setText(GValue.s1);
GSwing.p.repaint();
//Get hands
for(Hand hand : frame.hands()) {
String handType = hand.isLeft() ? “Left hand” : “Right hand”;
GValue.s1 =(” ” + handType + “, id: ” + hand.id() +”n”
+ “, palm position: ” + hand.palmPosition())+”n”;
GSwing.label1.setText(GValue.s1);
GSwing.p.repaint();
GValue.hndOfLorR = hand.id();
// Get the hand’s normal vector and direction
com.leapmotion.leap.Vector normal = hand.palmNormal();
com.leapmotion.leap.Vector direction = hand.direction();
// Calculate the hand’s pitch, roll, and yaw angles
GValue.s1 =(” pitch: ” + Math.toDegrees(direction.pitch()) + ” degrees,n”
+ “roll: ” + Math.toDegrees(normal.roll()) + ” degrees, n”
+ “yaw: ” + Math.toDegrees(direction.yaw()) + ” degreesn”);
GSwing.label1.setText(GValue.s1);
GSwing.p.repaint();
// Get arm bone
Arm arm = hand.arm();
GValue.s1 =(” Arm direction: ” + arm.direction()+”n”
+ “, wrist position: ” + arm.wristPosition()+”n”
+ “, elbow position: ” + arm.elbowPosition())+”n”;
GSwing.label1.setText(GValue.s1);
GSwing.p.repaint();
GValue.wstPos = arm.wristPosition();
GValue.elbPos = arm.elbowPosition();
// Get fingers
for (Finger finger : hand.fingers()) {
GValue.s1 =(” ” + finger.type() + “, id: ” + finger.id()+”n”
+ “, length: ” + finger.length()+”n”
+ “mm, width: ” + finger.width() + “mm”)+”n”;
GSwing.label1.setText(GValue.s1);
GSwing.p.repaint();
//Get Bones
for(Bone.Type boneType : Bone.Type.values()) {
Bone bone = finger.bone(boneType);
GValue.s1=(” ” + bone.type()+”n”
+ ” bone, start: ” + bone.prevJoint()+”n”
+ “, end: ” + bone.nextJoint()+”n”
+ “, direction: ” + bone.direction())+”n”;
GSwing.label1.setText(GValue.s1);
GSwing.p.repaint();
}
}
f.paint();
}
}
}