Unity: IMU выбирает случайную ось вращения каждый раз, когда игра начинается - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь управлять своей камерой, используя IMU, подключенный к плате Arduino.Я следовал инструкциям этого урока и добился определенных успехов: http://www.marcteyssier.com/uduino/projects/connect-a-imu-to-unity

То есть я получил Unity для чтения данных с Arduino.Когда я прикрепил скрипт к игровому объекту (например, к кубу), он вращается вместе с движением IMU.

Однако проблема заключается в том, что для IMU нет ориентации по умолчанию.Я имею в виду, если я позволю ИДУ лежать на земле лицом вверх, то ось х в Unity будет указывать в одном направлении.Если я снова играю в игру, не касаясь IMU, ось X внезапно указывает в другом направлении.Вот картинка: No description

Мне не удалось получить другую картинку, когда ось X указывает в другом направлении, потому что это требует, чтобы я несколько раз играл в Unity, но доверяюсо мной так бывает.

Вот мой код, прикрепленный к кубу:

using UnityEngine;
using Udiono;

public class IMU: MonoBehaviour
{
    public Vector3 rotationOffset;
    Quaternion q;
    public float smoothfactor = 15.0f;

    void Start() {
        UdionoManeger = Instance.OnValueRecieved += ReadIMU;
    }
}

void Update()
{
    string values = data.Split('\n');

    if (values.Length >= 2)
    {
        string[] values = values[values.Length - 2].Split(' ');
        if (values[0] == "QC")
        {
            q = new Quaternion(float.Parse(line[1]), float.Parse(line[2]), float.Parse(line[3]), float.Parse(line[4]));
            transform.localRotation = Quaternion.Lerp(transform.localRotation, q, Time.deltaTime * speedfactor);
        }
    }
    this.transform.parent.transform.eulerAngles = rotationOffset;
}

Забудьте о том, что находится в функции Start, сфокусируйтесь на этой строке:

q = new Quaternion(float.Parse(line[1]),
                                       float.Parse(line[2]),
                                       float.Parse(line[3]),
                                       float.Parse(line[4]));
        transform.localRotation = Quaternion.Lerp(transform.localRotation, q, Time.deltaTime * speedfactor);

И вотИзображение с моего серийного монитора Arduino Изображение 2

Очевидно, что Unity считывает ориентацию из IMU как кватернион.Но проблема в том, что нет ориентации по умолчанию.В одном случае вращение вокруг оси Y переводится в Unity в одно, а в другое - в другое.

Было бы неплохо, если бы я мог установить ориентацию IMU в Unity на какое-то значение по умолчанию.значение.

С уважением, если кто-то имеет решение этой проблемы или хотя бы знает, что происходит, поделитесь своим мнением здесь.

Спасибо,

...