W moim projekcie tworzę system do deformowania bardzo szczegółowej siatki (odzieży), aby „pasowała” do wypukłej siatki. Aby to zrobić, używam map głębokości przedmiotu i „kadłuba”, aby określić, w którym punkcie przestrzeni świata występuje odchylenie i zasięg.
Po prostu przekształcenie wszystkich zasłoniętych wierzchołków na głębokości określone przez „kadłub” jest dość skuteczne i ma dobrą wydajność, ale cierpi z powodu problemu nie zachowania cech siatki i wymaga obszernego wyrównywania, aby uniknąć fałszywych trafień.
Zamiast tego chciałbym wygenerować z mapy odchyleń głębokości zestaw prostych „odkształcaczy”, które „wypchną” * wszystkie wierzchołki zdeformowanej siatki na zewnątrz (w przestrzeni świata). W ten sposób wszystkie cechy siatki zostają zachowane i nie ma potrzeby posiadania złożonej heurystyki, aby wyrównać niewłaściwe wierzchołki.
Nie jestem jednak pewien, jak przejść do generowania tego zestawu deformatorów. Wyobrażam sobie coś w rodzaju algorytmu, który próbuje dopasować sferyczną powierzchnię do każdej łaty przylegających odchyleń w określonym zakresie, ale nie wiem od czego zacząć.
Czy ktoś może zasugerować odpowiedni filtr lub algorytm do generowania deformatorów? Lub inaczej mówiąc „kompresowanie” mapy głębokości?
(* Wciśnij, ponieważ dopasowuje się do wypukłego, „grubego” humanoida, więc transformacje prawdopodobnie będą „kuliste” z POV powierzchni.)
Edycja: Oto słusznie zasugerowany obraz / schemat, który ilustruje to, co próbuję osiągnąć.
Powinienem też powiedzieć, że odkąd to pytanie zostało opublikowane, pracowałem o wiele więcej nad tym problemem i chociaż nigdy nie rozwiązałem problemu z uzyskaniem deformatorów, ostatecznie zdecydowałem, że mapy głębokości do tego celu są nieodpowiednie:
- Jeśli zdeformowane oczek nie jest kompletna, to jest możliwe, aby uzyskać teksele w mapie, które oznaczało, aby być po drugiej stronie wypukłej mesh (ponieważ nie są one zasłonięte przez te bliżej kamery na właściwej stronie).
- Wydajność nie była tak wysoka, jak się spodziewałem, ponieważ na odkształcenie potrzebnych było 6 map.
Nie dlatego, że były one nierozwiązywalne, ale inne rozwiązanie, które obejmowało testowanie kolizji w jądrach działających na GPU, skutkowało wyższą jakością wyników i było znacznie prostsze, chociaż może nie być tak szybkie.
Nadal uważam, że ten problem pytań jest interesujący i byłbym zainteresowany wszelkimi odpowiedziami, ponieważ jestem pewien, że są sytuacje, w których byłby preferowany.
Odpowiedzi:
Masz mapę głębokości, która, jak zakładam, jest po prostu odległością między wypukłą siatką A a neutralną zdeformowaną siatką B, i masz normalne powierzchnie siatki A.
To, czego brakuje, to wagi (lub grupy), w jaki sposób każdy wierzchołek siatki B wpływa na sąsiadów. Na przykład, kiedy środkowy wierzchołek zostanie przesunięty, powinien również przeciągnąć się wzdłuż sąsiednich wierzchołków o pewną wartość (procent), jeśli należą do tej samej grupy.
Jeśli masz grupę wierzchołków, które wpływają na siebie w 100%, wszystkie one zostaną wypchnięte jak najdalej z twojej mapy głębokości, tak jakby wszystkie były częścią nieugiętej konstrukcji stalowej, która porusza się jako jednostka, ustawiona na 50% tej struktury może zachowywać się bardziej jak grube arkusze gumy i 10% jak folia dopasowująca się do kształtu, ponieważ każdy wertyk ledwo wpływa na sąsiada (co masz teraz.
Oczywiście dzieje się trochę mieszania i łączenia wartości. Jak powiedział @Gajoo: „co jest złego w przenoszeniu całego kształtu?”
źródło