Triangularez - konwersja dwukierunkowa STL i JPG

Proste programy do obsługi maszyn CNC, vivery, itp. Programy darmowe, napisane przez użytkowników forum
Awatar użytkownika

Autor tematu
x
Specjalista poziom 1 (min. 100)
Specjalista poziom 1 (min. 100)
Posty w temacie: 3
Posty: 243
Rejestracja: 29 mar 2006, 23:24
Lokalizacja: Laski, gm. Izabelin

Triangularez - konwersja dwukierunkowa STL i JPG

#1

Post napisał: x » 26 mar 2007, 19:57

Zastanawiałem się, czy zakładać ten wątek. A co tam. Może komuś się przyda coś takiego. Może ktoś napisze lepszą wersję, albo to sobie wykorzysta w inny sposób.

Oto program przy któym dłubię od końca lutego, w wolnych chwilach. Na razie jest w wersji "U mnie działa", kod zabałaganiony, itd. Proszę taktować triangularez jako działąjącą makietę, i nie spodziewać zbyt wiele.

Brak interfejsu graficznego!

Po przeczytaniu wątku kolegi Inf-el o jego programie generującym G-code z bitmap olśniło mnie, że "na rastrach" można znacznie łatwiej generować ścieżkę narzędzia, niż w "prawdziwym 3D" - za cenę znacznie większego obciążenia pamięci. Widzę tutaj duże możliwości, ale do prac małoformatowych. Triangularez powstał jako wprawka do właściwego programu (albo programów, bo produkowanie takich wielofunkcyjnych kobył jest trudne w jednoosobowo-amatorskich warunkach).

Program ma przetwarzać:

1. Obrazki JPG na płaskorzeźby w formace STL na zasadzie "im jaśniej - tym wyżej" - najlepszy efekt uzyskuje się ze specjalnie do tego celu przeznaczonymi obrazkami. Kolorowe piksele są przetwarzane na szare według wzoru "GRAY = R * 0.299 + G * 0.587 + B * 0.114".

2. Pliki STL na obrazki JPG - na tej samej zasadzie. Wynikiem jest JPG w skali szarości. Przy bardziej skomplikowanych modelach pojawiają się jakieś niedokładności (niepomalowane piksele na styku trójkątów). Paskudne czarne kropy. ale na razie nie mogę znaleźć błędu - prawdopodobnie za dużo przeliczeń zmiennoprzecinkowych.

Są odczytywane i zapisywane zarówno tekstowe jak i binarne STL-e, ale sprawdzałem je tylko w programie Blender. Szczerze polecam generowanie binarnych STL-i (opcja -b) - przebiega to znacznie szybciej, i binarny STL zajmuje tylko około 1/3 tego miejsca co plik tekstowy! A STL-e są strasznie dyskożerne!

Kompilacja i instalacja: Trzeba rozpakować archiwum, przejść do uzyskanego katalogu, i wydać polecenie "make" (wymagana jest tylko biblioteka libjpeg). Powinien powstać plik triangularez. Żeby ułatwić sobie zabawę tym programem, można przenieść go do jakiegoś katalogu "na ścieżce". Polecam zrobienie sobie w katalogu domowym katalogu "bin", dodanie go "do ścieżki" (export PATH=$PATH:/home/XXX/bin:) i przekopiowanie tam triangularez.

Użycie:
triangularez [OPCJE] nazwa_pliku

Opcje ogólne:
-i --help Wypisuje ten tekst.

Opcje konwersji JPEG -> STL:

-x --xskip PX Piksele JPEG-a do pominięcia w poziomie.
Ta opcja zmniejszy rozmiar pliku STL.
-y --yskip PX Piksele JPEG-a do pominięcia w pionie.
Ta opcja zmniejszy rozmiar pliku STL.
-w --width MM Szerokość obiektu zapisanego w STL w milimetrach.
-h --height MM Wysokość obiektu zapisanego w STL w milimetrach.
UWAGA: Jeśli ma być zachowana proporcja szerokości
do wysokośći należy podać tylko -h lub tylko -w.
-d --depth MM Głębokość obiektu zapisanego w STL w milimetrach.
-s --save Przekonwertuj JPEG źródłowy na odcienie szarości
i zapisz pod starą nazwą.
-c --compres PROC Stopień kompresji JPEG-a w procentach.
UWAGA: Działa z opcją -s.
-b --binary Generuj binarny STL.

Opcje konwersji STL -> JPEG:

-w --width PX Szerokość JPEG-a w pikselach.
-h --height PX Wysokość JPEG-a w pikselach.
-d --depth GRAY Ilość odcieni (od 2 do 255)
Uwaga: Wynikiem jest plik zapisany w tym samym katalogu, i pod tą samą nazwą, ale z rozszerzeniem formatu docelowego.

Uwaga 2: triangularez nie zadaje zbędnych pytań. Jeśli podamy mu plik MojBardzoWaznyProjekt.jpg, a w tym samym katalogu jest też MojBardzoWaznyProjekt.stl, to stl zostanie nadpisany nową treścią.

Czyli np.
triangularez ~/grafika/rentgen/head.jpg -w 8.2 -d 1.2 -x 10 -y 10 -b
wygeneruje binarny plik ~/grafika/rentgen/head.stl o szerokości 8.2 (mm?) (wysokość proporcjonalnie) głębokości 1.2 (mm?) przy czym siatka trójkątów będzie generowana z co dziesiątego piksela w wierszu i rzędzie wczytanego obrazka.

Jeśli komuś zechce się bawić tym programikiem, to proszę o uwagi. Jeśli ktoś uważa że "to" jest użyteczne, albo ma pomysł jak można "to" rozbudować, to też proszę o uwagi.
Załączniki
triangularez-20070312.tar.gz
żródła.
(10.88 KiB) Pobrany 660 razy
e1_triangl.jpg
Napis na gradiencie na stl. Przydało by się inteligentniejsze rozmieszczanie wierzchołków.
e1_triangl.jpg (22.33 KiB) Przejrzano 2036 razy
e2_head.jpg
zdjęcie rentgenowskie na stl
e2_head.jpg (50.61 KiB) Przejrzano 2081 razy
e3_kula.jpg
Konwersja z stl do jpg. Widać paskudne czarne kropy!!!
e3_kula.jpg (20.63 KiB) Przejrzano 2027 razy



Tagi:

Awatar użytkownika

Inf-el
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 2
Posty: 573
Rejestracja: 22 cze 2004, 18:41
Lokalizacja: Szczecin
Kontakt:

Re: Triangularez - konwersja dwukierunkowa STL i JPG

#2

Post napisał: Inf-el » 26 mar 2007, 20:41

Wstępnie oceniając, program może być bardzo przydatny jakby wyeliminować kropy bo frezarka zwariuje.
x pisze:Kolorowe piksele są przetwarzane na szare według wzoru "GRAY = R * 0.299 + G * 0.587 + B * 0.114".
Dlaczego zastosowałeś taki wzór ?
Ja mam: (R+G+B)/3. Czyżbym przeoczył jakąś ważną zasadę ?

Awatar użytkownika

Autor tematu
x
Specjalista poziom 1 (min. 100)
Specjalista poziom 1 (min. 100)
Posty w temacie: 3
Posty: 243
Rejestracja: 29 mar 2006, 23:24
Lokalizacja: Laski, gm. Izabelin

#3

Post napisał: x » 27 mar 2007, 00:55

Też zacząłem od wyliczania średniej, ale jako że kiedyś lubiłem fotografować na czarno-białych filmach, to przypomniało mi się, że kolory mają różną jasność, trzeba było o tym pamiętać. Sprawdziłem, i zmieniłem. Znalazłem gotowy przepis z mnożeniem, tutaj są troszkę inne wartości. W zasadzie obraz jest poddawany tak abstrakcyjnemu przetworzeniu, że to nie ma większego znaczenia, ale zależało mi, żeby zminimalizować wpływ koloru.

Co do krop, to mnie przygnębiły. Nie spodziewałem się takiego problemu. Rasteryzacja jest kłopotliwa, w dodatku trudno znaleźć dobre opisy szczegółów. Od dawna nikt tego nie robi ręcznie, tylko przez OpenGL, DirectX, itd. Teraz widzę, że ta opcja będzie bardziej potrzebna, więc trzeba się będzie dokształcić, i to zrobić porządnie.

Mam wersję .exe, ale jeszcze nie sprawdzałem jak działa pod windowsami.

Awatar użytkownika

Inf-el
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 2
Posty: 573
Rejestracja: 22 cze 2004, 18:41
Lokalizacja: Szczecin
Kontakt:

#4

Post napisał: Inf-el » 27 mar 2007, 10:54

Może pominiesz temat bitmap i jpg i zajmiesz się generowaniem g-kodów z tego stl-a ?
Wydaje się, że jesteś już blisko. I program po dobudowaniu jakiegoś łatwego interfejsu nadawał by sie do normalnej pracy pod linuxem.

Awatar użytkownika

Autor tematu
x
Specjalista poziom 1 (min. 100)
Specjalista poziom 1 (min. 100)
Posty w temacie: 3
Posty: 243
Rejestracja: 29 mar 2006, 23:24
Lokalizacja: Laski, gm. Izabelin

#5

Post napisał: x » 28 mar 2007, 21:29

Inf-el pisze:Może pominiesz temat bitmap i jpg i zajmiesz się generowaniem g-kodów z tego stl-a ?
Wydaje się, że jesteś już blisko.
Też mi się kilka razy wydawało, że jestem już blisko.

Grafika 3D jest naprawdę trudna, trzeba mieć opanowaną geometrę analityczną, dużo czasu, itd. A tutaj zamieniam trudne zagadnienie matematyczno-algorytmiczne na proste zadanie obliczeniowe. W tej chwili (bez bitmapy) był bym w stanie wygenerować ścieżkę dla narzędzia o zerowej średnicy, a takie się rzadko trafiają.
Inf-el pisze:program po dobudowaniu jakiegoś łatwego interfejsu nadawał by sie do normalnej pracy pod linuxem.
Interfejs graficzny (FLTK) będzie, ale we właściwym programie. Właśnie przy nim dłubię. Jak wydłubię, to mi się zachce zabrać za te kropki.

P.S.
Na sourceforge znalazłem program mesh2hmap (GPL), w działaniu bardzo podobny do mojego, ale lepszy. Konwertuje pliki VRML v. 1 ( .wrl ) na obrazki z rodziny pnm/ppm/pgm. Ładnie to wychodzi. Autor zastosował inną metodę niż ja - dla każdego trójkąta sprawdza cały prostokąt obudowujący (BoundingBox) - dla każdego punktu leżącego wewnątrz trójkąta interpoluje wysokość. Znacznie bardziej to dopracowane i dobrze działa.

Znalazłem też inny ciekawy program: geomorph który generuje dokładnie takie "heightmapy" jak potrzebuję. Jest na bieżąco podgląd 3D. Można zwiększać/zmniejszać jasność, dynamikę, dodawać efekty takie jak erozja od deszczu, wiatru, kratery. pęknięcia regularne i nieregularne.

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Software”