Некоторое время назад я изучал этот небольшой проект, но не зашел слишком далеко. Я хотел бы создать небольшую программу, которая позволяет пользователю рисовать железнодорожную колею, а затем позволяет «поезду» следовать по указанной колее в 2D-плоскости. Я бы хотел, чтобы трек был довольно свободной формы и имел бы красивую плавную линию. Я играл с кубическими сплайнами и имел приличные результаты, но у меня было множество проблем с тем, чтобы заставить поезд следовать за сплайном. У меня также было много проблем с созданием нескольких путей и переключением поезда с одного пути на другой.
У кого-нибудь есть советы, статьи или исходный код, которые могут помочь мне разобраться? Благодарность!
mathematics
hokiecsgrad
источник
источник
Ответы:
При рисовании дорожек или дорог я всегда хочу начать со сплайнов. Однако в последний раз, когда я боролся со сплайнами (как упоминает Рэйчел Блюм , плавное движение по сплайну непросто как из-за параметризации, так и из-за расстояний), кто-то предложил мне, что на многих реальных дорогах вместо сплайнов используются дуги окружности. Постоянная кривизна позволяет легко рассчитывать расстояния и перемещаться с постоянной скоростью вдоль них. Плюс, они хорошо выглядят.
Я начал играть с дорогами, которые чередовались между круговыми дугами и прямыми линиями. Это похоже на подход Уилла , но дуги окружности имеют переменный радиус. Я был очень доволен этим подходом, но ничего не сделал с ним. Попробуйте эту демонстрацию (Flash): элементы управления слева предназначены для сплайнов, а элементы управления справа - для дуги окружности (используйте ползунок для управления длиной и ручку перетаскивания для управления углом). Сделайте очень крутой поворот, перетаскивая конец дороги, чтобы увидеть, насколько лучше выглядит дуга окружности.
В качестве альтернативы, если вы хотите поиграть с сетками (предложено Iain ), попробуйте рисовать от края до края, а не от квадрата к квадрату. Вот демонстрация (Java-апплет).
источник
Использование правильных сплайнов Эрмита может привести к узким углам и выглядеть довольно не по-железной дороге:
У меня были гораздо более приятные результаты, если рассматривать путь как прямые линии, соединяющие круги на стыках:
Хитрость заключается в том, чтобы вычислить внутренние и внешние касательные соседних стыковочных кругов и выработать намотку каждого стыка, чтобы вы проходили с правой стороны от него.
И, в логике прокладки пути, избегайте самопересечений пути или превращайте их в перекрестки :)
Вот видео с использованием этого подхода: http://www.youtube.com/watch?v=PAVksn4btKU
источник
Вы можете попробовать позволить пользователю создавать треки, используя спирали Cornu . Вы найдете практически нет литературы об этом в Интернете, потому что сплайны де-факто способ представления кривых в программном обеспечении. Тем не менее, они - то, как фактические железнодорожные пути заделаны. Раф Левиен проделал большую работу по их популяризации .
источник
Вы можете попробовать подход, основанный на сетке, где каждый квадрат может быть связан с одним или несколькими другими квадратами. Затем вы можете иметь несколько частей, которые покрывают несколько квадратов, чтобы создать более плавные кривые. В основном модульный, как поездный набор.
источник
Я испробовал различные методы для реализации рельсовых путей и обнаружил, что участки кругов и прямых линий дают наилучший результат и самую простую математику для управления поездом.
К сожалению, это также сделало укладку трека довольно сложной и не очень интуитивно понятной, так как небольшие движения контрольных точек отправят трек в совершенно ином направлении.
Математика для принятия решения о том, как заложить дорожку, становится довольно сложной, так как добавляется больше контрольных точек.
У меня есть короткая демонстрация на http://www.dailymotion.com/video/xgl2kp_openrailz-tech-demo-3_videogames .
источник
Может быть, это будет полезно:
Поведение рулевого управления для автономных персонажей: http://www.red3d.com/cwr/steer/
источник