Радиальное меню Unity3d HTC Vive — странные сбои

Поэтому я написал это радиальное меню, управляемое трекпадом на левой палочке. Он определяет, какую кнопку увеличивать, по положению пальцев на трекпаде.

Движение Weird можно увидеть здесь.

Здесь я атаковал свой код, связанный с этой проблемой, код для левой палочки.

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

Я совершенно застрял здесь, любая помощь будет действительно оценена


person libra    schedule 19.11.2016    source источник


Ответы (1)


«ближайшая разница рыболова с (touchPadAngle)»

разве вы не должны рассматривать более одной оси для радиального циферблата?

person dljava    schedule 05.12.2016
comment
Извините, я не совсем понял, есть ли еще оси, которые я пропустил? - person libra; 06.12.2016
comment
хорошо, если вы думаете об этом - это будет переключение между двумя состояниями, когда значения разницы слишком малы - видео, кажется, показывает, что это происходит, когда два состояния горизонтальны - не стесняйтесь обращаться ко мне в автономном режиме - мне нужно увидеть радиальное меню также код/активы. - person dljava; 07.12.2016