2013-06-15 3 views
6

Я повернул представление на 50 градусов вокруг оси y, используя Core Animation. Я хочу, чтобы край обзора касался края экрана. Как я могу это сделать?Как определить, насколько удален 3D-поворот объекта с края экрана

Я знаю длину обзора и количество градусов, на которые повернулось изображение (50 градусов), поэтому, поначалу я подумал, что могу определить расстояние между видом и краем, используя тригонометрию. Тем не менее, перспектива камеры подвержена влиянию по объекту m34 объекта CATransform3D struct. Как я могу определить расстояние, которое мне нужно, чтобы переместить вид, чтобы выровнять его с краем экрана?

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

Значение по умолчанию для трансформированного объекта остается неизменным. Кадр - это наименьший нетрансформированный прямоугольник, который может содержать весь связанный вид, поэтому почему это еще не работает? – CodaFi

+0

Вам действительно нужно, чтобы представление транслировалось по оси z? –

+0

@CodaFi, я не думаю, что выравнивание рамки до края супервизора будет работать от Apple: если это свойство не является преобразованием идентичности, значение свойства frame не определено и поэтому должно игнорироваться. – marchinram

ответ

1

Если я вас правильно понял, вы хотите что-то вроде следующего:

Final view

Чтобы облегчить ваши расчеты, нужно играть с anchorPoint в CALayer. anchorPoint - это то, где применяются преобразования, и его эффекты особенно заметны при поворотах. Мы должны сделать так, чтобы CALayer вращался вокруг одной из своих точек, а не центра (по умолчанию).

Это мой 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; 

И что я получаю это изображение, которое вы видите выше.

Надеюсь, это поможет!

0

Вы хотите применить окончательную матрицу преобразования (в том числе изменения M34) в конечных точках края вашего зрения кто есть расстояние вы пытаетесь вычислить. Это даст вам окончательное местоположение вашей точки в проецируемом пространстве.

В iOS 5 добавлен GLKit, который включает в себя всю библиотеку функций для выполнения матричных и векторных вычислений. Например, посмотрите на GLKMatrix4MultiplyVector3. Эта функция принимает вектор из 3 частей и умножает его на матрицу 4x4 и возвращает результирующий трехкомпонентный вектор.

Возможно, вам понадобится GLKMatrix4MultiplyVector4, так как если я правильно помню, вы хотите, чтобы ваш вектор имел еще 1 компонент, чем число осей (так что для 3D-вектора вы хотите использовать 4-компонентный вектор.) Векторная математика - это не мой сильный костюм , поэтому я должен посмотреть этот материал, когда мне нужно его использовать.