Войти
ПрограммированиеФорумФизика

Сложный поворот тела с помошью кватернионов (4 стр)

Страницы: 1 2 3 4 5 6 7 Следующая »
#45
11:50, 28 авг. 2016

Пробовал всякие коэфициенты в Slerp ставить. Ничего не помогает.
Далее  попробовал так писать в FixedUpdate:

cubeRigid.rotation = rot[5];
Казалось бы, должно работать, во вращении практически константа! А тут на тебе, если хорошенько дернуть куб предметом, то он оклоняется!!!
Я уж усомнился, скорее всего делаю что-то не так... Вдруг какой-то код еще выполняется. Удалил все из сцены (там практически и удалять-то нечего). И все равно то же самое. Кум так плааааавненько докручивается до своего угла, когда я ему напрямую конечное вращение прописал.
Попробовал так:
cubeRigid.MoveRotation (rot[5]);
Та же история.
Хорошо, тогда так:
cubeRigid.transform.rotation = rot[5];

Хотя смысла в том чтобы далее пробовать я не вижу, но попробовал еще так:

cubeRigid.transform.rotation = Quaternion.Euler (new Vector3(0,0,0));

Все результаты одинаковы. Тело отклоняется от угла, причем после того как его хорошенько толкнули и поблизости нет других тел. Оно плавненько пытается выровняться. Что за чудеса?


#46
13:49, 28 авг. 2016

Alerr
здесь ошибка

int NearestRot(Quaternion cubeRot){
    int maxIndex = -1;
    for (int i = 0; i < 48; ++i) {
      float maxDot = -10000.0f; //NEG INF
      float dot = Quaternion.Dot(cubeRot, rot[i]);//Mathf.Abs();
      if (dot > maxDot) {
        maxDot = dot;
        maxIndex = i;
      }
    }
    return maxIndex;
  }

должно быть так

int NearestRot(Quaternion cubeRot){
    int maxIndex = -1;
    float maxDot = -10000.0f; //NEG INF
    for (int i = 0; i < 48; ++i) {
      float dot = Quaternion.Dot(cubeRot, rot[i]);//Mathf.Abs();
      if (dot > maxDot) {
        maxDot = dot;
        maxIndex = i;
      }
    }
    return maxIndex;
  }

а ещё лучше так

int NearestRot(Quaternion cubeRot){
    int maxIndex = 0;
    float maxDot = Quaternion.Dot(cubeRot, rot[0]);
    for (int i = 1; i < rot.Length; ++i) {
      float dot = Quaternion.Dot(cubeRot, rot[i]);//Mathf.Abs();
      if (dot > maxDot) {
        maxDot = dot;
        maxIndex = i;
      }
    }
    return maxIndex;
  }

#47
14:17, 28 авг. 2016

Поправил, тоже самое, ничего нового:
https://yadi.sk/i/faf7RxnouYL3Z
Он плохо себя ведет даже когда вращение напрямую приравниваю в FixedUpdate:
https://yadi.sk/i/lr6DE77TuYKyg

#48
14:23, 28 авг. 2016

Последним аргументом Slerp поставь 0.1 и покажи.

#49
14:31, 28 авг. 2016

Так же медленно: https://yadi.sk/i/tioevTP-uYLuV

#50
14:39, 28 авг. 2016

Я думаю, это так проявляется конфликт с физдвижком.

#51
14:51, 28 авг. 2016

Насчет конфликта, да, похоже так и есть. Как только делаю тело кинематиком, так сразу все начинает работать как нужно. Вы говорили про torque, оно может помочь решить проблему? Как? Что можно дальше пробовать? Физика в кубе важна, без нее смысла нет.
Можете пояснить насчет конфликта с физ. движком? Почему он возникает?

#52
15:07, 28 авг. 2016

Я так понимаю, что нужно отключать физику куба вообще и заниматься тем, чем заниается физический движек?

#53
15:20, 28 авг. 2016

Ладно, уже огромное достижение для меня) С физикой я сам буду разбираться(буду заставлять этот кинематик вести себя как dynamic), главное вроде как иммитируется часть того, что нужно, хотя и без физики. К сетке прилипает, насчет вращений сейчас сам попробую подумать, а вот насчет случая, когда ближняя грань смотрит на игрока идей нет. Можете подкинуть идеи для раздумий?

#54
15:44, 28 авг. 2016

Alerr
> Можете пояснить насчет конфликта с физ. движком? Почему он возникает?
Потому что физдвижек тоже устанавливает поворот.

> Вы говорили про torque, оно может помочь решить проблему?
Это единственный правильный способ в случае с работающим физдвижком.

> Можете подкинуть идеи для раздумий?
В смысле? Чтобы залипало в пространстве игрока, а не глобальном?
Почитай про переводы систем координат друг в друга.

#55
16:35, 28 авг. 2016

Пытаюсь прицепить колесико к вращению по какой-либо оси.
Что сейчас происходит: выбирается ближайший кватернион из 48-и и к нему всегда Lerp-ится куб.
Далее, на сколько понимаю, необходимо получит вращение куба по нужной оси (OY)(1) до снапинга, затем вращение остальных после снаппинга (2).
Затем к (1) применить вращение отклонения мыши и получим вращение (3).
Затем полученное итоговое вращение с учетом мыши (3) нужно применить к вращению (2) и получим результат.
Вот код:

Quaternion qq0 = cubeRigid.rotation;
        // получаем только 0Y без snapping: (1)
        qq0.x = 0f;
        qq0.z = 0f;
        float magnitude = Mathf.Sqrt(qq0.w*qq0.w + qq0.y*qq0.y);
        if (magnitude != 0f) {
          qq0.w /= magnitude;// invert rotation
          qq0.y /= magnitude;
        } else {
          qq0.y = 0f;
          qq0.w = 1f;
        }

        Quaternion qq1 = rot [NearestRot (cubeRigid.rotation)]; // (2)
        // получаем только 0Z OX rotation with snapping:
        qq1.y = 0f;
        magnitude = Mathf.Sqrt(qq1.w*qq1.w + qq1.x*qq1.x + qq1.z*qq1.z);
        if (magnitude != 0f) {
          qq1.w /= magnitude;// invert rotation
          qq1.x /= magnitude;
          qq1.z /= magnitude;
        } else {
          qq1.x = 0f;
          qq1.z = 0f;
          qq1.w = 1f;
        }

        Quaternion axisResultRotation = (qq0*Quaternion.AngleAxis(delta, Vector3.up));// (3)
        cubeRigid.rotation = Quaternion.Slerp(cubeRigid.rotation, qq1*axisResultRotation, 5f*Time.fixedDeltaTime); 

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

#56
17:18, 28 авг. 2016

Сделал по-другому, работает. Но вот насчет выделения осей так и не разобрался. Можно ли из кватерниона вытащить вращение только по заданым осям?

#57
17:26, 28 авг. 2016

Alerr
> Можно ли из кватерниона вытащить вращение только по заданым осям?
С математической точки зрения эта операция не имеет смысла.

#58
17:30, 28 авг. 2016

Не понял. Вот у нас куб. Он как-то повернут... Мне нужно обнулить вращение по оу а по остальным осям оставить как было. Как такое с кватернионами возможно?

#59
17:41, 28 авг. 2016

Ещё вот вопрос, как можно ускорить поиск среди вращений для прицепке к нужнгму углу? Я так понял, отрицательные кватернионы, это те же самые вращения, что заложены в положительных.

Страницы: 1 2 3 4 5 6 7 Следующая »
ПрограммированиеФорумФизика