Rotacja obiektu 3D za pomocą myszy

W przykładzie będziemy obracać obiektem w dwóch osiach.
Rotacja Euler w trzech osiach wiąże się z ryzykiem tzw. gimball lock, co powoduje problemy w prawidłowym obrocie.
W związku z powyższym najlepiej jest odpowiednio zagnieżdzać obiekt, aby obracać osobno każdą z osi na innym obiekcie. W przykładzie poniżej obracamy oś x na rodzicu, a oś y na obiekcie do którego dołączony jest skrypt.

        if (Input.GetMouseButton(0))
        {
            float speed = 2000f;
            transform.localRotation *= Quaternion.Euler(0f,0f, Input.GetAxis("Mouse X") * -speed * Time.deltaTime);
            transform.parent.transform.rotation *= Quaternion.Euler(Input.GetAxis("Mouse Y") * speed * Time.deltaTime, 0f, 0f);
           
        }
    private void Update()
    {
        if (Input.GetMouseButton(0))
        {
            float speed = 1000f;
            gameObject.transform.parent.rotation *= Quaternion.Euler(Input.GetAxis("Mouse Y") * speed * Time.deltaTime, 0f, 0f);
            transform.rotation *= Quaternion.Euler(0f, Input.GetAxis("Mouse X") * speed * Time.deltaTime, 0f);
        }
    }

Z użyciem OnMouseDrag()

    private void OnMouseDrag()
    {
        float speed = 1000f;
        gameObject.transform.parent.rotation *= Quaternion.Euler(Input.GetAxis("Mouse Y") * speed * Time.deltaTime, 0f, 0f);
        transform.rotation *= Quaternion.Euler(0f, Input.GetAxis("Mouse X") * speed * Time.deltaTime, 0f);
    }
Scroll to Top