1

所以我写了这个由左侧魔杖上的触控板控制的径向菜单。它通过我的手指在触控板上的位置确定要放大哪个按钮。

奇怪的动作可以在这里看到。

在这里,我攻击了与此问题相关的代码,即左魔杖的代码。

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
            }
        }
    }

我被困在这里,任何帮助将不胜感激

4

1 回答 1

1

“与 (touchPadAngle) 最接近的垂钓者差异”

您不应该为径向表盘考虑多个轴吗?

于 2016-12-05T18:58:20.233 回答