При прицеливании может происходить явление параллакса, которое воспринимается как “скачущий прицел”.
Как видно из картинки, проблема в том, что линия визирования и линия прицеливания могут не совпадать. Прицел же всегда рисуется не по линии визирования, а по линии прицеливания. Поэтому в некоторых случаях он может скакать.
Прицел для оружия с баллистической траекторией не сломан. Для такого оружия возможны три варианта поведения:
Прицел рисуется, игнорируя баллистику
Прицел рисуется в предполагаемой точке попадания
Рисуется два прицела
Мы просто выбрали один из вариантов, который нам показался более удобным, применительно к нашей игре.
Ответы на некоторые вопросы
А можно сделать так, чтобы параллакса не было?
Нет в нашей Вселенной. Вот настолько явление параллакса фундаментально.
А вот в других играх такого нет!!!
Величина параллакса зависит от расстояния между центром камеры и точкой, откуда вылетают пули/снаряды. В большинстве шутеров, для удобства, пули вылетают из центра камеры. Таким образом, в этом и только в этом случае, линии визирования и прицеливания совпадают и явление параллакса не наблюдается (нулевой параллакс). В нашей игре добиться такого невозможно.
мне кажется, что людей бомбят именно скачки, можно же плавный перевод делать с фокусом не сразу на точку попадания, а сглаживать переход…
например фокусироваться на промежуточных точках пространства между точкой ухода с объекта 1 и точкой прихода на объект 2, чтобы визуально сгладить скачек…
рассчитать расстояние между объектами и путь прицела построить по промежуточным точкам с шагом в пиксель ну или сколько там глазу не заметно, чтобы достичь плавности перехода, чтобы ПРИЦЕЛ не скакал…
А можно сделать дырявые разрушаемые объекты прозрачными для прицела? Чтобы пухи не задирались и не начинали неадекватно поворачиваться, хотя сквозь эти заборчики всё видно. Это же не сарай или дом как в каких нибудь танках, это просто простреливаемый хлам, визуально даже не сплошной.
Ну смотрите.
Пусть будет близкий объект (метров 20) и дальняя стена (пусть метров 500 до неё). У вас точка визирования и точка прицеливания на крайнем левом пикселе ближнего объекта. Соответственно, прицел там же и рисуется на объекте.
Допустим, вы смещаете камеру влево на 1 пиксель. Точка визирвания теперь на стене на удалении 500м. Как в этом случае вы предлагаете перемещать прицел и за какое время?
время перемещения вычислять исходя из требования к “плавности движения прицела” это надо определять эмпирически, я не скажу на вскидку про 1мсек\пиксель, замерять надо чтобы глазу было удобно…
точки фокуса внутри пространства есть же между объектами, перемещения не обязательно должны совпадать с проекцией прицела на какой-то объект в каждый момент времени…
расстояние есть же, вычислить шаг перемещения можно зная расстояние и “шаг плавности” - делим расстояние на “шаг плавности” - получаем количество шагов (сдвигов в N пикселей) для обеспечения визуальной плавности перемещения прицела.
я же выше написал, что надо это эмпирически выяснять - добавить в конфиг параметр и менять его до тех пор пока визуально не будет плавно выглядеть перемещение…
либо нейронку натравить, если у вас есть ДС, они могут решить такую задачу по идее…
можно, как вариант, наколхозить переход до “условного” центра на поверхности объекта считать траекторию прицела, исходя из расстояния до объекта и длины\ширины объекта вычислять количество шагов, но в этом случае перемещение будет чуть более рваным, либо смазанным как мне кажется…
да, он будет опираться на некоторые промежуточные рассчитанные точки в пространстве для обеспечения плавности перевода прицела
на самом деле они есть, они между объектами - в пространстве.
глаз человека не мгновенно перемещает фокус между объектами, перемещение фокуса не дискретно, а происходит плавно, хотя и очень быстро.
по сути вам надо играться только с глубиной, расстоянием до точки на объекте, не сразу перемещать на всю глубину, а как бы сделать переход в несколько шагов при движении прицела между объектами, чтобы он выглядел плавно для глаза… точкой попадания пули при этом считать проекцию от точки прицеливания в пространстве на объект.
Доли секунды, какие конкретно нужно выяснять опытным путем, как я выше написал, вариантов несколько:
Машинным обучением считать, например методом градиентного спуска, в принципе выглядит как задача оптимизации scipy.optimize.minimize.
Человека посадить, который вычислит это путем перемещения ползунка количества шагов для разных расстояний затем обобщить и вывести коэффициент.
Наколхозить смещение до “условного” центра на поверхности объекта считать траекторию прицела, исходя из расстояния до объекта и длины\ширины объекта вычислять количество шагов, но в этом случае перемещение будет чуть более рваным, либо смазанным как мне кажется…
ничего не делать, прицел то не перемещается… как были координаты его на x1 y1 z1 так там и оставить…