почему ориентация моего объекта меняется в единстве? - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть модель в Unity, которую я хочу вращать, используя кватернион, заданный IMU.Чтобы изменить ориентацию, мне нужно установить начальную ориентацию объекта Quaternion (= Qreset) на ориентацию IMU (= Qimu) и с тех пор вычислить разницу между Qreset и Qimu, чтобы получить новую ориентацию.Это работает, однако всякий раз, когда я устанавливаю начальную ориентацию (Qreset), ориентация объекта в Unity всегда изменяется (на X: -180,4, Y: 21,08, Z: 21,08).Я не знаю, почему это происходит.Как мне изменить это, чтобы ориентация объекта при сбросе всегда была 0,0,0.Это мой код:

void Update() {

if (Input.GetKeyDown(KeyCode.Space))
   {
      Qreset = Qimu;
   }
   transform.rotation = Qreset * Quaternion.inverse(Qimu);
}

void Splitstring(string msg)
{
    string[] values = msg.Split('+');    
    Qimu.x = float.Parse(values[1]);
    Qimu.y = float.Parse(values[2]);
    Qimu.z = float.Parse(values[3]);
    Qimu.w = float.Parse(values[0]);
}

1 Ответ

0 голосов
/ 02 января 2019

Существует разница между rotation

Вращение преобразования в мировом пространстве, сохраняемое как кватернион.

и localRotation

Вращение преобразования относительно вращения преобразования родительского элемента.

И обратите внимание, что в Инспекторе преобразования

Положение, вращение и значения шкалы преобразования измеряются относительно родительского элемента преобразования.Если у Transform нет родителя, свойства измеряются в мировом пространстве.

=> то, что вы видите в Инспекторе, обычно это localRotation

Так что если ваш объект вложенпод Qimu вы хотите установить

transform.localRotation = Qreset * Quaternion.inverse(Qimu);

Также обратите внимание на комментарий Draco18s о получении кватерниона.Тебе лучше сделать

void Splitstring(string msg)
{
    string[] values = msg.Split('+');    
    var x = float.Parse(values[1]);
    var y = float.Parse(values[2]);
    var z = float.Parse(values[3]);
    var w = float.Parse(values[0]);

    Qimu = new Quaternion(x, y, z, w);
}
...