Hi,
I am currently trying to implement camera control with the Leap Motion in an
OpenSceneGraph world. However, the Leap has it's own frame function, like the
OSG viewer. Naturally, when I run both frame loops, they are not asynchronous.
They happen sequentially. I would like to set it up so that the graphics update
in my Leap frame loop; if this isn't possible, I would like to set it up so
that both loops are asynchronous and the Leap frames can send data to the
viewer frames to update the camera. In my attempt to create a custom loop,
mouse input is no longer recognized--the renderer / window freezes, but the
Leap keeps obtaining new frames in the console. (Two windows appear when I run
my program, the window with the OSG world and a console window that outputs
Leap data). If you want to look at the code I actually use, it's below.
Here's an example of setting up the Leap for a frame loop.
Code:
// Have the sample listener receive events from the controller
controller.addListener(listener);
// Keep this process running until Enter is pressed
std::cout Press Enter to quit... std::endl;
std::cin.get();
// Remove the sample listener when done
controller.removeListener(listener);
Here's an example of my attempt to update the scene within the Leap frame:
Code:
void SampleListener::onFrame(const Leap::Controller controller) {
// Get the most recent frame and report some basic information
const Leap::Frame frame = controller.frame();
std::cout Frame id: frame.id()
, timestamp: frame.timestamp()
, hands: frame.hands().count()
, fingers: frame.fingers().count()
, tools: frame.tools().count()
, gestures: frame.gestures().count() std::endl;
if(LeapFramesRunning) //LeapFramesRunning is true
{
viewer.frame();
}
if (!frame.hands().empty()) {
// Get the first hand
const Leap::Hand hand = frame.hands()[0];
// Check if the hand has any fingers
const Leap::FingerList fingers = hand.fingers();
if (!fingers.empty()) {
// Calculate the hand's average finger tip position
Leap::Vector avgPos;
for (int i = 0; i fingers.count(); ++i) {
avgPos += fingers[i].tipPosition();
}
avgPos /= (float)fingers.count();
std::cout Hand has fingers.count()
fingers, average finger tip position avgPos
std::endl;
}
// Get the hand's sphere radius and palm position
std::cout Hand sphere radius: hand.sphereRadius()
mm, palm position: hand.palmPosition() std::endl;
// Get the hand's normal vector and direction
const Leap::Vector normal = hand.palmNormal();
const Leap::Vector direction = hand.direction();
// Calculate the hand's pitch, roll, and yaw angles
std::cout Hand pitch: direction.pitch() * Leap::RAD_TO_DEG
degrees,
roll: normal.roll() * Leap::RAD_TO_DEG degrees,
yaw: direction.yaw() * Leap::RAD_TO_DEG degrees
std::endl;
}
// Get gestures
const Leap::GestureList gestures = frame.gestures();
for (int g = 0; g gestures.count(); ++g) {
Leap::Gesture gesture = gestures[g];
switch (gesture.type()) {
case Leap::Gesture::TYPE_CIRCLE:
{
Leap::CircleGesture circle = gesture;
std::string clockwiseness;
if (circle.pointable().direction().angleTo(circle.normal()) =
Leap::PI/4) {
clockwiseness = clockwise;
} else {
clockwiseness = counterclockwise;
}
// Calculate angle swept since last frame
float sweptAngle = 0;
if (circle.state() != Leap::Gesture::STATE_START) {
Leap::CircleGesture previousUpdate =
Leap::CircleGesture(controller.frame(1).gesture(circle.id()));
sweptAngle = (circle.progress() - previousUpdate.progress()) * 2 *
Leap::PI;
}
std::cout Circle id: gesture.id()
, state: gesture.state()
, progress: circle.progress()
, radius: circle.radius()
, angle sweptAngle * Leap::RAD_TO_DEG
, clockwiseness std::endl;
break;
}
case Leap::Gesture::TYPE_SWIPE:
{
Leap::SwipeGesture swipe = gesture;
std::cout Swipe id: gesture.id()
, state: gesture.state()
, direction: swipe.direction()
, speed: swipe.speed() std::endl;
break;
}
case Leap::Gesture::TYPE_KEY_TAP:
{
Leap::KeyTapGesture tap = gesture;
std::cout Key Tap id: gesture.id()
, state: gesture.state()
, position: tap.position()
, direction: tap.direction() std::endl;
break;
}
case Leap::Gesture::TYPE_SCREEN_TAP:
{
Leap::ScreenTapGesture screentap = gesture;