2013-06-15 16 views
6

Obróciłem widok o 50 stopni wokół osi Y za pomocą animacji rdzenia. Chcę, aby krawędź widoku dotykała krawędzi ekranu. Jak mogę to zrobić?Jak określić odległość obiektu obróconego w 3D od krawędzi ekranu?

Znam długość widoku i ilość stopni, o które widok został obrócony (50 stopni), więc na początku pomyślałem, że mogę określić odległość między widokiem a krawędzią za pomocą trygonometrii. Jednak perspektywa kamery ma wpływ na przez właściwość m34 struktury . Jak mogę określić odległość, jakiej potrzebuję, aby przesunąć widok, aby dopasować się do krawędzi ekranu?

CATransform3D rotation = CATransform3DIdentity; 
rotation.m34 = -1.0/500.0; 
rotation = CATransform3DRotate(rotation, 50.0 * M_PI/180, 0.0, 1.0, 0.0); 
view.layer.transform = rotation; 
view.layer.zPosition = 200; 

enter image description here

+0

Domyślna wartość ramki przekształconego obiektu pozostaje taka sama. Ramka jest najmniejszym nieprzetworzonym prostokątem, który może zawierać cały powiązany widok, więc dlaczego to jeszcze nie działa? – CodaFi

+0

Czy naprawdę potrzebujesz widoku do przetłumaczenia wzdłuż z-axsis? –

+0

@CodaFi, Nie sądzę, że będzie działała ramka do krawędzi superview, od Apple: jeśli ta właściwość nie jest przekształceniem tożsamości, wartość właściwości ramki jest niezdefiniowana i dlatego powinna zostać zignorowana. – marchinram

Odpowiedz

1

Jeśli ja zrozumiałem, chcesz coś jak następuje:

Final view

Aby złagodzić swoje obliczenia musisz grać z anchorPoint z CALayer. anchorPoint to miejsce, w którym stosowane są transformacje, a jego efekty są szczególnie widoczne w obrotach. To, co mamy zamiar zrobić, to powiedzieć, żeby CALayer obrócił się wokół jednego z jego punktów, a nie centrum (co jest domyślne).

To jest mój loadView:

UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; 
view.backgroundColor = [UIColor whiteColor]; 

CGRect frame = CGRectMake(view.frame.size.width - 100.f, 
          view.frame.size.height/2.f - 50.f, 
          100.f, 100.f); 
UIView *red = [[UIView alloc] initWithFrame:frame]; 
red.backgroundColor = [UIColor redColor]; 
[view addSubview:red]; 

CATransform3D rotation = CATransform3DIdentity; 
rotation.m34 = -1.0/500.0; 
// Since the anchorPoint is displaced from the center, the position will move with 
// it, so we have to counteract it by translating the layer half its width. 
rotation = CATransform3DTranslate(rotation, 50.f, 0, 0); 
rotation = CATransform3DRotate(rotation, 50.0 * M_PI/180, 0.0, 1.0, 0.0); 
// We tell the anchorPoint to be on the right side of the layer (the anchor point 
// position is specified between 0.0-1.0 for both axis). 
red.layer.anchorPoint = CGPointMake(1.f, 0.5f); 
red.layer.transform = rotation; 
red.layer.zPosition = 200; 

I co mogę uzyskać to obraz widać powyżej.

Mam nadzieję, że pomoże!

0

Chcesz zastosować ostateczną macierz transformacji (w tym zmiany M34) do punktów końcowych krawędzi widoku którzy dystansu starasz się obliczyć. To da ci ostateczną lokalizację twojego punktu w rzutowanej przestrzeni.

iOS 5 dodano GLKit, który zawiera całą bibliotekę funkcji do wykonywania obliczeń macierzowych i wektorowych. Spójrz na przykład na GLKMatrix4MultiplyVector3. Ta funkcja pobiera 3-częściowy wektor i mnoży go przez macierz 4x4 i zwraca uzyskany wektor 3-składnikowy.

Być może potrzebujesz GLKMatrix4MultiplyVector4, ponieważ jeśli dobrze pamiętam, chcesz, aby Twój wektor miał 1 komponent więcej niż liczba osi (więc dla wektora 3D potrzebujesz 4-składnikowego wektora.) Matematyka wektorowa nie jest moją mocną stroną , więc muszę wyglądać tak, kiedy muszę go użyć.