スキップしてメイン コンテンツに移動

C#とLeapMotionでカーソルを操作する

Leap Motion: Move Cursorを参考に、 C#とLeapMotionを使ったカーソル操作のためのコードを、 なるべく簡素に記述します。

※VisualStudio2012を利用しています。

  1. LeapMotion用に、dllの参照などを設定しておきます。
    LeapMotionをC#で使う方法を参照。
  2. Consoleアプリケーションを作成します。
  3. マウスを動かすためのWin32APIを呼び出すクラスを準備します。
  4. using System.Runtime.InteropServices;
    
    namespace MoveCursor
    {
        class MouseCursor
        {
            [DllImport("user32.dll")]
            private static extern bool SetCursorPos(int x, int y);
    
            public static void MoveCursor(int x, int y)
            {
                SetCursorPos(x, y);
            }
        }
    }
    
  5. LeapMotionの動作の根幹となるクラスを作成します。
  6. using System;
    using Leap;
    
    namespace MoveCursor
    {
        class LeapListnerMin : Listener
        {
            public override void OnInit(Controller cntrlr)
            {
                Console.WriteLine("Initialized");
            }
    
            public override void OnConnect(Controller cntrlr)
            {
                Console.WriteLine("Connected");
            }
    
            public override void OnDisconnect(Controller cntrlr)
            {
                Console.WriteLine("Disconnected");
            }
    
            public override void OnExit(Controller cntrlr)
            {
                Console.WriteLine("Exited");
            }
    
            public override void OnFrame(Controller cntrl)
            {
                Frame currentFrame = cntrl.Frame();
    
                // スクリーンに一番近い指を取得している。
                Finger finger = currentFrame.Fingers[0];
                Screen screen = 
                    cntrl.CalibratedScreens.ClosestScreenHit(finger);
    
                // スクリーンとLeapMotion上の指の位置を合成するために、
                // 一度正規化している。
                var xScreenIntersect = screen.Intersect(finger, true).x;
                var yScreenIntersect = screen.Intersect(finger, true).y;
    
                // 上記で取得した値を元に、指の位置をマウスの位置へ計算する。
                // LeapMotionの場合、x軸・y軸の0は画面左下になるため、
                // y座標をscreenHeitPixelsから差分を計算する必要がある。
                var x = (int)(xScreenIntersect * screen.WidthPixels);
                var y = (int)(screen.HeightPixels - 
                    (yScreenIntersect * screen.HeightPixels));
    
                MouseCursor.MoveCursor(x, y);
            }
        }
    }
    
  7. 最後にMainを作成します。
  8. using System;
    using Leap;
    
    namespace MoveCursor
    {
        class Program
        {
            static void Main(string[] args)
            {
                Controller cntrl = new Controller();
                LeapListnerMin leapListner = new LeapListnerMin();
    
                cntrl.AddListener(leapListner);
    
                Console.WriteLine("Press Enter to quit...");
                Console.ReadLine();
    
                cntrl.RemoveListener(leapListner);
                cntrl.Dispose();
            }
        }
    }
    
  9. あとは実行すれば手でマウスカーソルが動かせるはずです。
次回はUnityとLeapMotionの組み合わせを記載する予定です。

コメント

このブログの人気の投稿

間違ったフォーマットのプログラムじゃないんだけど

以下エラーに対し、 ファイルまたはアセンブリ 'SSPI'、またはその依存関係の 1 つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。 以下環境で対応した話です。 VisualStudio2012(C# ASP.NET MVC4.0) IIS7.5 とあるところのdllを使用中 ASP.NETをIISに発行しようとしたら、上記エラーが発生。 他のプロジェクトでは問題なく発行できているのに、 何かと思ってみたら、google先生に尋ねてみると、 DLLファイルの対象プラットフォーム(32bit/64bit)が異なる とのことでした。 このサイトでは対処方法として、 運用環境のプラットフォームに合わせ、適切なランタイムファイルを配布してください。 と記載されていますが、今回の私のようにとあるところのdllを使用している場合などは、 そうもいかない場合もあるでしょう。 そこでdllを変更できない場合には、 IISのアプリケーションプールの設定で、 32bitアプリケーションを有効化してあげることで対応できます。 以下手順です。 コントロールパネル → 管理ツール → インターネット インフォメーション サービス (IIS) マネージャー を起動します。 変更したいアプリケーションを右クリックして、詳細設定を選択します。 32ビットアプリケーションの有効化をTrueに変更します。 もう一度発行します。 ここまでです。 簡単だけど知らないとなかなかはまるかなって気がしますね。 独特のくせなのかもしれません。 そして、次なるエラー発生中です・・・。

SQLServer2008でのトランザクションログの切り捨て方

SQL Server 2008でとあるDBのトランザクションログが一杯に。 BACKUP LOG DatabaseName WITH TRUNCATE_ONLY を使ってトランケートしようとしたら、 'TRUNCATE_ONLY' はBACKUP オプションとして認識されません。 との冷たい返事。2008で廃止されていたのを忘れていた。 SQL Server 2008 で廃止されたデータベース エンジンの機能@MSDN そこでヌルデバイスを使用してバックアップを取得する方法で、切り捨てを試みる。 BACKUP LOG DatabaseName TO DISK = ‘nul’ GO するとまた冷たい返事。 現在、データベースのバックアップが存在しないので、BACKUP LOG を実行できません。 2008では過去にフルバックアップを取得しておかないと、ランザクションのバックアップが取得できないことを忘れてた。てなわけで、まずはデータベースのフルバックアップを取得して、 BACKUP DATABASE DatabaseName TO DISK = ‘nul’ GO もう一度トランザクションのバックアップをして、やっと切り捨てれた。最初から単純にしておけばよかった・・・。

HP Pavilion Desktop PC h8-1080jp のSSDの交換方法

Windows起動時にDiskの読み取りエラーが発生し、 マシンが上がってこなくなってきたのでSSDを交換した。 HP製のマシンを使っているのだが、微妙にどう外すか戸惑った。 外し方が書いてあるのだが、とにかく見えにくい!! と言う訳で誰かの参考になればと思って、 以下にログを残しておきます。 側面を外します。 前面も外します。 真ん中の金具がねじが止まっているので外します。 ここまでは楽勝でした。 HDDが入ってるやつがなかなか外れない・・・と思っていたら、 よーく見ると赤枠のところに外し方が書いてあります。 奥にあるボタンを押す HDDが入っている箱(?)を上に持ち上げるようにすると外れます 外れるとこんな感じに。 後はケーブルを差し替えればOKです。 会社のノートPCも壊れるし、そういう時期なんだろうか・・・。 開けたら東芝の1.8インチHDDで、なかなかデータが吸い出せないし・・・。 やれやれです。