Разработать навигатор для игры? Смотрите! (часть 2.3)

Координаты Forza не совпадают с картой. Пришлось учить одну реальность понимать другую Когда я впервые увидел живые PositionX и PositionZ, было ощущение: ну все, сейчас рисуем зеленую точку на карте и едем.

Но! Координаты игры - это не пиксели карты.

Игра живет в своих мировых единицах. Карта живет как большая картинка 20000 на 20000 условных пикселей. Если просто взять x/z из Forza и поставить точку на HTML-карту, получится не навигатор, а уверенное путешествие в другую вселенную.

Пришлось делать калибровку. Берем несколько контрольных мест: где машина стоит в игре и где это место находится на карте. Потом подбираем аффинное преобразование.

В итоге две игровые координаты превращаются в две координаты карты: ```python A, B, C = 0.652837, 0.000763, 10387.027 D, E, F = -0.003754, -0.657135, 9846.097 def forza_to_map(position_x: float, position_z: float): return ( A * position_x + B * position_z + C, D * position_x + E * position_z + F, ) ``` Это был первый момент, когда проект физически ожил. До этого в консоли бегали числа. После этого машина реально поехала по карте примерно там, где должна.

Отдельная тонкость - направление. В телеметрии есть yaw, но на скорости лучше брать фактический вектор движения. Машина может быть слегка повернута, скользить, дергаться, а навигатору важно, куда она реально едет по карте. ```python def compute_screen_heading_deg(yaw_rad, velocity_x, velocity_z, speed_mps): if speed_mps > 1.5: vx_map = A * velocity_x + B * velocity_z vy_map = D * velocity_x + E * velocity_z return map_vector_to_screen_angle_deg(vx_map, vy_map) forward_x = math.sin(yaw_rad) forward_z = math.cos(yaw_rad) return map_vector_to_screen_angle_deg(forward_x, forward_z) ``` Звучит как мелочь. Но если стрелка живет отдельной жизнью, вся иммерсивность сразу складывает вещи и уходит.

Если вам интересно посмотреть проект целиком - ссылка на мой GitHub в описании профиля.