У меня игра в левом режиме. То, что я пытаюсь сделать, - это наклонить телефон по осям 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 приведет к вращению игрового объекта по диагонали, если телефон наклоняется только по одной оси.