RuZman

4521

Illustration

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:

Leap Motion Controller

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);
	}

Demonstration