2011-05-24 10 views
5

Wyciągam włosy z głowy, próbując dowiedzieć się, co wydaje się być bardzo łatwym problemem. Wiem, że wiele z tych rzeczy zostało powiedziane na temat stycznych, więc przepraszam, jeśli to kroczy po dobrze zakrytym podłożu, ale nie mogę znaleźć niczego konkretnego dla mojego rozwiązania (proszę mi wierzyć, już wyglądałem).iOS - Przeciąganie obiektów po zakrzywionych ścieżkach

Zasadniczo chcę przeciągnąć obiekt/duszkiem wzdłuż wstępnie zdefiniowanej, zakrzywionej ścieżki (nie tylko przenieść, ale DRAG IT). Pomyśl o tym, jak iPhone "przesuwać do odblokowania", ale zamiast przeciągać suwak od lewej do prawej, uczyń ścieżkę łukiem lub linią falistą.

Moje myślenie było podstawowe:

  • określić ścieżkę bezier, ustawić obiekt w punkcie startowym.
  • jeśli obiekt zostanie dotknięty, sprawdź wykrywanie trafienia na ścieżce beziera w dotknięciach Wykryto (lub podobnej funkcji). jeśli dotknięcia pozostaną na ścieżce, przesuwaj duszek wzdłuż ścieżki, dopóki ścieżka się nie skończy (w takim przypadku zadanie zostanie zakończone) lub palec użytkownika zejdzie ze ścieżki (w takim przypadku obiekt powinien wrócić do początku).

Nic z tego nie jest trywialne (przynajmniej tak to się wydaje). Na przykład:

  • Doing hit wykrywanie na ścieżce Beziera jest królewski ból ponieważ rzeczywiście trzeba to zrobić na The Strokes części, a nie części wypełnienia. I nawet wtedy nie mogę znaleźć sposobu na zrobienie tego na ścieżce o dowolnej szerokości - tylko na 1-punktowej ścieżce Beziera.
  • Przesuwanie obiektu częściowo wzdłuż ścieżki nie wydaje się możliwe: wszystkie metody animacji przesuwają ikonkę wzdłuż CAŁKOWITEJ ścieżki. Ponadto, wykonanie tej czynności wymaga znalezienia punktu na ścieżce najbliższego dotykowi użytkownika, który, jeśli kiedykolwiek go obejrzałeś, wymaga zdumiewająco skomplikowanej matematyki.
  • Myślałem o użyciu ciał sztywnych do zajmowania całej przestrzeni Z WYJĄTKIEM ścieżki, więc obiekt może poruszać się tylko po ścieżce. Wymaga to jednak określenia zakrzywionych ciał sztywnych, z których niektóre muszą być wklęsłe. Ślepy zaułek.

Czy to zbyt trudne? To nie wydaje się takie skomplikowane. Nie potrzebuję całego rozwiązania, tylko nowego sposobu na przemyślenie tego i nakręcenie we właściwym kierunku. Każda pomoc będzie naprawdę doceniona.

+0

Wiem, że zostało to zadane dawno temu, ale teraz mam do czynienia z czymś bardzo podobnym i zastanawiałem się, czy to wymyśliłeś i może być w stanie skierować mnie na właściwą ścieżkę. – gikygik

Odpowiedz

1

Co z tym?

  • Rozważmy oś X Twojej ścieżki Beziera .
  • Za każdym razem, gdy użytkownik kliknie lub wejdzie w interakcję z ekranem, po prostu spójrz na X część dotyku.
  • Odwzoruj X Współrzędna ze swoją ścieżką i przenieś obiekt w odpowiednią pozycję.
+0

Czy to rozwiązanie działa, jeśli krzywa przecina ten sam punkt na osi X więcej niż raz? Na przykład, jeśli krzywa jest po prostu literą "S". Ten sam punkt X może wystąpić wiele razy dla różnych punktów Y na krzywej ... – johnnysports

+0

Nie, nie byłoby. Możesz użyć osi Y, aby zdecydować, który punkt krzywej należy dopasować do – arclight

0

Tak, robisz to zbyt mocno.

Take uproszczenia sugerowane powyżej (lub wzdłuż okręgu, linii itp), czy to działa na, lub jeśli naprawdę chcesz to zrobić przed krzywej Beziera, należy rozważyć następujące:

  1. spojrzeć na definicja krzywej biernej
  2. Szukamy zdefiniować nową pozycję obiektu P 'z aktualnej pozycji P i zmianę pozycji dotyku D.
  3. Jeśli zmienisz pierwotne P (x, y) pod względem t (krzywych béziera są parametryczne), to problem staje się ustaleniem, o ile przesunięcie t ma być dodane w oparciu o D.
  4. Coś związanego z różnicą beziera fn na P może być dobrym sposobem na zrobienie tego. Tj. Ile t zostałoby dodane, gdyby krzywa była po prostu linią prostą pochodzącą z punktu P wzdłuż krzywej.

EDIT: Przejście między segmentami: Jeśli każdy segment ma tw [0,1), a następnie można wykryć t> = 1 i przejść do następnego odcinka, ustawienie P do końca poprzedniego segment i ponownie ocenić ruch w odniesieniu do tego punktu. Być może zaistnieje potrzeba włączenia pewnych heurystyk, jeśli masz dużo małych punktów, itp.

+0

Andrew, dzięki za odpowiedź. Proszę, nie przejmuj się, bo naprawdę próbuję to zrozumieć, ale wciąż mi się wymyka. Myślę, że twoje i arclightowe rozwiązania mogą nie działać dla bardziej skomplikowanych ścieżek. Wierzę (popraw mnie, jeśli się mylę), że twoje rozwiązanie zadziała, jeśli moja krzywa jest pojedynczą krzywą Beziera. Jeśli jednak skonstruuję ścieżkę składającą się z wielu segmentów, prostych, niektórych łuków quadowych, niektórych łuków (na które pozwala SDK), muszę obliczyć, na którym odcinku się znajduję, a następnie obliczyć nową pozycję. Czy widzisz, co mówię? – johnnysports

+0

Zobacz powyżej, aby dowiedzieć się, jak sobie z tym poradzić. –

+0

Wiem, że to wszystko zostało zadane dawno temu, ale próbuję teraz zrobić coś podobnego i zastanawiałem się, czy mógłbyś odpowiedzieć na to pytanie. Chcę przeciągnąć wzdłuż elipsy, które narysowałem za pomocą ścieżki Beizerpath. Czy istnieje sposób na zdobycie wszystkich punktów w elipsie, więc mogę zrobić to, co poleciłeś powyżej? – gikygik

Powiązane problemy