Jak narysować świat 3D za pomocą linii, bardziej jak rysunek szkicowy lub kreskówka


9

Zastanów się nad rysowaniem tuszem, bez cieniowania, a wszystkie linie mają jednakową wagę - tak jak to widać w komiksie paskowym, takim jak Dilbert. To reprezentuje aktywny trójwymiarowy świat, ale obiekty nie mają tekstur, ale nie widać też mozaik trójkątów.

Dla przykładu rozważ rysowanie powierzchni Księżyca. Linie, które możesz narysować, będą biegły wzdłuż górnej krawędzi wzgórz, aż do miejsca, w którym spotykają się z ogólnym poziomem powierzchni. Za nimi zrobiłbyś to samo dla większych wzgórz, w oddali, a za tym, co było widoczne z horyzontu. W przypadku kraterów możesz narysować koło dla zewnętrznej krawędzi i częściowo zamaskowane koło dla dolnej krawędzi. Głazy miałyby linię wokół krawędzi i wzdłuż głównych widocznych krawędzi. Astronauci mieliby linię wzdłuż ich zewnętrznej krawędzi i wzdłuż głównych cech skafandra kosmicznego.

Jestem doświadczonym programistą, ale nowy w programowaniu 3D. Nie mogę od razu pomyśleć o grze, która wygląda tak - czy to już zrobione? A jak by to zrobić? Przychodzą mi na myśl dwa problemy - znalezienie znaczących krawędzi i narysowanie go. Czy potrzebowałby „silnika” kodowanego od matryc w górę, opartego na liniach, zamiast zwykłego silnika 3D?


Chcę tylko ostrzec, że ludzie nie są dobrzy w postrzeganiu 3D na ekranie 2D, więc usunięcie cieniowania, które jest bardzo ważną częścią zrozumienia głębi sceny, może nie działać dobrze w grze opartej na 3D rozgrywka
Jeff

Jest jedna gra, która pasuje do opisywanego przez Ciebie stylu - Okami, wydana na PS2 kilka lat temu en.wikipedia.org/wiki/%C5%8Ckami
Eran Galperin

1
Fajnie, myślałem o tym sam. Myślę, że chciałbyś użyć jakiegoś rodzaju cieniowania , a nie tylko linii.
mpnk121

Odpowiedzi:


11

Zasadniczo chodzi o odkrywanie krawędzi i istnieje wiele gier, które robią to na wiele różnych sposobów.

Prawdopodobnie pierwszym z nich było Jet Set Radio (wydane na zachodzie jako „Jet Grind Radio”). Wydano dopiero miesiąc lub dwa później grę, dla której opracowałem podobną technikę renderowania: Looney Tunes: Space Race . (Podczas wyścigu kosmicznego dołożyliśmy wszelkich starań, aby zachować jednolitą grubość linii, a Jet Set Radio sprawiło, że nierówne szerokości linii były dużą częścią jej stylu wizualnego).

Obie gry działały w ten sam sposób; dla każdego obiektu, który ma być obrysowany, narysuj go dwukrotnie. Najpierw renderuj z odwróconą odwróceniem, z zastosowaniem wypychania wierzchołka (to znaczy przesuń każdy wierzchołek o pewną odległość wzdłuż jego normalnego wektora) i w dowolnym kolorze, w jakim mają wyglądać „linie”. Następnie narysuj ponownie, bez wypychania wierzchołka i przy normalnym odwracaniu. Ta para operacji daje kolorową sylwetkę otaczającą obiekt i to wszystko, czego używały te dwie pierwsze gry. W Space Race utrzymałem iluzję stałej szerokości linii, popychając wierzchołki w różnej odległości, w zależności od odległości obiektu od kamery. W Jet Set Radio tak się nie stało (co spowodowało, że linie stawały się większe lub mniejsze, ponieważ obiekty zbliżały się lub oddalały od kamery)

NVidia i ATI mają kilka demonstracji innych sposobów na osiągnięcie tego efektu, głównie obracających się wokół shaderów pikseli szukających normalnych, które są prostopadłe do wektora z kamery na piksel dla każdego piksela, ale wszystkie one wymagają siatek o bardzo wysokiej rozdzielczości i produkują niespójne szerokości linii w praktyce. Nie wiem, czy jakieś gry rzeczywiście używają tego rodzaju podejścia; Chyba nie widziałem żadnych, które wyglądałyby jak próbki tych firm.

Wskażę ci także Dragon's Lair 3D , która jest jedyną znaną mi grą, która wydaje się robić to właściwie; pobranie iloczynu iloczynu kamery do wielokąta i normalnej wielokąta dla każdego wielokąta w modelu, aby zobaczyć, czy każdy wielokąt jest skierowany w stronę kamery, czy od niej, a następnie sprawdzenie wszystkich par połączonych wielokątów; jeśli jakakolwiek para wielokątów ma wspólną krawędź, a jeden wielokąt jest skierowany w stronę kamery, a jeden wielokąt nie, wówczas rysuje cienką linię o stałej szerokości wzdłuż tej krawędzi w przestrzeni ekranu. (Nie mogłem sprawić, by działało to wystarczająco szybko na Dreamcast for Space Race, inaczej bym go użył. Dzisiaj, na nowoczesnych komputerach, właśnie w ten sposób staram się osiągnąć ten efekt, mimo że ”

Dragon's Lair 3D to także jedyna gra, o której wiem, która rysuje linie między obszarami o innym kolorze lub w nieciągłościach wierzchołków, nawet jeśli nie ma tam krawędzi sylwetki. Podejrzewam, że mieli niestandardowe narzędzie, które pozwalało artystom na wyznaczanie krawędzi wielokątów, aby zawsze otrzymywali linię.

Okami , o którym wspominali niektórzy ludzie, wydaje się używać podwójnego renderowania wertowania z wierzchołkami, podobnego do Jet Set Radio i Space Race, ale także używa tekstur, które zostały zbudowane w szczotkowanym stylu. (Na przykład wzgórza w odległości są rysowane jako pociągnięcia pędzla w teksturę narysowaną jako standardowy quad). Okami jest piękny, ale nie sądzę, że naprawdę dotyka technologii, o którą pytasz; na pewno wykorzystuje swoje starsze podejście.

Teraz w twoim przypadku pytasz o zrobienie tego bez wypełnienia kolorem, po prostu rysowanie świata tylko za pomocą linii. To łatwe do zrobienia; po prostu narysuj wszystkie wielokąty bez oświetlenia, w jednym stałym kolorze, który pasuje do koloru tła. Każde z tych podejść powinno działać przy użyciu tego podejścia, w ogóle nie zmieniając silnika gry. Ważne jest, aby narysować wielokąty „tego samego koloru co tło”, ponieważ zapobiegną one przedostawaniu się krawędzi tła przez obiekty na pierwszym planie, co może być bardzo mylące.


+1 świetna odpowiedź, w tym zarówno teoria, jak i ciekawe przykłady
Maik Semder

Świetna odpowiedź, dziękuję za poświęcony czas.
cheerless bagno

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.