Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / [Решено] Перевод стрелок с кватернионами (3 стр)

[Решено] Перевод стрелок с кватернионами (3 стр)

Поделиться

Страницы: 1 2 3

foxesПостоялецwww14 дек. 20163:12#30
programina
вообще угол между единичными векторами это
atan2(dot(V1,V2),length(cross(V1,V2)))
normalized(cross(V1,V2)) - это вектор вокруг которого происходит вращение
а кватернион который ты ищешь это quaternion(normalized(cross(V1,V2)),The_const*Deltatime)
если все это по раскрывать, как целую формулу для конкретного примера, то там куча сокращений будет.
programina
> если углов не один
да хоть 10, есть объект у которого:
- есть 2 точки которые дают его направление.
- вектор 1,0,0 повернутый также как и объект.

programina
> может получиться поворот на 340° против ч.с.
не может, потому что sin(a) = length(cross(V1,V2)) - а это всегда положительно, следовательно не больше 180.
programina
> но ведь это тот же самый кватернион только в профиль. :)
Я бы сказал это тоже самое, только общая формула которую можно взять из API.
А ты че хочешь?

Правка: 14 дек. 2016 13:09

mr.DIMASПостоялецwww14 дек. 20169:19#31
Misanthrope
> и в чем заключалось это самое мудоханье?
Куда проще сделать так
float fixedTimeStep = 1.0f / 60.0f;
float gameClock = clock() / (float)CLOCKS_PER_SEC;
while(true) {
  float dt = clock() / (float)CLOCKS_PER_SEC - gameClock;
  while(dt >= fixedTimeStep) {
    dt -= fixedTimeStep;
    gameClock += fixedTimeStep;
    
    // логика обновляется здесь строго 60 раз в секунду
  }
  
  // рендер идет здесь
}
    

Чем везде множить на dt

foxesПостоялецwww14 дек. 201611:46#32
mr.DIMAS
> float dt = clock() / (float)CLOCKS_PER_SEC - gameClock;
Здесь обычно считают на целых числах, иначе точность теряется при больших значениях. И такой подход используют для расчета сложной физики где маленькие промежутки времени дают погрешность или 0 изменений - все это проблемы формата числа с плавающей точкой их гораздо больше и становятся заметны при большом удалении от начала системы координат.

В твоем примере мое DeltaTime ни куда не делось оно просто константа. Без нее в общей формуле не обойтись и для каждой реализации твоего подхода оно разное.
А для подбора оптимального DeltaTime, обычно там где стоит
// логика обновляется здесь строго 60 раз в секунду
вызывают аналог метода
void calcPhysics(float DeltaTime)

Опять же, что делать если нужно реализовать эффект замедления/ускорения времени.

mr.DIMAS
> За использование deltaTime надо бить палкой по рукам.
Так что deltaTime из общей формулы ни куда не денется. И статья совсем не об этом.
А вот за НАМЕРЕННОЕ указание 100500 разных констант, которые возникают путем умножение фиксированной дельты A, дельты B, дельты C (и тд) на другие константы, в коде из 100 строк, что превращает его в не читабельный, действительно нужно бить по рукам.

Правка: 14 дек. 2016 13:17

MisanthropeПостоялецwww14 дек. 201613:42#33
mr.DIMAS
> Куда проще сделать так
Куда проще таймер прицепить
mr.DIMASПостоялецwww14 дек. 201617:59#34
Ты походу не разобрался что делает этот код.
programinaЗабаненwww14 дек. 201620:26#35
Я уже примерно знаю как решить эту проблему, просто сил нет встать, сесть за ноут и написать.
Огромное спасибо всем за помощь!
programinaЗабаненwww14 ноя. 201723:52#36
C библиотекой glm это легко:
vec4 v = vec4(0.0, 1.0, 0.0, 1.0); // это не сам вектор, точка пространства, в данном случае кончик стрелки

float a = 1.0f; // 1 градус вращения

vec3 o = vec3(1,0,0); // ось вращения

quat q = rotate(quat(), radian(a), o);

v = q * v; // каждое умножение поворачивает вектор-точку v на a градусов вокруг оси вектора o

Правка: 14 ноя. 2017 23:55

Страницы: 1 2 3

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

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