ã¯ããã«
8ææ«ã« Leap Motion ãå ¬å¼ã§ã¹ãã¬ãªã®èµ¤å¤ç»ã®åå¾ã® API ã®å ¬éã¨ãVR ç¨ã®ã½ããã¦ã§ã¢ç¾¤ãããã³ Oculus Rift DK2 ãã¦ã³ã¿ãå ¬éãã¾ããã
ãµã³ãã«ãå¹¾ã¤ãç¨æããã¦ãã¦è©¦ããã¨ãåºæ¥ã¾ãããã¦ã³ã¿ã¯è²·ããã¨ã両é¢ãã¼ãããã¸ãã¯ãã¼ãã§ãã£ã¤ããã°åé¡ãªãåä½ãã¾ããã3D ããªã³ã¿ããæã¡ã§ããã°ãã¼ã¿ãå ¬éããã¦ããã®ã§ãèªåã§ç¨æãããã¨ãå¯è½ã§ãã
- Ultraleap Gallery – Demos and experiments from the Ultraleap and our community. Share yours today.
- Leap Motion VR Developer Mount by LeapMotion - Thingiverse
ã¹ãã¬ãªã®èµ¤å¤ã«ã¡ã©ç»ã両ç®ã«å±éãã¦ãAR çã«ãã®çµµã«ã´ã£ããåãå½¢ã§æã® 3D ã¢ãã«ãéç³ããã¾ããããã¯èªåã®æã VR å ã®ãªãã¸ã§ã¯ãã«ç°¡åã«å¹²æ¸ã§ãããã¨ãæå³ããã¨ã¦ãè¡æçãªä½é¨ã§ãããä»åã®ã¢ãããã¼ãã«ããããããã¦ã³ãã©ããã³ã°ï¼HMD ãã¸ã·ã§ã³ããã®æå½¢ç¶ã®ãã©ããã³ã°ï¼ãå¤§å¹ ã«æ¹è¯ããã以å Leap Motion ãã¦ã³ã¿ã使ã£ãããã¨ã¯å ¨ãç°ãªãä½é¨ã¨ãªã£ã¦ãã¾ãã
ä»åã¯ãã®è©³ç´°ãªä»çµã¿ã«ã¤ãã¦èª¿ã¹ã¦ã¿ã¾ããã®ã§ãç´¹ä»ãã¾ãã
Unity ãµã³ãã«
以ä¸ã« Leap Motion VR ç¨ã® Unity ãµã³ãã«ãä¸ãã£ã¦ãã¾ãã
LeapOculusPassthrough.unitypackage ããã¦ã³ãã¼ãã㦠Assets ä¸ã«ãã LeapOculusPassthrough ã·ã¼ã³ãéãã¨æ¬¡ã®ãããªç»é¢ã表示ããã¾ãã

Editor æ¡å¼µã§ Hand Controller ã® Gizmo ã« Leap Motion ã¢ã¤ã³ã³ã表示ãã¦ããã®ãããããããã¦è¯ãã§ãããå®è¡ããã¨ä»¥ä¸ã®ããã«æªã¿è£æ£ãããã«ã¡ã©ç»ã«ãèªèããæã«ã´ã£ããåãå½¢ã§æãªãã¸ã§ã¯ããéç³ãããåé ã®ãµã³ãã«ã®ãããªç»é¢ãåä½ãã¾ãã

ã«ã¡ã©ãã«ã¡ã©ç»ãéç³ãããã¬ã¼ã³ãæãªãã¸ã§ã¯ãããã®ä»ã®ãªãã¸ã§ã¯ãã®ä½ç½®é¢ä¿ã¯ãã®é ã§æ¬¡ã®ããã«ãªã£ã¦ãã¾ãã

ã«ã¡ã©ç»ã表示ãããã¬ã¼ã³ã Leap Motion ã®æã®ä½ç½®ã®åç¹ã¨ãªã HandController㯠OVRCameraController ã®åã¨ãªã£ã¦ããã®ã§ãOculus Rift ã®ããããã©ããã³ã°ã«è¿½å¾ãã¦ãã®ä½ç½®ãå¤ãããããé¡ã®åãã¨ããããè¦ããæã®ä½ç½®ã¯å¸¸ã«ä¸è´ãã¦ããã¾ãã
ããã§ã¯ãã¾ãç»ãã©ããã£ã¦åå¾ãã¦ããã®ãè¦ã¦ã¿ã¾ãããã
Leap Motion ããã®ç»ã®åå¾
ç»ã®åå¾ã«ã¤ãã¦ã¯ä»¥ä¸ã®ããã¥ã¡ã³ããåèã«ãªãã¾ãã
ããããã¥ã¡ã³ããã¼ã¹ã ã¨é£½ããã®ã§å®éã«åãã¦ããã¹ã¯ãªããã§è¦ã¦è¡ãã¾ããããScenes ãã£ã¬ã¯ããªãè¦ã¦ã¿ãã¨ã以åï¼Leap Motion の Oculus Rift 用マウンタを使って VR の世界で積み木ゲームしてみた - 凹みTipsï¼ã®ãã®ã¨æ¯ã¹ã¦ãµã³ãã«ã·ã¼ã³ãå¢ãã¦ãã¾ãããã®ä¸ã®ã²ã¨ã¤ã§ãã RealtimeCameraViewer ã·ã¼ã³ãè¦ã¦ã¿ã¾ãã
çç»ï¼1 æ¼ä¸æï¼

æªã¿è£æ£ï¼2 æ¼ä¸æï¼

èæ¯æãï¼3 æ¼ä¸æï¼

ãããªæãã«è¡¨ç¤ºããã¾ããLeapOculusPassThrough ã·ã¼ã³ãããã·ã³ãã«ãªã®ã§ãã®ã·ã¼ã³ã§ä»çµã¿ãè¦ã¦è¡ãã¾ããããç»ãé©ç¨ããã¦ãã Quad ãè¦ã¦ã¿ã¾ãã

LeapImageRetriever.cs 㨠ImageRetrieverTypes.cs ãã¢ã¿ããããã¦ãã¾ããLeapImageRetriever.cs 㯠LeapCSharp.NET3.5.dll å
å
ã§å®ç¾©ããã¦ãã Leap.Image ãéã㦠Leap Motion ããç»ãåã£ã¦ããã¹ã¯ãªããã§ããImageRetrieverTypes.cs ã¯ãã® LeapImageRetriever.cs ã®ãã©ã°ããã¼æä½ã«å¿ãã¦ã¡ããã£ã¨ã ãæ¸ãæããå°ããªã¹ã¯ãªããã§ãã
LeapImageRetriever.cs èªä½ã 200 è¡ç¨åº¦ã®çãã¹ã¯ãªãããªã®ã§ãã£ããå¦çãè¦ã¦ã¿ã¾ãã
LeapImageRetriever.csï¼ä¸é¨æ¹å¤ï¼
void Update() { // ãã©ã°ã«å¿ãçç» / æªã¿è£æ£ç¨ã«ã·ã§ã¼ããåãæ¿ã if (undistortImage) { renderer.material = new Material(Shader.Find(UNDISTORT_SHADER)); } else { renderer.material = new Material(Shader.Find(NORMAL_SHADER)); } // Leap Motion ããã®æ å ±ãè²ã ã¤ã¾ã£ã Frame ãåå¾ Frame frame = leap_controller_.Frame(); // ...(ç¥) // ç»ããã³é¢é£ããæ å ±ãè©°ã¾ã£ã Image ãåå¾ Image image = frame.Images[imageIndex]; int image_width = image.Width; int image_height = image.Height; // ...(ç¥) // çç»ãåå¾ image_data_ = image.Data; distortion_data_ = image.Distortion; // Leap Motion ããåå¾ããå¤ãã¢ã«ãã¡å¤ã¨ãã¦ã»ãã // ï¼ç»ã¯ä½¿ããã«ã¢ã«ãã¡ã®ã¿ãå©ç¨ãã¦ããï¼ int num_pixels = main_texture_.width * main_texture_.height; for (int i = 0; i < num_pixels; ++i) { image_pixels_[i].a = image_data_[i]; } // ...(ç¥) // ãã¯ã¹ãã£ã« image_pixels_ ãã»ãã ApplyDataToTextures(); // ...(ç¥) }
Leap.Controller.Frame ãéã㦠Imageï¼ç»ã®ãã¼ã¿ãæ
å ±ãå
¥ã£ãã¯ã©ã¹ï¼ãåå¾ãã¦ãã¾ããåå¾ããç»ã¯åè²ã°ã¬ã¼ã¹ã±ã¼ã«ã§ 8 bit ã®æåº¦ãå
¥ã£ã¦ããã®ã¿ã§ããä¸è¨ã³ã¼ãã§ã¯ãããã¢ã«ãã¡ã¨ãã¦ãã¯ã¹ãã£ã«ã»ãããããã©ã°ã¡ã³ãã·ã§ã¼ãå
ã§ä»¥ä¸ã®ããã«å©ç¨ãã¦ãã¾ãã
LeapDistorted.shaderï¼ä¸é¨æ¹å¤ï¼
float4 frag(fragment_input input) : COLOR
{
// ...(ç¥)
// å
ã»ã©ã¢ã«ãã¡ãã»ãããããã¯ã¹ãã£
float4 textureColor = tex2D(_MainTex, position);
// ãã®ã¢ã«ãã¡ãåãåºã
float a = textureColor.a;
// GUI ããè¨å®ããæããå ´æã®è²
float4 color = _Color;
// éæã¢ã¼ãï¼3 ãã¼æ¼ä¸æï¼ã ã£ããã¢ã«ãã¡ããã®ã¾ã¾éæåº¦ã¨ãã¦åæ
if (_BlackIsTransparent == 1) {
color.a *= a;
// ããã§ãªãæã¯èæ¯ã¯é»ã«ãã¦ã¢ã«ãã¡ãæããã¨ãã¦ä½¿ç¨ã RGB å¤ã®æ¹ãæããã
} else {
color = a * color;
color.a = 1.0;
}
}
ã¨ã¦ãã·ã³ãã«ã§ãã
æªã¿è£æ£ã«ã¤ãã¦
Leap Motion ã®çç»ã¯ç»è§ 150°ã®åºè§ã¬ã³ãºãéãã¦å¾ãããç»ã§ãããã¬ã³ãºã®ç¹æ§ã«ããæ¨½åã®æªã¿ãçãã¾ããLeap Motion ã§ã¯ãã®è£æ£ãã·ã§ã¼ãå
ã§é¢ç½ãããæ¹ã§è£æ£ãã¦ãã¾ããå
·ä½çã«ã¯ãäºã Image.Distortion ãå©ç¨ãã¦ãã£ãªãã¬ã¼ã·ã§ã³ããããç»åã¨ãã¦ç¨æãã¦ããããããå©ç¨ãã¦æªã¿åããæªã¿å¾ã®åº§æ¨ã¸ã¨å¤æãã¦ãã¾ãã
- https://developer.leapmotion.com/documentation/skeletal/csharp/devguide/Leap_Images.html
- https://developer.leapmotion.com/documentation/skeletal/csharp/api/Leap.Image.html#csharpclass_leap_1_1_image_1ad97445b1c3e8783c9b6ac1b87f57f1db
LeapImageRetriever.cs
void Update() { // ...(ç¥) // Leap Motion SDK ãããã£ãªãã¬ã¼ã·ã§ã³ããããè²°ã distortion_data_ = image.Distortion; // ...(ç¥) // ãã£ãªãã¬ã¼ã·ã§ã³ããããã·ã§ã¼ãå ã§æ±ããå½¢ã«å¤æ if (undistortImage) { EncodeDistortion(); } // ...(ç¥) if (undistortImage) { // ãã®ãã£ãªãã¬ã¼ã·ã§ã³ããããã·ã§ã¼ãã«ãã¼ã¿ãã»ãã renderer.material.SetTexture("_DistortX", distortionX_); renderer.material.SetTexture("_DistortY", distortionY_); renderer.material.SetFloat("_RayOffsetX", image.RayOffsetX); renderer.material.SetFloat("_RayOffsetY", image.RayOffsetY); renderer.material.SetFloat("_RayScaleX", image.RayScaleX); renderer.material.SetFloat("_RayScaleY", image.RayScaleY); } }
Image.Distortion 㯠64x64x2ï¼2 㯠x 㨠y 両æ¹è©°ã¾ã£ã¦ããã®ã§ï¼ ã® float ã®ãã¼ã¿ãªã®ã§ãããããã¯ããä½ç½® ã
ã«å¤æãããããã«ãªã£ã¦ãã¾ããã¤ã¾ãã
ã
ã¨ãªã颿°ãä½ã£ã¦ãããã§ããããå
·ä½çã«ã¯ãã® float ã RGBA ã«ã¨ã³ã³ã¼ãããã·ã§ã¼ãå
ã§ãã® RGBA ã float ã«ãã³ã¼ããã¦ãã¾ããè£éã¯å
é¨çã«ãã¯ã¹ãã£ã§ Bilinear ã§è¡ããã¦ããã¨æãã¾ããã¡ãªã¿ã«ã¨ã³ã³ã¼ãããããã¯ã¹ãã£ï¼
distortionX_ 㨠distortionY_ï¼ãè¦ã¦ã¿ãã¨ãããªæãã§ãï¼çµµæãã®ãã®ã«æå³ã¯ããã¾ãããã¢ã¢ã¬ã«ãªã£ã¦ããã®ã¯ x, y, z, w ã§åãªã¼ãã¼ãæ±ã£ã¦ããããã ã¨æãã¾ãï¼ã

CPU ãã¯ã¼ãåããã®ã§ããã° Image.Warp() ã Image.Rectify() ã使ãã°è¯ãããã§ãããå¦çãé
ããªãã¨æãã®ã§ GPU ãã¯ã¼ãåããããã«ãã®æ¹å¼ãæ¡ç¨ãã¦ãããã®ã¨æããã¾ããæ³ç·ãããã (x, y, z) ã (r, g, b) ãªãã¯ã¹ãã£ã«ç½®ãæãã¦å¦çãã¦ãã¾ããããããã£ãå½¢ã§äºãç¨æãããã¯ã¹ãã£ãå
ã«ç»åå¦çãè¡ãã®ã¯è²ã
åºæ¥ããã§é¢ç½ãã§ãã
æã®ãã©ããã³ã°ã¨éç³
æ¬¡ã«æã®ãã©ããã³ã°ãè¦ãã«ã¯ PassthroughWithTracking ã·ã¼ã³ãã·ã³ãã«ã§åãããããã§ãããã©ããã³ã°ã«ã¯ä»¥åã¨åãã HandController.cs ãæ
å½ãã¦ãã¾ãã®ã§è©³ããã¯ä»¥åã®èª¬æã«è²ãã¾ãã
å·®åã¨ãã¦ã¯ãã¼ã«ï¼éçãªã©ã®ãããªç©ä½ï¼ã使ããããã«ãªã£ã¦ãããã¨ã§ããã㯠TooDarkToSee ã·ã¼ã³ãªã©ãåèã«ããã¨è¯ãã¨æãã¾ããã«ã¡ã©ç»ã¨ãªãã¸ã§ã¯ãã®éç³ã«é¢ãã¦ã¯ãããããã«ã¡ã©ç»ããã¼ã¹ã«æã®ä½ç½®ãæ¨å®ãã¦ãããããã«ã¡ã©ç» - æãªãã¸ã§ã¯ã - ã«ã¡ã©ãé©åãªè·é¢ã§ä¸¦ã³ããããã° Unity ã®ã«ã¡ã©ã®ç»è§ã«ãããä¸è´ããããã«ãªãã¾ãã

ã¤ã³ã¿ã©ã¯ã·ã§ã³ã®ä½æ
@koukiwf ãããå é§ãã¦ãããã¦ãã¾ãã
ã«ããããã£ã¨DK2ã®ç»é¢é²ç»åºæ¥ãã£ã¦ã°ãï¼ï¼
— å è¼@è¦ããè£è´å¨ï¼ä»®ï¼ (@koukiwf) 2014å¹´9æ3æ¥
éçããæ¹å¼ã§leapãã¦ã³ããã¦è²æ¿ãã¨èµ¤å¤ç·ã«ã¡ã©ã®on/offã ãä»ããã£ã¦ã°ãï¼//LeapMotionãOculusDK2ã§ã¿ãããã¹ã: http://t.co/nvmBf2eAHe @YouTubeãããã
ãã®è¡¨ç¾ã LeapOculusPassthrough ããã¼ã¹ã«ä½æãã¦ã¿ã¾ãã
æã®å¤§ãããå¤ããã«ã¯è²ã
ãªå ´æãä¿®æ£ããå¿
è¦ãããã®ã§ãä»åã¯å²æãã¦ãå¨ãã®ãªãã¸ã§ã¯ãã触ãããã大ããã«ãã¾ãã以ä¸ã¯ãã¬ã¼ã³ï¼æã®ã³ã©ã¤ãã® Is Trigger ããã§ãã¯ãã¦ç°¡åãªã¹ã¯ãªããããã£ã¤ãããµã³ãã«ã«ãªãã¾ãã
using UnityEngine; using System.Collections; public class LeapTouchablePanel : MonoBehaviour { public Color normalColor = new Color(0, 0, 255); public Color touchedColor = new Color(0, 255, 0); private int touchedColliderNum_ = 0; void Start() { renderer.material.color = normalColor; } void OnTriggerEnter(Collider other) { if (touchedColliderNum_ == 0) { renderer.material.color = touchedColor; } ++touchedColliderNum_; } void OnTriggerExit(Collider other) { --touchedColliderNum_; if (touchedColliderNum_ == 0) { renderer.material.color = normalColor; } } }
ãã®ã¾ã¾ã§ã¯è·é¢æãåãã¥ããã®ã§ãä¾ãã°å½±ãè½ã¨ãã¦ãããã¨ãã£ãåå¾é¢ä¿ã®æç¤ºã®å·¥å¤«ã¯å¿ è¦ã ã¨æãã¾ãã
Unity 4.6 UI ã¨ã®çµã¿åãã
å ¬å¼ã®ãã©ã¼ã©ã ã«å®ç¾ãããæ¹ã®åç»ãä¸ãã£ã¦ãã¾ãã
ååã®è¨äºï¼Oculus Rift で頭の動き + タップで簡単に Unity 4.6 UI を選択できるやつを作ってみた - 凹みTipsï¼ãå ã«åãããã«ä½æãã¦ã¿ããã¨æãã¾ãï¼å¥è¨äºã§å ¬éäºå®ï¼ã
Leap Motion VR ã® Tips
以ä¸ã®ã¨ã³ããªã« 12 ã® Q&A ãå ¬éããã¦ãã¾ããéè¦ãªãã¤ã³ãã ãããã¯ã¢ãããã¦ã¿ã¾ãã
HMD ã¢ã¼ã
ããããã¦ã³ããã£ã¹ãã¬ã¤ã«æé©åããã¢ã¼ãï¼ä¸ä¸å対ã«ãã¦é
ç½®ããæã®æã®æ¤åºãæ¹è¯ããã¢ã¼ãï¼ãããã®ã§ãããããã¯åã
ã®ã¢ããªã±ã¼ã·ã§ã³ããããªã·ã¼ãã©ã°ã« 'POLICY_OPTIMIZE_HMD' ãã»ãããããã¨ã§æå¹ãã©ãããåãæ¿ãã¾ãããµã³ãã«ä¸ã§ã¯ LeapImageRetriever.cs ã® Start() ä¸ã§ä»¥ä¸ã®ããã«ããªã·ã¼ãã©ã°ãã»ãããã¦ãã¾ãã
leap_controller_.SetPolicyFlags(leap_controller_.PolicyFlags | Controller.PolicyFlag.POLICY_IMAGES);
Oculus Rift DK2 ã®ãã¸ã·ã§ã³ãã©ããã³ã°ã®å¦¨ãã«ãªããªããï¼
Leap Motion ãåé¢ã«é ç½®ãããã¨ãããDK2 æ¬ä½ã«é ç½®ããã¦ãããã¸ã·ã§ã³ãã©ããã³ã°ç¨ã®èµ¤å¤ç· LED ãè¦ã£ã¦ãã¾ããã¨ã§ç²¾åº¦ãè½ã¡ã¦ãã¾ãæ¸å¿µãããã¾ãããDK2 ã«ã¯ããã¹ãæ§ç¢ºä¿ã®ããã«è¤æ°ã®èµ¤å¤ç· LED ãé ç½®ããã¦ãããã¨ããåé¡ã¨ãªããªãããã§ãã
DK2 ã® USB ãã¼ããå©ç¨ã§ããªããï¼
DK2 ã«ã¯æ¬ä½ã«æ¡å¼µç¨ã® USB ãã¼ããã¤ãã¦ããã®ã§ãããæ®å¿µãªããç¾å¨ã®ã¨ãã転éé度ã«åé¡ãããèªèã®ãã¬ã¼ã ã¬ã¼ããè½ã¡ã¦ãã¾ããã¨ãããPC æ¬ä½ã® USB ãã¼ãã使ããã¨ãæ¨å¥¨ããã¦ãã¾ãã
èªèç¯å²ã«ã¤ãã¦
Leap Motion ã® FOV 㯠150° x 120° ããããOculus Rift DK2 ã®å¯¾è§ 100° ãååã«ã«ãã¼ããç¯å²ãæ±ããã¨ãåºæ¥ã¾ããã¤ã¾ãè¦ããç¯å²ã§æãå±ãç¯å²ã®ãªãã¸ã§ã¯ãã¯æä½ã§ããã¨ãããã¨ã«ãªãã¾ãã
(http://blog.leapmotion.com/12-faqs-vr-developer-mount/ ãã)
ä»å¾ã®å±é
Dragonfly
å ¬å¼ã®ã¨ã³ããªã«ããã¨ãDragonfly ã¨ããã³ã¼ããã¼ã ã§ãHD ãããé«è§£å度ãªç»ãæ±ããè¿èµ¤å¤ç»ã¨å ±ã«ã«ã©ã¼ç»ãåå¾ã§ããã㤠FOV ã大ããªæ¬¡ä¸ä»£ãã¼ã¸ã§ã³ãéçºãã¦ããã¨ã®ãã¨ã§ããã¨ã¦ã楽ãã¿ã§ããã
ãããã«
ä»ã«ãã«ã¡ã©ç»ãå å·¥ãã¦ãããããã¦é¢ç½ã表ç¾ã使ãããã§ããããªã®ã§è²ã ã¨è©¦ãã¦ããããã§ãã