A
A
Alex2018-10-17 22:22:35
Game development
Alex, 2018-10-17 22:22:35

Why does the camera follow the mouse incorrectly on the Y axis?

Written code by which the camera (from the first person) should follow the mouse pointer. On the x-axis (horizontal) everything works as it should. When trying to follow the Y (vertical) axis, the camera simply flips 90 degrees. Screenshot example.
The code:

using System.Collections;
using UnityEngine;

public class MouseLook : MonoBehaviour {

    // обьявляем общедоступные переменные скорости вращения по горизонтали и вертикали
    public float sensitivityX = 9f;
    public float sensitivityY = 9f;

    // обьявляем общедоступные переменные ограничивающие вращение по вертикали и горизонтали
    public float minimumHor = -360;
    public float maximumHor = 360;
    public float minimumVert = -60;
    public float maximumVert = 60;

    // обьявляем оригинальное положение которое определяется автоматически
    private Quaternion originalRot;
    private float rotX = 0; // вспомогательная переменная для расчета вращения по горизонтали
    private float rotY = 0; // вспомогательная переменная для расчета вращения по вертикали

    private void Start() {

        // отключаем у твердого тела поворот по физике по умолчанию (заморозим вращение)
        Rigidbody body = GetComponent<Rigidbody>();
        if (body != null) body.freezeRotation = true;

        // считываем оригинальную позицию вращения для начала счета
        originalRot = transform.localRotation;

    }

    void Update () {

        // счетаем позицию мыши по горизонтали и по вертикали
        rotX += Input.GetAxis("Mouse X") * sensitivityX;
        rotY += Input.GetAxis("Mouse Y") * sensitivityY;

        // ограничиваем углы поворота по вертикали и горизонтали
        rotX = rotX % 360;
        rotY = rotY % 360;

        // ограничиваем движение по горизонтали и вертикали максимальным и минимальным положениями камеры
        rotX = Mathf.Clamp(rotX, minimumHor, maximumHor);
        rotY = Mathf.Clamp(rotY, minimumVert, maximumVert);

        // посчитаем значение квартернионов по вертикали и горизонтали
        Quaternion quaternionX = Quaternion.AngleAxis(rotX, Vector3.up);
        Quaternion quaternionY = Quaternion.AngleAxis(rotY, Vector3.left);

        transform.localRotation = originalRot * quaternionX * quaternionY;
    }
}

Screenshots. The arrows indicate the direction where I move the mouse pointer.
5bc78bf17520a690833561.png5bc78b9ee43f0794841698.png5bc78baa5f8d5541987714.png5bc78bc388105838345377.png5bc78bcd1430b892011898.png

Answer the question

In order to leave comments, you need to log in

1 answer(s)
G
Griboks, 2018-10-17
@Griboks

Rotate the camera around the wrong axis.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question