2015-07-28 2 views
0

Я разрабатываю базовое приложение для загрузки и модификации молекул, и моя главная цель - реализовать Kinect для этого. До сих пор я мог сделать это с помощью мыши, и я хотел бы сделать это правой рукой. После некоторого поиска я попытался определить мой курсор в экранной среде, как если бы это было сделано с помощью мыши (Input.mousePosition.x), заменив это для координат рук (нормализованных для размеров экрана). Я не могу заставить курсор следовать за моей рукой, но я могу заставить игровой объект следовать за любой частью моего тела, чтобы мои координаты были импортированы, и когда я отлаживаю свои управляющие переменные, они возвращают значение, содержащееся в размерах экрана. Я предполагаю, что моя ошибка в OnGUI(). Может кто-нибудь мне помочь.Установить ручку управления курсором с помощью Kinect SDK

Заранее спасибо.

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 
public class handPointer_01 : MonoBehaviour 
{ 
    public Texture2D cursorImage_00; 
    public Texture2D cursorImage_01; 
    public Texture2D cursorImage_02; 
    private Texture2D cursorImage; 
    private int cursorWidth = 16; 
    private int cursorHeight = 16; 
    private string defaultResource = "MousePointer"; 
    private GameObject target; 

    public GameObject leftHandPos; 
    public GameObject rightHandPos; 
    public GameObject leftShoulderPos; 
    public GameObject rightShoulderPos; 
    public GameObject leftHipPos; 
    public GameObject rightHipPos; 

    private float RightHandX; 
    private float RightHandY; 
    private float xPrevious; 
    private float yPrevious; 
    private double MoveThreshold = 0.01; 
    void Start() 
    { 
     //Switch off default cursor 

     if(!cursorImage_00 || !cursorImage_01 || !cursorImage_02) 
     { 
      cursorImage = (Texture2D) Resources.Load(defaultResource); 
      Debug.Log(cursorImage); 
     } 
     else Cursor.visible = false; 
     //cursorImage = (Texture2D) Instantiate(cursorImage); 
    } 
    void Update() 
    { 

     if (rightShoulderPos.transform.position.z - rightHandPos.transform.position.z > 0.01) 
     { 
      float xScaled = Mathf.Abs((rightHandPos.transform.position.x - rightShoulderPos.transform.position.x)/((rightShoulderPos.transform.position.x - leftShoulderPos.transform.position.x) * 2)) * Screen.width; 
      float yScaled = Mathf.Abs((rightHandPos.transform.position.y - rightHipPos.transform.position.y)/((rightShoulderPos.transform.position.y - rightHipPos.transform.position.y) * 2)) * Screen.height; 

      // the hand has moved enough to update screen position (jitter control/smoothing) 
      if (Mathf.Abs(rightHandPos.transform.position.x - xPrevious) > MoveThreshold || Mathf.Abs(rightHandPos.transform.position.y - yPrevious) > MoveThreshold) 
      { 
       RightHandX = Mathf.Min(Mathf.Max(xScaled,Screen.width),0); 
       RightHandY = Mathf.Min(Mathf.Max(yScaled,Screen.height),0); 

       xPrevious = rightHandPos.transform.position.x; 
       yPrevious = rightHandPos.transform.position.y; 

       // reset the tracking timer 
       //trackingTimerCounter = 10; 
      } 
     } 

     // // Get the left mouse button 
     // if(Input.GetMouseButtonDown(0)) 
     // {   
      // RaycastHit hitInfo; 
      // target = GetClickedObject (out hitInfo); 

      // if (target != null && target.gameObject.tag =="Draggable") 
      // { 
       // cursorImage = cursorImage_02; 
       // Debug.Log("Hit"); 
      // } 
      // else 
      // { 
       // cursorImage = cursorImage_01; 
       // Debug.Log("Miss"); 
      // } 
     // } 

     // // Disable movements on button release 
     // if (!Input.GetMouseButton(0)) 
     // { 
      // cursorImage = cursorImage_00; 
     // } 
     cursorImage = cursorImage_00; 
    } 

    void OnGUI() 
    { 
     //GUI.DrawTexture(new Rect(Input.mousePosition.x, Screen.height - Input.mousePosition.y, cursorWidth, cursorHeight), cursorImage); 
     GUI.DrawTexture(new Rect(RightHandX ,RightHandY , cursorWidth, cursorHeight), cursorImage); 
    } 

    GameObject GetClickedObject (out RaycastHit hit) 
    { 
     GameObject target = null; 
     Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition); 
     if (Physics.Raycast (ray.origin, ray.direction * 10, out hit)) { 
      target = hit.collider.gameObject; 
     } 
     return target; 
    } 
} 
+0

Отформатируйте вас вопрос правильно, весь Thos «введите код здесь» мешает –

+0

я хочу опубликовать свой код (рабочий), но коробка выглядит сломанный. – ruiabg

ответ

0

Мне удалось найти решение, основанное на попытках пробной ошибки. :) Удаленный дополнительный код (прокомментированный код) во избежание недоразумений. Для кого это может заинтересовать:

using UnityEngine; 
 
using System.Collections; 
 
using System.Collections.Generic; 
 
using System.Diagnostics; 
 

 
public class HandModifier_03 : MonoBehaviour 
 
{ 
 
\t //Cursor Variables 
 
\t public Texture2D cursorImage_00; 
 
\t private Texture2D r_cursorImage; 
 

 
\t private int cursorWidth = 32; 
 
\t private int cursorHeight = 32; 
 
\t private string defaultResource = "MousePointer"; 
 

 
\t //Hand Variables 
 
\t public Vector3 screenSpace; 
 
\t private Vector3 last_right; 
 

 
\t public Transform referenceCamera; //Camera that acts as a point of view to act on the object relative to. 
 

 
\t // Kinect data receiver 
 
\t public UDPReceive receiver; 
 

 
\t private Vector3 headPos; \t 
 
\t private Vector3 leftHandPos; 
 
\t //private Vector3 leftWristPos; 
 
\t //private Vector3 leftElbowPos; 
 
\t private Vector3 leftShoulderPos; 
 

 
\t private Vector3 rightHandPos; 
 
\t //private Vector3 rightWristPos; 
 
\t //private Vector3 rightElbowPos; 
 
\t private Vector3 rightShoulderPos; 
 

 
\t //private Vector3 leftThumbPos; 
 
\t //private Vector3 rightThumbPos; 
 
\t //private Vector3 leftHandTipPos; 
 
\t //private Vector3 rightHandTipPos; 
 

 
\t private Vector3 leftHipPos; 
 
\t private Vector3 rightHipPos; 
 

 
\t private string lHandState; 
 
\t private string rHandState; 
 

 
\t //Cursor auxiliar variables 
 
\t private float xScaled; 
 
\t private float yScaled; \t 
 

 
\t private Vector2 rHandScreen; 
 

 
\t void Start() 
 
\t { 
 
\t \t r_cursorImage = cursorImage_00; 
 
\t } 
 

 
\t // Update is called once per frame 
 
\t void Update() 
 
\t { 
 
\t \t //Coordinate Update 
 
\t \t headPos = receiver.headPos; 
 

 
\t \t leftHandPos = receiver.leftHandPos; 
 
\t \t //leftWristPos = receiver.leftWristPos; 
 
\t \t // \t \t leftElbowPos = receiver.leftElbowPos; 
 
\t \t leftShoulderPos = receiver.leftShoulderPos; 
 

 
\t \t rightHandPos = receiver.rightHandPos; 
 
\t \t // \t \t rightWristPos = receiver.rightWristPos; 
 
\t \t // \t \t rightElbowPos = receiver.rightElbowPos; 
 
\t \t rightShoulderPos = receiver.rightShoulderPos; 
 

 
\t \t // \t \t leftThumbPos = receiver.leftThumbPos; 
 
\t \t // \t \t rightThumbPos = receiver.rightThumbPos; 
 
\t \t // \t \t leftHandTipPos = receiver.leftHandTipPos; 
 
\t \t // \t \t rightHandTipPos = receiver.rightHandTipPos; 
 

 
\t \t lHandState = receiver.lHandState; 
 
\t \t rHandState = receiver.rHandState; 
 

 

 
\t \t leftHipPos = receiver.leftHipPos; 
 
\t \t rightHipPos = receiver.rightHipPos; 
 

 
\t \t //Right Hand Screen Position \t \t 
 
\t \t xScaled = Mathf.Abs ((rightHandPos.x - rightShoulderPos.x))/Mathf.Abs ((rightShoulderPos.x - leftShoulderPos.x) * 1.75f) * Screen.width; 
 
\t \t yScaled = Mathf.Abs ((rightHandPos.y - rightHipPos.y))/Mathf.Abs ((rightShoulderPos.y - rightHipPos.y) * 2) * Screen.height; 
 

 

 
\t \t xScaled = Mathf.Max (Mathf.Min (xScaled, Screen.width * 0.98f), 0.02f); 
 
\t \t yScaled = Screen.height - Mathf.Max (Mathf.Min (yScaled, Screen.height * 0.98f), 0.02f); // Subtracting Screen Height required 
 

 
\t \t Vector2 rHandScreen = new Vector2 (xScaled, yScaled); 
 

 
\t \t // \t \t Vector2 rHandScreen = HandOnScreenPosition (out rightHandPos, leftShoulderPos, rightShoulderPos, rightHipPos); 
 

 
\t \t // \t \t UnityEngine.Debug.Log(_mode); 
 

 

 
\t } 
 
\t \t 
 
\t void OnGUI() 
 
\t { 
 
\t \t //GUI.DrawTexture(new Rect(Input.mousePosition.x, Screen.height - Input.mousePosition.y, cursorWidth, cursorHeight), cursorImage); 
 
\t \t GUI.DrawTexture(new Rect(xScaled ,yScaled , cursorWidth, cursorHeight), r_cursorImage); 
 
\t } 
 

 
}