Итак. Как и обещал пара советов.
Для начала, я изобразил теоретическую траекторию поезда и схематическую форму путей, места пересечения границ блоков я взял за опорные точки, они выделены синим.
Иллюстрация:
[attachment=3]scheme1.PNG[/attachment]
Далее я на основе занимаемого пространства определил размер площадки для разворота, 3х3 оказалось достаточно.
Так-же я четко выделил все опорные пункты белым. Красным прямоугольником выделена площадка, зелеными - прямые пути.
Иллюстрация:
[attachment=2]scheme2.PNG[/attachment]
Здесь я определил размер вагона - 2х3, выбрал положение осей, которые будут опираться на путь.
Оси выделены красным, физический центр располагается прямо между осями и выделен желтым.
Иллюстрация:
[attachment=1]scheme3.PNG[/attachment]
Ближе к коду.
У нас есть вагон, у него 2 оси.
Когда вагон поставлен на рельсы, мы должны точно проверить, соответствует ли количество путей размерам вагона. Это очень важно, иначе ничего не получится. Так-же было бы неплохо специальный инструмент для снятия путей, и ограничение на снятие путей, над которыми находятся вагоны.
Сразу при установке вагона, мы должны установить координаты двум осям в пространстве. Координаты эти берутся из координат путей, на которые ставится вагон. Оси должны встать точно на центр между блоками по ширине вагона, а между осями должно быть строго определенное расстояние, при чем определенное заранее, от него будет зависеть многое. И естественно вагон должен стоять параллельно путям, и желательно укладываться идеально точно в центре 2*3 блока. Для этого можно сначала определить цент вагона, а затем вычислить координаты осей. При этом оси обязательно равноудалены от центра.
Немного о данных.
Для начала, сразу после установки вагона мы должны определить 2 вещи. Это позицию блока, на котором стоит задняя ось, и блока на котором стоит передняя. Это тоже очень важно.
Немного о теории.
Весь наш вагон воспринимайте как отрезок между двумя координатами осей. Это точки А и Б.
Опуская пока высоту у каждой точки есть х и у. Обозначать я их буду А.х, А.у, Б.х, Б.у.
Но модель вагона мы можем отобразить только по одной точке. Для этого мы вычислим центр С.
С.х=(А.х+Б.х)/2
С.у=(А.у+Б.у)/2
Таким образом, мы получаем центральную точку между А и Б.
Далее мы должны определить угол между А и Б.
Вот так выглядит код моей функции в с++:
double radxy(double xc,double yc,double x,double y){ double a=0; if(yc!=y) a=atan((xc-x)/(yc-y))-M_PI/2; if(yc<y) return a; else return a+M_PI;}
Я использовал вещественные двойной точности, но нам хватит и обычных. M_PI - это 3.1415.
Получив угол, мы должны повернуть точно по нему вагон.
Теперь о движении.
Сейчас я объясню, зачем нужны 2 оси и зачем нужны позиции блоков под осями. Самое главное - понять принцип.
Выше я проставлял опоры на иллюстрациях. Опора должна быть у каждой пары рельс. Вернее одна половина рельсы просто для декорации, вторая - имеет эту самую опору на стыке с первой, декоративной половиной.
Примечание: Можно, но не обязательно взять за расстояние между осями длину двух блоков, ибо это расстояние между крайними опорами на пути длиной три блока, на котором изначально стоит вагон.
Теперь о главном - во время движения ось должна находится на воображаемом отрезке между текущей опорой, к которой закреплена ось(А вот для этого и нужна позиция блока под осью.) и опорой на следующей паре рельс, к которой движется эта самая ось. Для этого достаточно знать точную позицию опоры (О.х,О.у), позицию следующей опоры (О2.х,О2.у), а так-же пройденный путь относительно начала отрезка, соединяющего опоры - Р.
При движении вагона мы:
0) По направлению движения оси определяем "конечную" опору. Текущую берем по позиции блока под осью.
1) Увеличиваем Р на величину скорости.
2) Проверяем, не больше ли Р, чем расстояние между опорами. Если да - то мы должны взять за текущую опору под осью ту, которую на данный момент считали "конечной", присвоить Р = Р - текущее расстояние между опорами. Если нет - то ничего не менять.
3) Теперь нужно вычислить координаты оси. Зная координаты опор, расстояние между ними, и пройденный относительно начала отрезка путь это не сложно.
4) Делаем то-же самое для второй оси.
5) Определяем центр и угол направления вагона по формулам, что были выше. Применяем их.
6) ???
7) PROFIT!!!
Из плюсов:
0) Гладкое движение.
1) У нас две оси. Обычно они идут друг за другом по одним и тем-же рельсам. Однако ничто не мешает удлинить вагон, передние оси поставить на одни рельсы, а задние на параллельные первым рельсы. Не знаю зачем, но может пригодится.
2) Если взять и разделить "оси на рельсах" и "воображаемые реальные оси вагона", объединить их упругими связями, то вагон при движении будет покачиваться и наклоняться даже реальней чем в ИРЛ.
3) Можно подстроить под любые вагоны, ширину рельс и т.д.
4) Учитывая, что позиции следующей рельсы берется с учетом направления движения оси, в пересечении 2 путей нет вообще никаких проблем. Только 2х2 платформу-пересечения с опорой в центре добавить, и все. Вагон проедет так, как надо.
Минусы:
0) Не дай Бог рельсам исчезнуть из под колес, как с вагоном произойдет НЁХ.
Иллюстрация:
[attachment=0]scheme4.PNG[/attachment]
Судя по примеру в левом углу четко видно, что применяя метод даже на Г-образных угловых рельсах поворот получается плавным и округлым.
В центре довольно коряво я попытался изобразить состояние осе-отрезка на разных этапах движения, намеренно взяв немного в сторону, что-бы не затирать путь.
P.S. Прошу прощения за мад скиллз. Иллюстрации лучше видны в пейнте при 4х-8ми кратном зуме.
P.S.S. Приятного мозго-плавления.