2013-08-21 87 views
3

我想確定用戶以圓周運動的方式圍繞屏幕旋轉手指的方式。我目前正在嘗試使用交叉產品並使用z組件來確定用戶正在旋轉的方式。這是產生的結果是在下半部分工作,並在上半部分旋轉。確定手指旋轉方向

任何人都可以闡明我做錯了什麼?

if ((Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved && GameStateManager.CurrentGameState == GameState.Minigame)) 
    { 
     Vector3 touchPos = Vector3.zero; 
     if(Camera.mainCamera != null) 
     { 
      touchPos = Camera.mainCamera.ScreenToWorldPoint(new Vector3(Input.GetTouch(0).position.x, Input.GetTouch(0).position.y, Camera.mainCamera.nearClipPlane)); 
     } 

     if(prevTouchPos == Vector2.zero) 
     { 
      prevTouchPos = new Vector2(touchPos.x, touchPos.y); 
      return; 
     } 

     //need angle between last finger position and this finger position 
     Vector2 prevVec = new Vector2(prevTouchPos.x - transform.position.x, prevTouchPos.y - transform.position.y); 
     Vector2 currVec = new Vector2(touchPos.x - transform.position.x, touchPos.y - transform.position.y); 

     float ang = Vector2.Angle(prevVec, currVec); 
     Vector3 cross = Vector3.Cross(new Vector3(prevVec.x, prevVec.y, 0), new Vector3(currVec.x, currVec.y, 0)); 

     Debug.Log(cross.normalized); 
     if (cross.z < 0) 
     { 
      Debug.Log("Prev Vec: " + prevVec); 
      Debug.Log("Curr Vec: " + currVec); 

      Debug.Log("ROTATE RIGHT"); 
      transform.Rotate(0, 0, ang); 
     } 
     else 
     { 
      Debug.Log("Prev Vec: " + prevVec); 
      Debug.Log("Curr Vec: " + currVec); 
      Debug.Log("ROTATE LEFT"); 
      transform.Rotate(0, 0, -ang); 
     } 

     //Debug.Log(ang); 
     //Debug.Log("TouchPos: " + touchPos); 




     prevTouchPos = new Vector2(touchPos.x, touchPos.y); 
    } 
+0

我現在無法測試代碼,無法繞過'Vector3.Cross'包裝。我明白它做了什麼以及你想做什麼,但我無法測試它以確定發生了什麼問題。您可以嘗試在代碼中的'ROTATE RIGHT/LEFT'之前添加'Debug.Log(「Crossvalue:」+ cross)「。這可能會讓你對發生什麼事情和發生錯誤有所瞭解。 – Joetjah

+0

我認爲你可以找到一個方法來做到這一點與 [此帖] [1] [1]:http://stackoverflow.com/questions/18579902/uiimage-which-follow-touches ++ –

+0

可能重複[如何確定多邊形點的列表是否按順時針順序?](http://stackoverflow.com/questions/1165647/how-to-determine-if-a-list -of-多邊形點-是式時針順序) –

回答

0

我已經在過去做過類似的東西,這一點,它看起來像你的相當接近,這裏是我使用的代碼,它確定用戶是否已經在一個方向上做了充分的360或另一個。注意這是用C++編寫的,但這個想法應該有所幫助。

  thumbDir.Cross(thumbCur, thumbPrev); 
    float z = clamp(thumbDir.z, -1.0f, 1.0f); 
    float theta = asin(z); 

    if (z > 0.0f) 
    { 
     // clockwise 
     if (fDegrees > 0.0f) 
      fDegrees = -theta; // Reset angle if changed 
     else 
      fDegrees -= theta; 
    } 
    else if (z < 0.0f) 
    { 
     // counter-clockwise 
     if (fDegrees < 0.0f) 
      fDegrees = -theta; //Reset angle if changed 
     else 
      fDegrees -= theta; 
    }