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 に答える