Autor Wątek:  Wyświetlacz tekstowy  (Przeczytany 8028 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline Ra

  • Zasłużony dla Symulatora
  • Wiadomości: 6308
  • Ostatni gasi światło...
    • Zobacz profil
    • Instalator+Starter+Edytor
  • Otrzymane polubienia: 339
Wyświetlacz tekstowy
« dnia: 08 Grudnia 2010, 07:40:39 »
Zastanawiam się nad zrobieniem wyświetlacza tekstowego. Byłby on rozszerzeniem T3D, podobnym do replacableskin i lights. W pliku T3D należało by utworzyć specjalny submodel, zawierający co najmniej jeden trójkąt:
Cytuj
Parent: none //normalnie, co tam potrzebne
Type: Text //tu specjalny typ
Name: Table //wg potrzeby
Anim: false
Ambient: 150.0 150.0 150.0
Diffuse: 150.0 150.0 150.0
Specular: 229.5 229.5 229.5
SelfIllum: false
Wire: false
WireSize: 1.0
Opacity: 100.0
Map: Table.tga
//nazwa tekstury dla pustego wyświetlacza
MaxDistance: 1000
MinDistance: 0
Transform:
           1.0 0.0 0.0 0.0
           0.0 1.0 0.0 0.0
           0.0 0.0 1.0 0.0
           0.0 0.0 0.0 1.0
NumVerts: 6
1
-0.5 -0.5 0.0    0.0 0.0
-0.5 0.5 0.0    0.0 1.0
0.5 0.5 0.0    1.0 1.0
1
0.5 0.5 0.0    1.0 1.0
0.5 -0.5 0.0    1.0 0.0
-0.5 -0.5 0.0    0.0 0.0

Dla zachowania zgodności wstecz można by użyć Type: Mesh Name: TextArea, to jest jeszcze do uzgodnienia. Pozostałe parametry podajemy wg potrzeby. Nazwa tekstury, rozmiar pierwszego trójkąta i jego mapowanie tworzą wyświetlacz w stanie pustym (bez tekstu).

Pierwszy trójkąt (prostokąt) służy do zdefiniowania obszaru wyświetlania tekstu. Jeśli wyświetlimy jakikolwiek tekst, trójkąt ten nie będzie widoczny. Zamiast niego zostaną dynamicznie stworzone mniejsze prostokąty, teksturowane znakami, zaczynając od lewego górnego rogu (pierwszego podanego wierzchołka). Kolejne znaki zostaną ustawione w kierunku prawego górnego rogu (drugiego podanego wierzchołka). Pozostałe miejsce zostanie uzupełnione trójkątami z mapowaniem interpolowanym z podanego trójkąta (można zamapować całą teksturę, jej fragment, albo nawet jeden piksel, zależnie co chcemy uzyskać). Gdy będzie podany trzeci trójkąt, to w prostokącie przezeń określonym zostanie utworzona kopia napisu.

Znaki definiujemy jako submodele wyświetlacza. Każdy znak powinien zawierać przynajmniej jeden trójkąt (domyślnie określający prostokąt), mapowany na teksturę z alfabetem (ta sama tekstura może zawierać obraz pustego wyświetlacza). Przykładowa tekstura z programu Racer jest w załączniku. Prostokąty mogą mieć różną szerokość, ale zalecane jest, aby miały tę samą wysokość.
Cytuj
Parent: Table //nazwa wyświetlacza
Type: Mesh
Name: A
//nazwą jest pojedynczy znak
Anim: false
Ambient: 150.0 150.0 150.0
Diffuse: 150.0 150.0 150.0
Specular: 229.5 229.5 229.5
SelfIllum: false
Wire: false
WireSize: 1.0
Opacity: 100.0
Map: Charset.tga
//nazwa tekstury ze znakami
MaxDistance: 1000
MinDistance: 0
Transform:
           1.0 0.0 0.0 0.0
           0.0 1.0 0.0 0.0
           0.0 0.0 1.0 0.0
           0.0 0.0 0.0 1.0
NumVerts: 6
1
0.0 0.0 0.0    0.0 0.0
0.0 0.1 0.0    0.0 0.1  //szerokość znaku
0.1 0.1 0.0    0.1 0.1
1
0.1 0.1 0.0    0.1 0.1
0.1 0.0 0.0    0.1 0.0
0.0 0.0 0.0    0.0 0.0

W zasadzie cały submodel zostanie skopiowany, więc może mieć on dowolny kształt. Również może on mieć własną teksturę. Druga współrzędna w drugim podanym punkcie określi szerokość znaku (przesunięcie dla następnego).

Ze względu na specyfikę składni niemożliwe jest użycie pewnych znaków, jak spacja, przecinek i średnik. Zamiast nich należy używać innych znaków, zmieniając im wygląd. Można też tworzyć spacje o różnych szerokościach, o ile będą przypisane do różnych znaków (np. cyfr, jeśli te nie będą potrzebne).

Używać się będzie tego tak:

node -1 0 nazwa model 10 20 30 0 Display.t3d Text endmodel
gdzie:
-1 0 - ograniczenie widoczności
nazwa - nazwa obiektu
10 20 30 0 - współrzędne wstawienia i obrót
Display.t3d - model zawierający wyświetlacz
Text - tekst do wyświetlenia

Jak widać, nie będzie możliwe używanie replacableskin dla modelu. W razie potrzeby zawsze można ustawić inny model w tym samym miejscu, a wyświetlaczem zrobić tylko napis. Oprócz typowego zastosowania do napisów (tabliczki na semaforach, słupki hektometrowe,  etykiety na słupach, nazwy stacji, numery zwrotnic) zapewne znajdą się inne ciekawe zastosowania (np. zmiana konfiguracji okien w budynkach, budowanie ogrodzeń).

Tekstu na wyświetlaczu nie będzie można zmieniać dynamicznie - przynajmniej na razie nie przewiduję. Trójkąty dla napisów będą generowane z submodeli, gdy model znajdzie się w zasięgu wzroku i usuwane gdy nie będą potrzebne (podobnie się dzieje z podsypką i szynami).

W celu zwiększenia wydajności wskazane będzie używanie jednej tekstury dla wyświetlacza pustego i wszystkich znaków oraz tworzenia znaków o jednakowej wysokości, identycznej z pustym wyświetlaczem. W takim przypadku wyświetlacz i submodele znaków powinny zawierać po jednym trójkącie. Jeśli trójkąty nie będą prostokątne, napis będzie pochyły.
¯\_( ͡° ͜ʖ ͡°)_/¯ Ra

Polecam: kręgarz Wojciech Walczak, projekt masarni

Offline chemik35

  • Wiadomości: 154
  • Stacja Płock Trzepowo
    • Zobacz profil
  • Otrzymane polubienia: 6
Odp: Wyświetlacz tekstowy
« Odpowiedź #1 dnia: 08 Grudnia 2010, 10:50:00 »
Kiedyś myślałem nad pomysłem wyświetlacza diodowego, którego model opierałby się na świecącej teksturze przed którą umieszczałoby się ciemną teksturę z otworkami. Dałoby to niezły efekt niskim kosztem (2 tekstury z czego w jednej trzeba byłoby wycinać otworki). Można by dopisać ewentualnie programik do wycinania otworków, albo robić chałupniczo i wrzucać w razie potrzeb do folderu z teksturami EZT-a.

Offline janek32

  • Wiadomości: 567
  • EMIT Ghp400M4C
    • Zobacz profil
  • Otrzymane polubienia: 1
Odp: Wyświetlacz tekstowy
« Odpowiedź #2 dnia: 08 Grudnia 2010, 11:17:19 »
Dopiszę pomysł, który swego czasu przedstawiłem w dziale Test. Sam tekst trochę zmodyfikowałem.

Cytat: Ra
Jak mi ktoś rozpisze, jak to ma działać, to mogę dodać do Rainsted.
Generalnie - tekstura tablicy byłaby wstawiana w odpowiednie miejsce tekstury EZT. W folderze "rainsted" (tak jak z plikami *time) musiałby być katalog danej trasy, a w nim tekstury tablic różnych stacji docelowych wygenerowane programem @Paula (wyświetlacz) lub wpisane odpowiednią czcionką (stare, przewijane). W scenerii musiałaby być deklaracja (np. //$t) ze ścieżką do odpowiedniego pliku tablicy np.:
//$t rainsted\tablice\baltyk\alakowice_wysw.bmpW pliku textures.txt byłaby deklaracja, w którym miejscu powinna zostać wstawiona tablica oraz jakie ma mieć wymiary (np. pozycja rogu lewego górnego, prawego górnego, lewego dolnego, prawego dolnego). Program łączył by teksturę tablicy z teksturą pojazdu i tak przygotowany plik zapisywał w folderze pociągu (np. jako $.tga). Następnie zmieniałby wpis w scenerii tymczasowej na zmodyfikowaną teksturę. W przypadku braku deklaracji w pliku trasy, bądź wyłączonej scenerii tymczasowej, program nic by nie zmieniał. Jeśli w scenerii występowałoby kilka pojazdu pliki zmodyfikowanych tekstur byłyby nazywane kolejno ($.tga; $1.tga; $2.tga, itd.). Dobrze byłoby też przy następnym uruchamianiu trasy usunąć wszystkie zmodyfikowane tekstury z katalogu pojazdu.

Do tworzenia tekstur można wykorzystać poniższe narzędzia:
Czcionki: http://webpc.pl/czcionki/index107-0-87.html
Program @Paula: http://www.kontrakt-bhp.com.pl/paul/tablica.rar
« Ostatnia zmiana: 08 Grudnia 2010, 16:21:32 wysłana przez janek32 »
-Środa 844012.
-Zgłaszam się.
-Zapytaj energetykę, czy zapłacili rachunki, luzem ciągniemy i jest 2900.

Offline chemik35

  • Wiadomości: 154
  • Stacja Płock Trzepowo
    • Zobacz profil
  • Otrzymane polubienia: 6
Odp: Wyświetlacz tekstowy
« Odpowiedź #3 dnia: 08 Grudnia 2010, 13:21:39 »
Program @Paula jest świetny, ale przydałaby się kanał alfa, żeby wycinać otworki. Przez to dałoby się świecący ekran na wyświetlacz, a tekstury tabliczek byłby opcjonalnie wstawiane przez rainsted.

Offline janek32

  • Wiadomości: 567
  • EMIT Ghp400M4C
    • Zobacz profil
  • Otrzymane polubienia: 1
Odp: Wyświetlacz tekstowy
« Odpowiedź #4 dnia: 08 Grudnia 2010, 16:42:09 »
No to @Paul musiałby dodać odpowiednią funkcję. Zresztą, ciekawą opcją są badpiksele. Osobiście z niczym takim się nie spotkałem, ale można taką tablicę wstawić do jakiejś zdezelowanej jednostki.
Co do świecenia - w przypadku wyświetlacza faktycznie z tymi otworkami byłby dobry pomysł, jednak w przypadku starszej metody (taśmy) wycinanie otworów byłoby zbędne - tam oświetlana jest cała przestrzeń, przez co taśma też.
-Środa 844012.
-Zgłaszam się.
-Zapytaj energetykę, czy zapłacili rachunki, luzem ciągniemy i jest 2900.

Offline chemik35

  • Wiadomości: 154
  • Stacja Płock Trzepowo
    • Zobacz profil
  • Otrzymane polubienia: 6
Odp: Wyświetlacz tekstowy
« Odpowiedź #5 dnia: 08 Grudnia 2010, 17:45:36 »
Tak, wiem, dlatego w pierwszym moim poście sugerowałem to rozwiązanie do wyświetlaczy diodowych. Przydałoby się za to jakieś nierównomierne podświetlanie filmów - może wypożyczyć po pomniejszeniu poblask z latarni dworcowych albo zastosować półprzezroczysty kanał alfa pod film a za nim dać tekstury świecącej żarówki?

Offline janek32

  • Wiadomości: 567
  • EMIT Ghp400M4C
    • Zobacz profil
  • Otrzymane polubienia: 1
Odp: Wyświetlacz tekstowy
« Odpowiedź #6 dnia: 08 Grudnia 2010, 18:36:19 »
Można zrobić taką metodą jak podświetlenie przyrządów pomiarowych w 4E - na spód dać całą teksturę, a z przodu teksturę z kanałem alpha i SelfIllum: True.
-Środa 844012.
-Zgłaszam się.
-Zapytaj energetykę, czy zapłacili rachunki, luzem ciągniemy i jest 2900.

Offline Ra

  • Zasłużony dla Symulatora
  • Wiadomości: 6308
  • Ostatni gasi światło...
    • Zobacz profil
    • Instalator+Starter+Edytor
  • Otrzymane polubienia: 339
Odp: Wyświetlacz tekstowy
« Odpowiedź #7 dnia: 09 Sierpnia 2012, 01:59:54 »
Właśnie wyklarowała mi się prostsza koncepcja wyświetlacza, nie wymagająca generowania dynamicznych trójkątów, teksturowanych oddzielnie dla każdego egzemplarza (co jest bardziej kłopotliwe w przypadku VBO, bo na Display Lists by się łatwiej zrobiło). Jest ona zbliżona do tego, co opisałem poprzednio. Największą wadą była by konieczność "ręcznego" justowania tekstu do uzyskania żądanego rozmiaru obiektu.

Wyświetlacz tekstowy składał by się z submodelu bez trójkątów o własności Type: Text. Mógłby mieć on dowolną liczbę submodeli potomnych, nazwanych różnymi znakami (z rozróżnieniem wielkości), np. "a", "b", "0", "1", "Z", "@", "_" itd. Taki submodel jednoliterowy musiałby mieć zdefiniowaną szerokość w swoim transformie. Tzn. układ rysowania submodelu byłby najpierw przemieszczany o wskazany wektor względem poprzedniej pozycji, a następnie rysowany byłby submodel. Przemieszczenie następowało by narastająco, dzięki czemu można by składać napisy dowolnej długości i w dowolnym kierunku. Submodele znakowe w najprostszej formie były by prostokątami z zamapowanym fragmentem tekstury z zestawem znaków, a w zaawansowanej -- modelem 3D znaku.

Generowany napis można by ustalić za pomocą własności Name: obiektu typu Text. Przykładowo nazwa *node umieszczała by napis określony przez nazwę obiektu, zamiast tekstu podanego w miejscu tekstury.

Pozostaje jeszcze kwestia ograniczenia powielania submodeli literowych. Jeśli by we własności Map: użyć ciągu znaków zaczynającego się od gwiazdki (która nie może być w nazwie tekstury), to będzie to traktowane (bez gwiazdki) jako nazwa pliku T3D/E3D, który należy użyć do generowania napisu. Plik ten może być wspólny dla wielu modeli, np. font do numerowania wagonów, czy wypisywania nazw stacji.
¯\_( ͡° ͜ʖ ͡°)_/¯ Ra

Polecam: kręgarz Wojciech Walczak, projekt masarni