Единство ввода гироскопа получить беспристрастный угол - PullRequest
1 голос
/ 28 октября 2019

У меня игра в левом режиме. То, что я пытаюсь сделать, - это наклонить телефон по осям X и Y, но происходит много странных вещей. Например, поворот телефона по оси z влияет на расчеты по осям x и z. Кватернионы - трудная вещь, чтобы обернуть мою голову, любая помощь? Код - мое самое близкое решение.

public float rotationX;
public float rotationZ;
public float gyroscopeX, gyroscopeY, gyroscopeZ;
public Quaternion rotated;

private void Start ()
{
    Input.gyro.enabled = true;
}

private void FixedUpdate ()
{
    rotated = ConvertRotation(Input.gyro.attitude) * GetRotFix() * Quaternion.Euler(Vector3.forward * 90);
    rotated *= Quaternion.AngleAxis(-Input.gyro.attitude.z, Vector3.forward);
    rotationX = ClampAngle(rotated.x*90, -45, 45);
    rotationZ = ClampAngle(rotated.y*90, -45, 45);

    transform.rotation = Quaternion.Euler(-rotationZ, 0, rotationX);
}

private static Quaternion ConvertRotation(Quaternion q)
{
    return new Quaternion(q.x, q.y, -q.z, -q.w);
}

private Quaternion GetRotFix()
{
    if (Screen.orientation == ScreenOrientation.Portrait)
        return Quaternion.identity;
    if (Screen.orientation == ScreenOrientation.LandscapeLeft || Screen.orientation == ScreenOrientation.Landscape)
        return Quaternion.Euler(0, 0, -90);
    if (Screen.orientation == ScreenOrientation.LandscapeRight)
        return Quaternion.Euler(0, 0, 90);
    if (Screen.orientation == ScreenOrientation.PortraitUpsideDown)
        return Quaternion.Euler(0, 0, 180);
    return Quaternion.identity;
}

Я бы хотел, чтобы объект вращался только вокруг своих осей x и z в соответствии с осями x и y телефона независимо. Однако поворот телефона вокруг оси z приведет к вращению игрового объекта по диагонали, если телефон наклоняется только по одной оси.

1 Ответ

0 голосов
/ 29 октября 2019

В реальном мире физически телефон имеет ориентацию, которая представляет собой четырехмерный вектор: 3 измерения, чтобы описать прямое направление (F), и 4-е измерение, чтобы описать, насколько телефон поворачивается (R) относительноэто прямое направление.

Однако из-за аппаратных ограничений и плохого планирования со стороны разработчиков платформы телефоны сообщают только об углах Эйлера. Этого недостаточно для определения ориентации. Это означает, что для каждой возможной ориентации экрана (т. Е. ScreenOrientation.LandscapeLeft, которую вы наблюдаете, существует, по крайней мере, два (на самом деле бесконечное число) углов Эйлера, которые по крайней мере перпендикулярны (т. Е. Угол поворота R составляет 90 °) и в худшем случае ориентированы в противоположном направлении. направления (т. е. F и -F имеют одинаковую ориентацию экрана).

Используйте вместо этого проверенный пакет хранилища активов или изучите открытое решение , например, Parallax вместо .

Не существует правильного ответа о том, как интерпретировать измерение 3-мерного гироскопа как 4-мерную ориентацию, это качественное решение, основанное на ваших потребностях. Однако большинство игр предполагают, что игроки будут удерживать своиландшафт устройства с направлением вперед, параллельным Земле, вращающимся вокруг этого вперед (то есть, как при вождении автомобиля), так это то, что будет описывать большинство документации / учебных пособий в Интернете и что вы найдете наиболее надежным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...