Leap Motion JavaFX - Grafiktablett
Zoltan Ruzman 4471
Abstract
Ein gekippter Leap Motion Controller eröffnet uns neue Anwendungsszenarien. Eines davon ist die JavaFX-Applikation JSideways. JSideways zeigt, wie der Leap Motion Controller als Grafiktablett-Ersatz genutzt werden kann.
Leap Motion Controller
Damit der Leap Motion Controller einen Stift auf dem Tisch wahrnimmt, wird dieser seitlich vor dem Bildschirm gestellt:
Anmerkung: Das grüne Licht befindet sich auf der Unterseite. Es ist zwar ohne Probleme möglich den Leap Motion Controller umgekehrt zu positionieren, aber dann ist auch das Koordinatensystem anzupassen.
Positionsbestimmung
Nach einigen Tests hat sich herausgestellt, dass der Leap Motion Controller Stifte mit einer Höhe von mindestens 10 Zentimeter erfassen kann. Der Stift wird dabei in der normalen Schreibposition gehalten. Erfasst wird der hintere Teil des Stifts. Über den Richtungsvektor des Stifts lässt sich der Schnittpunkt mit dem Tisch und somit die exakte Lage der Stiftspitze bestimmen. Soweit wird das Quellcodebeispiel erst einmal nicht gehen, da in diesem Artikel lediglich prinzipiell geprüft wird, ob sich die Leap Motion als Grafiktablett-Ersatz anbietet. Aus diesem Grund ist es notwendig den Stift vertikal zu halten und zu bewegen.
Wie üblich wird eine imaginäre Fläche (auf dem Tisch) festgelegt, die anschließend in Bildschirmkoordinaten umgerechnet wird. In diesem Fall muss die X-Koordinate um die halbe Flächenbreite nach rechts geschoben werden. Zusätzlich wird der Abstand zur Leap Motion festgelegt, denn wenn sich der Stift unmittelbar davor befindet, kann der Leap Motion Controller nichts erfassen.
Anschließend wird die Position auf ein Array mit 10x10 Pixel großen Flächen umgerechnet, welches den gesamten Bildschirm abdeckt. Beim Zeichnen wird jeweils ein Punkt in die passende Arrayposition gelegt. Das wird gemacht, um unschöne Mikroruckler zu vermeiden. Wer sich die Bildschirmausgabe noch nicht vorstellen kann, sollte einen Blick auf die Illustration ganz oben werfen. Sobald der Stift eine bestimmte Höhe unterschreitet wird die Aktion zum Zeichnen aufgerufen.
Tool tool = LeapApp.getController().frame().tools().get(0);
int x = (int) tool.stabilizedTipPosition().getX() + TABLE_WIDTH / 2;
int y = (int) tool.stabilizedTipPosition().getY() - DISTANCE_TO_LEAP;
float z = tool.tipPosition().getZ();
x = 5 + x * LeapApp.getDisplayWidth() / circles.length;
y = 5 + y * LeapApp.getDisplayHeight() / circles[0].length;
circle.setTranslateX(x);
circle.setTranslateY(y);
x = x / 10;
y = y / 10;
if (x >= 0 && y >= 0 && x < circles.length
&& y < circles[x].length && z > -PENCIL_HEIGHT) {
circles[x][y].setFill(color);
}