Pull to refresh

Comments 5

так и есть, мир рисуется относительно игрока, суть в том, что игрок 0 0 0, всё остальное микроскопическое смещение этого хватает дойти до максимума порога, это делают в открытых мирах там где мир около бесконечный или очень здоровенный

порог легко пробить уже в 0 0 0 но он будет микроскопический незаметный, ~0.00005 например повороты/углы, плюс есть моменты с косинусом и синусом плюс вычисление корня или квадратичное расстояние ) (тоесть такие вычисления, которые зависимы друг от друга например двойной кватернион который может зависеть от кватерниона, а кватернион может зависеть от вектора или не зависеть ну кароче это действительно разок проделать надо, радует что на расте легко тест-кейсы писать для модулей по этой части, а вектора и кватернионы влияют на матрицы ну а матрицы перемножаются, хотя тут и с другой стороны зайти можно, двигаем мышкой получаем смещение для поворота и поидее если мы не в 0 то пошли потери и они типо копиться могут)

я сегодня как раз столкнулся с порогом и забыл, что нельзя угол и размерности сами с собой сравнивать, с каждым новым повторением всё становится яснее и яснее, я сейчас уже на расте тесчу математику - я прыгаю то на С++ то на Раст

кстати в майнкрафте и драгонфол всё это реализовано тоже

Интересно, а случаи ускорения перемещения персонажа во время стрейфа в бок + вперёд, и впритык к некоторым наклонным коллизиям (например бордюры в Cyberpunk 2077) не со схожими причинами ли связаны?

Не, это скорее так называемый Tunneling (туннелирование). Это связано в среднем с логикой определения самого столкновения.

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 аналогичен нулю.

https://gcc.godbolt.org/z/c4r74afMr

Sign up to leave a comment.

Articles