Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Сложный поворот тела с помошью кватернионов (4 стр)

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

Страницы: 1 2 3 4 5 6 7 Следующая »
AlerrПостоялецwww28 авг. 201611:50#45
Пробовал всякие коэфициенты в 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));

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

ancooperПостоялецwww28 авг. 201613:49#46
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;
  }

AlerrПостоялецwww28 авг. 201614:17#47
Поправил, тоже самое, ничего нового:
https://yadi.sk/i/faf7RxnouYL3Z
Он плохо себя ведет даже когда вращение напрямую приравниваю в FixedUpdate:
https://yadi.sk/i/lr6DE77TuYKyg
}:+()___ [Smile]Постоялецwww28 авг. 201614:23#48
Последним аргументом Slerp поставь 0.1 и покажи.
AlerrПостоялецwww28 авг. 201614:31#49
Так же медленно: https://yadi.sk/i/tioevTP-uYLuV
}:+()___ [Smile]Постоялецwww28 авг. 201614:39#50
Я думаю, это так проявляется конфликт с физдвижком.
AlerrПостоялецwww28 авг. 201614:51#51
Насчет конфликта, да, похоже так и есть. Как только делаю тело кинематиком, так сразу все начинает работать как нужно. Вы говорили про torque, оно может помочь решить проблему? Как? Что можно дальше пробовать? Физика в кубе важна, без нее смысла нет.
Можете пояснить насчет конфликта с физ. движком? Почему он возникает?
AlerrПостоялецwww28 авг. 201615:07#52
Я так понимаю, что нужно отключать физику куба вообще и заниматься тем, чем заниается физический движек?
AlerrПостоялецwww28 авг. 201615:20#53
Ладно, уже огромное достижение для меня) С физикой я сам буду разбираться(буду заставлять этот кинематик вести себя как dynamic), главное вроде как иммитируется часть того, что нужно, хотя и без физики. К сетке прилипает, насчет вращений сейчас сам попробую подумать, а вот насчет случая, когда ближняя грань смотрит на игрока идей нет. Можете подкинуть идеи для раздумий?
}:+()___ [Smile]Постоялецwww28 авг. 201615:44#54
Alerr
> Можете пояснить насчет конфликта с физ. движком? Почему он возникает?
Потому что физдвижек тоже устанавливает поворот.

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

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

AlerrПостоялецwww28 авг. 201616:35#55
Пытаюсь прицепить колесико к вращению по какой-либо оси.
Что сейчас происходит: выбирается ближайший кватернион из 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); 

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

AlerrПостоялецwww28 авг. 201617:18#56
Сделал по-другому, работает. Но вот насчет выделения осей так и не разобрался. Можно ли из кватерниона вытащить вращение только по заданым осям?
}:+()___ [Smile]Постоялецwww28 авг. 201617:26#57
Alerr
> Можно ли из кватерниона вытащить вращение только по заданым осям?
С математической точки зрения эта операция не имеет смысла.
AlerrПостоялецwww28 авг. 201617:30#58
Не понял. Вот у нас куб. Он как-то повернут... Мне нужно обнулить вращение по оу а по остальным осям оставить как было. Как такое с кватернионами возможно?
AlerrПостоялецwww28 авг. 201617:41#59
Ещё вот вопрос, как можно ускорить поиск среди вращений для прицепке к нужнгму углу? Я так понял, отрицательные кватернионы, это те же самые вращения, что заложены в положительных.
Страницы: 1 2 3 4 5 6 7 Следующая »

/ Форум / Программирование игр / Физика

2001—2018 © GameDev.ru — Разработка игр