Страница 1 из 1

Поворот камеры

СообщениеДобавлено: 24 май 2019, 16:15
alexey.terno
Я хочу реализовать поворот камеры вокруг ее точки положения через тачскрин - вожу пальцем по экрану и камера поворачивается.
Из нескольких примеров собрал вот такой код:
Синтаксис:
Используется csharp
public class NewBehaviourScript : MonoBehaviour
{
    public Camera cam;
    private float rotx = 0.0f;
    private float roty = 0.0f;
    private Vector3 origRot;

    public float speedrot = 0.5f;
    public float dir = -1;
    private float smoothTime = 5f;

    void Start()
    {
        origRot = cam.transform.eulerAngles;
        rotx = origRot.x;
        roty = origRot.y;
    }

    void Update()
    {
        Touch inittouch = new Touch();

        if (Input.touchCount > 0)
        {
            Touch t = Input.GetTouch(0);

            if (t.phase == TouchPhase.Began)
            {
                inittouch = t;
            }

            if (t.phase == TouchPhase.Moved)
            {
                float deltax = Input.touches[0].deltaPosition.y;
                float deltay = -Input.touches[0].deltaPosition.x;

                Quaternion camrot = cam.transform.localRotation;
                camrot *= Quaternion.Euler(deltax, deltay, 0f);

                cam.transform.localRotation = Quaternion.Slerp(cam.transform.localRotation, camrot, smoothTime * Time.deltaTime);
            }

            if (t.phase == TouchPhase.Ended)
            {
                inittouch = new Touch();
            }
        }
    }
}
 


В принципе, код работает, но при повороте по горизонтали (вокруг оси Y) камера поворачивается еще и вокруг оси Z. Вот пример, как это происходит:
https://youtu.be/42r0E93cuXU
Как избавиться от поворота по оси Z, чтобы камера всегда была параллельна горизонту?

Re: Поворот камеры

СообщениеДобавлено: 24 май 2019, 16:35
waruiyume
Взять это
https://gist.github.com/M-Pixel/e8aa79890297b975994e
и вместо мыши использовать свайпы.

Re: Поворот камеры

СообщениеДобавлено: 24 май 2019, 16:40
1max1
Синтаксис:
Используется csharp
    void Start()
    {
        origRot = cam.transform.localEulerAngles;
        rotx = origRot.x;
        roty = origRot.y;
    }
           
            if (t.phase == TouchPhase.Moved)
            {
                rotx += Input.touches[0].deltaPosition.y;
                rotx = Mathf.Clamp(rotx, -89f, 89f);
                roty -= Input.touches[0].deltaPosition.x;
                var e = new Vector3(rotx,roty,0f);
                cam.transform.localEulerAngles = Vector3.Lerp(cam.transform.localEulerAngles, e, smoothTime * Time.deltaTime);
            }

Re: Поворот камеры

СообщениеДобавлено: 24 май 2019, 20:05
alexey.terno
У меня корректно работает последний пример с небольшими изменениями:
Синтаксис:
Используется csharp
if (t.phase == TouchPhase.Moved)
{
    rotx += Input.touches[0].deltaPosition.y * speedrot;
    //rotx = Mathf.Clamp(rotx, -89f, 89f);
    roty -= Input.touches[0].deltaPosition.x * speedrot;
    Vector3 e = new Vector3(rotx, roty, 0f);
    cam.transform.localEulerAngles = e;// Vector3.Lerp(cam.transform.localEulerAngles, e, smoothTime * Time.deltaTime);
}
 


Если я оставляю строчку
Синтаксис:
Используется csharp
Vector3.Lerp(cam.transform.localEulerAngles, e, smoothTime * Time.deltaTime)

то вращение в обратную сторону происходит с некоторой инерцией - поворачиваю вправо, потом начинаю поворачивать влево, а камера еще некоторое время продолжает вращаться вправо и только потом поворачивает влево.
Пока оставлю так. Спасибо за помощь!

Re: Поворот камеры

СообщениеДобавлено: 24 май 2019, 20:09
1max1
Можно перевести в кватернионы и крутить ими, можно еще попробовать https://docs.unity3d.com/ScriptReferenc ... wards.html

Re: Поворот камеры

СообщениеДобавлено: 03 июл 2019, 12:18
bachudacar
У меня вращение только в одну сторону работает... :-?