Второй день мне не дает покоя этот баг из ремастеров GTA. Как могло такое произойти? Вот в этом я и решил разобраться.
У меня есть два объяснения, но я не претендую на их корректность.
1. Ориентация машины хранится в 3х3 матрице, и ее поворот неизбежно будет накапливать ошибки дробных чисел. Возможно, что разработчики использовали оригинальный код и передавали все параметры объектов (позицию, ориентацию) без поправки на накапливающиеся ошибки (то есть матрицу никто не ортогонализировал). Это мне кажется довольно сложным в исполнении, поэтому я не сильно склоняюсь к данной теории.
2. Более реальной причиной мне видится неправильное использование кватернионов. Скорее всего машину поворачивают с помощью кватернионов, но забывают нормализовать их, а они точно так же накапливают ошибку. Потом «неправильный» кватернион передается в расчеты матрицы трансформа и оттуда влияет на скейлинг самого автомобиля.
В общем, в обоих случаях кто-то забыл нормализовать структуру данных, с которой он работает.