Pomyślałem że szkoda aby moje wypociny się marnowały, więc przeklejam je tutaj, a że jestem ich autorem to wolno mi
------------------------------
W tym miejscu, chcę przedstawić poradnik, jak zbudować własny
spline i omówię wszystkie sekcje jakie znajdują się w pliku
.sli.
UWAGA! Nie wzorujcie się na SDK, a konkretnie na pliku
Inofficial_SDK_Omsi_0.1.02.pdf, bo chyba od tamtego czasu zmieniła się trochę struktura spline.
Do dzieła. Najlepiej się omawia na przykładzie, a więc na tapetę idzie jeden z prostszych segmentów czyli
str_2spur_11m_SeeburgerStr1.sli. Plik można edytować w notatniku.
Struktura każdego spline składa się z 4 sekcji: Height Profiles, Textures, Graphical Lanes i Paths. Do poprawnego zrozumienia wartości używanych w pliku trzeba to zobrazować plikiem:
Ważne: wszystkie wartości są wyrażone w metrach. Do tego trzeba sobie rozrysować przyszły spline na kartce, bo jak widać,
jest on symetryczny!. Zatem koordynatą środka X jest
zawsze 0, a resztę drogi rozkładamy na boki. W powyższym przypadku chodnik przypada w sekcjach -10.5 do -5.5 oraz 5.5 do 10.5. Droga natomiast to obszar pomiędzy punktami -5.5 do 5.5 (na osi X - jest to ważne). Wszystkie sekcje swoje wpisy opiera na kierunku
od lewej do prawej. Nie sprawdzałem czy zaburzenie tej kolejności coś psuje (na pewno czytelność).
Po takim wstępie omówię po kolei sekcje:
Kod:
---------------------------
Height Profiles
---------------------------
[heightprofile]
-10.500
-5.500
0.250
0.250
[heightprofile]
-5.500
5.500
0.100
0.100
[heightprofile]
5.500
10.500
0.250
0.250
Z angielskiego: profil wysokości. Jak widać są trzy wpisy w sekcji. Pierwsza odpowiedzialna jest za lewy chodnik. Wg. wzoru:
Kod:
[heightprofile]
x1 - współrzędna lewej krawędzi
x2 - współrzędna prawej krawędzi
z1 - wysokość lewej krawędzi
z2 - wysokość prawej krawędzi
0.250 - jest to wysokość chodnika (tak to zostało przyjęte)
Drugi wpis w sekcji mówi nam, że od punktu -5.5 do 5.5 (czyli razem 11 metrów szerokości) będziemy mieli drogę na wysokości 0.1 (standardowa wysokość drogi w OMSI).
Trzeci wpis to prawy chodnik, stworzony analogicznie do lewego.
Zasada jest prosta: im więcej przewidujemy różnic wysokości w spline, tym więcej wpisów musi być w sekcji.
Każdy odcinek musi być opisany w profilu wysokości!. Np. spline z chodnika, asfaltu, pasu zieleni, asfaltu i chodnika musi posiadać 5 wpisów w sekcji jeśli chcemy, aby chodnik i pas zieleni był wyżej niż asfalt.
Sekcja textures:
Kod:
---------------------------
Textures
---------------------------
[texture]
str_side1.bmp
[texture]
str_asphdrk_1line.bmp
Każda z użytych tekstur musi być wpisana w tej sekcji. Tekstury są "numerowane", tzn. że w przyszłej sekcji definicje tekstur są
liczone od góry i od 0, w tym przypadku wpis
str_side1.bmp będzie miał numer
0 a
str_asphdrk_1line.bmp będzie miał numer
1 i tak dalej (w przypadku większej ilości tekstur. Pliki wypisane w tej sekcji muszą znajdować się w katalogu "textures" (oczywiście powinny posiadać też swój plik .cfg).
Sekcja następna (najtrudniejsza) to Graphical Lanes:
Kod:
---------------------------
Graphical Lanes
---------------------------
Left sidewalk:
[profile]
0
[profilepnt]
-10.500
0.250
0.187
0.200
[profilepnt]
-5.500
0.250
0.953
0.200
[profile]
0
[profilepnt]
-5.500
0.250
0.953
0.200
[profilepnt]
-5.500
0.100
0.995
0.200
Lane:
[profile]
1
[profilepnt]
-5.500
0.100
0.995
0.167
[profilepnt]
0.000
0.100
0.005
0.167
Lane:
[profile]
1
[profilepnt]
0.000
0.100
0.005
0.167
[profilepnt]
5.500
0.100
0.995
0.167
Right sidewalk:
[profile]
0
[profilepnt]
5.500
0.100
0.995
0.200
[profilepnt]
5.500
0.250
0.953
0.200
[profile]
0
[profilepnt]
5.500
0.250
0.953
0.200
[profilepnt]
10.500
0.250
0.187
0.200
Left sidewalk: <---- to jest ignorowany wpis w tej sekcji, służy za komentarz.
[profile]
0 <---- odnosi się do numeru tekstury z sekcji "textures". Zgodnie z przykładem jest to tekstura
str_side1.bmp, czyli chodnik. Teraz definiujemy położenie tekstury:
Do łatwiejszego omówienia przyda się kolejny obrazek przykładowej tekstury:
Kod:
[profilepnt]
-10.500 <--- położenie punktu x1
0.250 <--- wysokość punktu x1
0.187 <--- wartość od którego punktu zaczyna być pobierana określona tekstura (w tym przypadku jest to odległość 18,7% od lewej krawędzi)
0.200 <--- trochę tajemniczy faktor, który odpowiedzialny jest za powtarzanie się tekstury, czasem trzeba go dobrać doświadczalnie, sam dokładnie tego nie zgłębiłem
Aby "zakończyć" kładzenie tekstury, należy zdefiniować jej drugi brzeg:
Kod:
[profilepnt]
-5.500 <--- położenie punktu x2
0.250 <--- wysokość punktu x2
0.953 <-- wartość do którego punktu zaczyna być pobierana określona tekstura (w tym przypadku jest to odległość 95,3% od lewej krawędzi)
0.200
W teorii zakończyliśmy definicję chodnika. Ale chcielibyśmy, aby był ładny krawężnik, zamiast "powietrza pod chodnikiem". Zatem nic prostszego, definiujemy kolejną podsekcję wykorzystując różnicę wysokości:
Kod:
[profile]
0 <--- definicja tekstury
[profilepnt]
-5.500 <--- punkt x1 krawężnika
0.250 <--- wysokość punktu x1 krawężnika
0.953 <-- wartość od którego punktu zaczyna być pobierana określona tekstura (w tym przypadku jest to odległość 95,3% od lewej krawędzi)
0.200
[profilepnt]
-5.500 <--- punkt x2 krawężnika jest równy x1, ponieważ idziemy w pionie!
0.100 <--- wysokość punktu x2 krawężnika - tu jest zmiana wysokości
0.995 <-- wartość do którego punktu zaczyna być pobierana określona tekstura (w tym przypadku jest to odległość 99,5% od lewej krawędzi)
0.200
I już! Ponieważ jesteśmy w punkcie -5.5 zabieramy się za drogę, więc definiujemy kolejne sekcje:
Kod:
Lane: <--- pomijalny komentarz
[profile]
1 <--- tekstura numer 1 (czyli druga!)
[profilepnt]
-5.500 <--- x1
0.100 <--- z1
0.995 <--- ciekawa sprawa, jeżeli zaczniemy definiować teksturę od prawej do lewej [od 99,5% do 0,5%] to zostanie ona odbita lustrzanie!)
0.167
[profilepnt]
0.000 <--- x2 (sam środek)
0.100 <--- z2
0.005 <--- ciekawa sprawa, jeżeli zaczniemy definiować teksturę od prawej do lewej [od 99,5% do 0,5%] to zostanie ona odbita lustrzanie!)
0.167
Lane: <--- pomijalny komentarz (tworzymy kolejny pas)
[profile]
1 <--- tekstura numer 1 (czyli druga!)
[profilepnt]
0.000 <--- x1
0.100 <--- z1
0.005 <--- tym razem tekstura "po bożemu" czyli od lewej do prawej [od 0,5% do 99,5%]
0.167
[profilepnt]
5.500 <--- x2
0.100 <--- z2
0.995 <--- tym razem tekstura "po bożemu" czyli od lewej do prawej [od 0,5% do 99,5%]
0.167
I mamy załatwioną drogę. Został nam chodnik, a ponieważ idziemy od lewej, jako pierwszy musimy ułożyć krawężnik:
Kod:
[profile]
0 <--- tekstura pierwsza z listy
[profilepnt]
5.500 <--- x1 = x2
0.100 <--- z1 (krawężnik przy drodze)
0.995
0.200
[profilepnt]
5.500 <--- x2 = x1
0.250 <--- z2 ((krawężnik przy chodniku)
0.953
0.200
[profile]
0 <--- tekstura pierwsza z listy
[profilepnt]
5.500 <--- x1
0.250 <--- z1
0.953 <--- tekstura odwrócona lustrzanie (bo pierwszy punkt jest dalej lewej krawędzi)
0.200
[profilepnt]
10.500 <--- x2
0.250 <--- z1
0.187 <--- tekstura odwrócona lustrzanie (bo pierwszy punkt jest dalej lewej krawędzi)
0.200
I tyle. O czym należy bezwględnie pamiętać? O właściwej strukturze, czyli najpierw definiujemy fragment
teksturą ([profile]) a następnie
dwoma punktami ([profilepnt]).
I na koniec definiujemy patche, czyli ruch na naszym spline, bo na razie jest martwy:
Kod:
---------------------------
Paths
---------------------------
[path]
1
-7.806
0.250
1.959
2
[path]
0
-1.639
0.100
3.278
1
[path]
0
1.639
0.100
3.278
0
[path]
1
7.806
0.250
1.959
2
Definicja ścieżki nie jest trudna. Oto opis:
Kod:
[path]
V <--- definicja, kto może się poruszać ścieżką (0 - auto, 1 - pieszy, 2 - kolej)
X <--- miejsce, w którym dana ścieżka jest położona (wartości zgodnie z pierwszym rysunkiem)
Z <--- wysokość (dla aut 0.1, dla pieszych 0.25)
W <--- szerokość ścieżki (1.959 dla pieszych, 3.278 dla aut)
D <--- kierunek poruszania się (0 - do przodu, 1 - do tyłu, 2 - oba kierunki)
Patche należy tak modyfikować, aby nasze spline mogły się połączyć już z istniejącymi. A na deser, dowód że to działa. Mój pierwszy spline