2009-12-11 18 views
6

Pracuję nad aplikacją na iPhone'a z prostą animacją.Jak tłumaczyć parabolicznie?

Mam widok Chcę przetłumaczyć, ale nie wzdłuż linii. Chcę to przetłumaczyć parabolicznie. Wyobraź sobie, że animuję samochód poruszający się po zakrzywionej drodze.

wiem, że mogę ustawić odpowiednio przekształcić do instancji CGAffineTransform

Problem polega na tym, nie mam pojęcia, jak do tworzenia transformacji. Wiem, jak skalować, tłumaczyć itp., Ale jak mam tłumaczyć parabolicznie? Czy to możliwe?

+0

Dlaczego po prostu nie determi ne matematycznie nową współrzędną lewego górnego punktu pola i odpowiednio przetłumaczyć współrzędne? –

+1

Po hiszpańsku: Parabolicamente;) – Escualo

+0

@James - o ile mogę powiedzieć, że po prostu przetłumaczyć wzdłuż linii, ale nie chcę, aby była na przekątnej w ten sposób. Chcę, żeby było na zakręcie. – bpapa

Odpowiedz

25

Aby animować wzdłuż gładkiej krzywej, będziesz chciał użyć CAKeyframeAnimation. W this answer udostępniam kod dla połączonej animacji, która przesuwa widok obrazu wzdłuż krzywej, zmieniając jego rozmiar i gasnąc. Istotna część tego kodu jest następujący:

// Set up path movement 
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; 
pathAnimation.calculationMode = kCAAnimationPaced; 
pathAnimation.fillMode = kCAFillModeForwards; 
pathAnimation.removedOnCompletion = NO; 

CGPoint endPoint = CGPointMake(480.0f - 30.0f, 40.0f); 
CGMutablePathRef curvedPath = CGPathCreateMutable(); 
CGPathMoveToPoint(curvedPath, NULL, viewOrigin.x, viewOrigin.y); 
CGPathAddCurveToPoint(curvedPath, NULL, endPoint.x, viewOrigin.y, endPoint.x, viewOrigin.y, endPoint.x, endPoint.y); 
pathAnimation.path = curvedPath; 
CGPathRelease(curvedPath); 

To tworzy krzywą z dwoma punktami kontrolnymi, po jednej na pochodzenia widzenia, a druga w prawym górnym rogu wyświetlacza (w trybie poziomym). Aby uzyskać więcej informacji na temat tworzenia ścieżek, zobacz Quartz 2D Programming Guide lub Animation Types and Timing Programming Guide.

Aby skorzystać z tej animacji, musisz dodać go do warstwy Państwa zdanie za pomocą czegoś podobnego, co następuje:

[imageViewForAnimation.layer addAnimation:pathAnimation forKey:@"curveAnimation"]; 
+0

Po prostu przekręciłem się po przekątnej i wyglądało to wystarczająco dobrze, więc pytanie stało się już przestarzałe. Nie bardzo zależy mi na wypróbowaniu metody Brada, ale na pewno wydaje się słuszne. : P Znakowanie jako odpowiedź. – bpapa

+3

Po prostu próbowałem i działa dobrze. ;) – Euan

0

Wygląda na to, że musisz okresowo ustawić właściwość transform na CGAffineTransformTranslate utworzoną przy użyciu parametrów x, y wybranych wzdłuż paraboli (wykonaj to, co Russell zaproponował, aby uzyskać x z y lub odwrotnie).

Jeśli chcesz, aby Twój samochód się obracał podczas zakrzywień wzdłuż paraboli (będzie wyglądał bardziej realistycznie), będziesz potrzebować CGAffineTransormRotate. Określ kąt w oparciu o nachylenie paraboli w miejscu, w którym aktualnie rysujesz. Będziesz potrzebował funkcji atan() do obliczenia kąta nachylenia. Brzmi jak ból, mam nadzieję, że jest łatwiejszy sposób.

Naprawdę nie wiem, o czym mówię, po prostu przeczytałem ten wpis na blogu: Demystifying CGAffineTransform.

+0

OK, brzmi to jak ogromny ból w dupie. Myślę, że zamiast tego spróbuję połączyć rotację z tłumaczeniem, zainspirowaną twoją odpowiedzią tutaj. Cholera, szkoda, że ​​po prostu nie zwróciłem na to uwagi 10 lat temu w tej liniowej klasie Algebry ... – bpapa

3

Estetycznym sposobem animacji wzdłuż krzywych jest użycie splines. Są matematycznie proste i wydajne obliczeniowo. Najmniejszy porządek, który rozwiązałby łuk paraboliczny, jest kwadratowym splajnem.

0

Myślę, że sugestia TokenMacGuy do używania splajnów jest dobra. Ponownie, nie wiem, o czym mówię, ale może to da ci kilka pomysłów.

Czy to musi być dokładnie parabola, czy będzie działać na zasadzie aproksymacji? To, co chcesz zrobić, brzmi bardzo podobnie do rendering text along a curve (patrz: screenshot). Ta seria postów wydaje się być całkiem niezłym poradnikiem - wyjaśnia obliczenia kąta i inne rzeczy. Każda "postać" odpowiada pozycji twojego samochodu. Parametryzacja długości łuku zapewnia stałą prędkość.

Jeśli chodzi o to, jak to zrobić na iPhonie ... nie mam pojęcia.

1

obejmuje obrót obrazu wzdłuż ścieżki, wystarczy dodać następujące

pathAnimation.rotationMode = @"auto"; 

można również dodać funkcję synchronizacji do tworzenia easeIn/oddalanie

pathAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];