Проблема с передвижением. Да у float знаю что точность снижена и что в цикле его нельзя использовать, так как он начинает застревать. Что же делать? Мне нужны числа на минималках, есть ли возможность работать с этим? На видео на зажал кнопку и персонаж ушел вправо, кнопка нажата, а дальше не идет и координаты показаны в конце видео, что он не хочет увеличивать своё число.
хотя я прибавляю всего по 0.04f за шаг.
Если прибавлять по 1.f, то всё работает, но это слишком быстро.
Что бы там у тебя не происходило, если вдруг захочешь изложить суть, это можно сделать прямо здесь.
Для людей с другим типом мышления попробую сказать более понятно. Проблема с float арифметикой. Что происходит при прибавлении 0.04f к иксу, то видно на экране.
v7
> Проблема с float арифметикой.
Да не, чушь. Проблема между стулом и монитором.
v7
> Что происходит при прибавлении 0.04f к иксу
Если икс имеет величину десятки тысяч или больше, то будут проблемы. Если меньше - точности должно хватить.
v7
> Для людей с другим типом мышления ... Проблема с float арифметикой. Что происходит при прибавлении 0.04f к иксу,
Ты вообще вкурсе, какая точность у 32 bit-float? 1.1 E-38 ... 3.4 E38. Т.е. твои числа отстоят от этих точек более чем на 30 десятичных разрядов.
И даже если твой ИКС близок к этим значениям, то что ты будешь прибавлять к нему хоть 0.04f, хоть 1.0f - роли не сыграет.
Как человек "с другим типом мышления" по твоему кино, твой код я восстановить не смогу, так что ты сам лови в отладчике, где у тебя nan inf и
другие чудеса типа деления на 0.
> то видно на экране.
Вот в этом и есть проблема: у тебя на экране нифига не видно.
Я уже не говорю про невидимый код, и никак непросматриваемую связь с ИИ.
Для начала стоило бы показать код.
Прибавлять надо не 0.4, а 0.4 * deltaTime
И скорее всего вы реагируете на событие когда клавиша нажалАСЬ, а не нажаТА. Это два разных события KeyDown и KeyPress.
Либо ваш компьютер считаешь клавишу залипшей и перестаёт на неё реагировать. (такое есть в Bolt для Unity)
deltaTime это разница во времени между кадрами.
Но, если вам надо именно по клеткам, то он должен сдвинуться лишь 1 раз, а не 3и как у Вас. В общем ошибка в логике и обработки событий.
MrShoor
Помню раньше шутки были такие, что типа надо прокладку между стулом и монитором поменять. хахаха.
А вообще я тебя знаю, я тебе недавно на twitch по directx писал и на стримы заходил. Я покопался в directx и даже что-то сделал, а потом понял, что всё можно и на opengl сделать и начал делать на нём.
Сейчас код покажу. Он вместе с SDL2. Кстати, камера нормально двигается, а персонаж не хочет.
void LevelForest::update () { Camera *camera = Camera::getInstance( ); const uint8_t *state = SDL_GetKeyboardState ( NULL); if ( state[SDL_SCANCODE_Q]) exit ( 0); if ( state[SDL_SCANCODE_UP]) camera->move( 0.f, -0.04f); if ( state[SDL_SCANCODE_DOWN]) camera->move( 0.f, 0.04f); if ( state[SDL_SCANCODE_LEFT]) camera->move( -0.04f, 0.f); if ( state[SDL_SCANCODE_RIGHT]) camera->move( 0.04f, 0.f); if ( state[SDL_SCANCODE_D]) human->move( 1.04f, 0.f); if ( state[SDL_SCANCODE_A]) human->move( -1.04f, 0.f); }
Вот код human.
void Object::move(float _x, float _z) { x += _x; z += _z; printf ("-- %f %f\n", x, z); translate = glm::translate(model, glm::vec3{x, y, z}); }
Да, я пока не использую deltaTime, но я туда приделаю таймер и по таймеру будет одинаковое перемещение. Просто новый движок и еще мало что сделано.
Сейчас проснулся, включил и он двигается, но по выводу пишет что всегда нули, но он двигается в нужные стороны.
-- 0.000000 0.000000 -- 0.000000 0.000000 -- 0.000000 0.000000 -- 0.000000 0.000000 -- 0.000000 0.000000 -- 0.000000 0.000000 ... -- 0.000000 0.000000
А блин, я же human в передвижении поставил 1.04, тогда понятно почему он двигается.
Так, ребята, ребята, ребята. Я сменил float тип на glm::vec3 и всё заработало. Странно, но как? Короче теперь работает, ура.
Хотя по таймеру моделька какая-то дерганная получается, может действительно deltaTime сделать.
v7
>Да у float знаю что точность снижена и что в цикле его нельзя использовать, так как он начинает застревать. Что же делать?
Можно, просто нужно в цикле каждый раз считать заново, используя исходное значение переменной и пройденное время, а результат записывая в другую переменную, тогда неточности не суммируются.
Skvoznjak
> нужно в цикле каждый раз считать заново, используя исходное значение переменной
> и пройденное время, а результат записывая в другую переменную, тогда неточности
> не суммируются
Верно. Только это никак не влияет на неточности в каждом шаге, от того, что ты накапливаешь ошибку, может измениться общее время прохождения, но не рывки в каждом шаге.
v7
Я выше написал, но ты не среагировал. Какие типичные значения для X, в каком диапазоне? Если в пределах сотен или тысяч от нуля, то не должно такого быть, нужно в другом месте ошибку искать.