Поворот камеры
Добавлено: 24 май 2019, 16:15
Я хочу реализовать поворот камеры вокруг ее точки положения через тачскрин - вожу пальцем по экрану и камера поворачивается.
Из нескольких примеров собрал вот такой код:
В принципе, код работает, но при повороте по горизонтали (вокруг оси Y) камера поворачивается еще и вокруг оси Z. Вот пример, как это происходит:
https://youtu.be/42r0E93cuXU
Как избавиться от поворота по оси Z, чтобы камера всегда была параллельна горизонту?
Из нескольких примеров собрал вот такой код:
Синтаксис:
Используется 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();
}
}
}
}
{
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, чтобы камера всегда была параллельна горизонту?