2016-11-19 47 views
1

所以我写了这个径向菜单由左侧的魔杖上的触控板控制。它决定了哪个按钮可以通过我的手指放在触控板上进行放大。Unity3d HTC Vive径向菜单 - 奇怪的毛刺

奇怪的运动可以看到here

在这里,我攻击了与这个问题有关的代码,左代码的代码。

SteamVR_TrackedObject obj; //The wand 
public GameObject buttonHolder; //All the buttons will be children of this object 
public bool buttonEnabled; 

void Awake() { 
    obj = GetComponent<SteamVR_TrackedObject>(); //this will be left hand controller 
} 


void Update() { 
    var device = SteamVR_Controller.Input((int)obj.index); 

    //if touchpad touched 
    if (device.GetTouch(SteamVR_Controller.ButtonMask.Touchpad)) 
    { 
     if (buttonEnabled) //if radial menu is open 
     { 
      //touchPadAngle: Get the angle between touch coord and X-axis 
      Vector2 touchedCoord = device.GetAxis(EVRButtonId.k_EButton_Axis0); //what is this line each variable 
      float touchPadAngle = VectorAngle(new Vector2(1, 0), touchedCoord); //(1, 0) is X-axis 


      // ------------------- Find closest button ------------------------ 
      //Description: The process will be done by calculating the angle between button_Vector2 and X-axis (button_V2_to_10) 
      //   And then find the button with the closest angler difference with (touchPadAngle). 
      float minAngle = float.PositiveInfinity; 
      Transform minButton = transform; //Temperatry assign wand tranform to it. 
      float pad_N_button_Angle = 0.0f; //Angle between touchPadAngle and buttonAngle. 

      Vector2 button_V2_to_10; 
      float button_Angle; 
      foreach (Transform bt in buttonHolder.transform) 
      { 
       button_V2_to_10 = new Vector2(transform.position.x, transform.position.z) - new Vector2(bt.position.x, bt.position.z); 
       button_Angle = VectorAngle(new Vector2(1, 0), button_V2_to_10); 

       pad_N_button_Angle = Mathf.Abs(button_Angle - touchPadAngle); 
       //Both buttonAngle and touchPadAngle range from -180 to 180, avoid Abs(170 - (-170)) = 340 
       pad_N_button_Angle = (pad_N_button_Angle > 180) ? Mathf.Abs(pad_N_button_Angle - 360) : pad_N_button_Angle; 

       if (pad_N_button_Angle < minAngle) 
       { 
        minButton = bt; 
        minAngle = pad_N_button_Angle; 
       } 
      } 

      //Magnify the closest button 
      foreach (Transform bt in buttonHolder.transform) 
      { 
       GameObject btGO = bt.gameObject; 
       if (!btGO.GetComponentInChildren<ButtomHandler>().onHover && bt == minButton) { 
        //Magnify 
       } 
       else if (bt != minButton && btGO.GetComponentInChildren<ButtomHandler>().onHover) 
       { 
        //minify 
       } 
      } 
     } 
     else { 
      activateButtonMenu(); 
     } 
    } 


    //dis-hover all button if leave touch pad 
    if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Touchpad)) { 
     //Hover the closest button 
     foreach (Transform bt in buttonHolder.transform) 
     { 
      GameObject btGO = bt.gameObject; 
      if (btGO.GetComponentInChildren<ButtomHandler>().onHover) 
      { 
       //minify 
      } 
     } 
    } 

我很stucked在这里,任何帮助将真正理解

回答

1

你不应该考虑径向超过一轴“最接近的垂钓者用(touchPadAngle)差异”拨号?

+0

对不起,我不太明白,是否有更多的轴,我错过了? – libra

+0

好吧,如果你考虑一下 - 当差异值太小时,它会在两个状态之间切换 - 视频似乎表明当两者是水平的时候会发生 - 随意与我离线联系 - 我需要看到径向菜单代码/资产。 – dljava