Comments 5
так и есть, мир рисуется относительно игрока, суть в том, что игрок 0 0 0, всё остальное микроскопическое смещение этого хватает дойти до максимума порога, это делают в открытых мирах там где мир около бесконечный или очень здоровенный
порог легко пробить уже в 0 0 0 но он будет микроскопический незаметный, ~0.00005 например повороты/углы, плюс есть моменты с косинусом и синусом плюс вычисление корня или квадратичное расстояние ) (тоесть такие вычисления, которые зависимы друг от друга например двойной кватернион который может зависеть от кватерниона, а кватернион может зависеть от вектора или не зависеть ну кароче это действительно разок проделать надо, радует что на расте легко тест-кейсы писать для модулей по этой части, а вектора и кватернионы влияют на матрицы ну а матрицы перемножаются, хотя тут и с другой стороны зайти можно, двигаем мышкой получаем смещение для поворота и поидее если мы не в 0 то пошли потери и они типо копиться могут)
я сегодня как раз столкнулся с порогом и забыл, что нельзя угол и размерности сами с собой сравнивать, с каждым новым повторением всё становится яснее и яснее, я сейчас уже на расте тесчу математику - я прыгаю то на С++ то на Раст
кстати в майнкрафте и драгонфол всё это реализовано тоже
Интересно, а случаи ускорения перемещения персонажа во время стрейфа в бок + вперёд, и впритык к некоторым наклонным коллизиям (например бордюры в Cyberpunk 2077) не со схожими причинами ли связаны?
GPU работает на float. Шейдеры, рендеринг, физический движок — всё 32 бита.
Дык вроде перед рендерингом все абсолютные координаты конвертируются в экранные координаты float от 0 до 1. У физического движка могут быть проблемы, не знаю. Но помнится в игре The Crew от Ubisoft координаты как-то сделали через двойной float.
Epsilon-сравнение
В C++ для эпсилона есть std::numeric_limits<float>::epsilon(), неужто такого нет в c#?
Дык вроде перед рендерингом все абсолютные координаты конвертируются в экранные координаты float от 0 до 1
И что с того? Они перестанут быть флотами?
В NDC координаты преобразуются после всех трансформаций и перспективного деления.
В C++ для эпсилона есть std::numeric_limits<float>::epsilon()
Бестолковая вещь в данном контексте. Пу сути она возвращает минимально возможный float.
На работе с координатами ваш epsilon аналогичен нулю.
Почему ваш персонаж телепортируется при высоком FPS: float precision в играх