2013-04-23 2 views
1

Мне известно, что верхний левый угол экрана (при условии, что телефон удерживается в левом нижнем углу) равен (0,0). Однако, если бы я хотел, чтобы мой (0,0) пункт был нижним левым углом вместо верхнего левого угла, как бы я это сделал?Вручную поверните систему координат для пейзажного режима слева

Я пытаюсь нарисовать объекты с использованием OpenGL в указанном месте. Я сейчас касаюсь экрана, но значение y рисуется на неправильной стороне экрана. Вот пример изображения, если это помогает. Обратите внимание, что пятно на белом фоне - это то, где я прикасаюсь к экрану, а фиолетовый материал - это система частиц, которую я рисую с помощью OpenGL.

https://www.dropbox.com/s/n2lhzfdbp4audi2/iOS%20Simulator%20Screen%20shot%20Apr%2023%2C%202013%206.25.49%20PM.png

https://www.dropbox.com/s/foueopvlgfu03vs/iOS%20Simulator%20Screen%20shot%20Apr%2023%2C%202013%206.25.53%20PM.png

Я установил мой поддерживается интерфейс, как это:

- (NSUInteger)application:(UIApplication*)application supportedInterfaceOrientationsForWindow:(UIWindow*)window 
{ 
    return UIInterfaceOrientationMaskAllButUpsideDown; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscapeLeft; 
} 

В моем drawFrame метод:

glViewport(0, 0, 480, 320); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

glOrthof(0.0f, 480, 0.0f, 320, -100.0f, 100.0f); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

//render the particles being drawn, etc 

В моем touchesBegan метод:

UITouch *touch = [[event allTouches] anyObject]; 
CGPoint location = [touch locationInView:touch.view]; 

if (pe.active != YES) 
{ 
    pe.active = YES; 

    NSLog(@"x: %f y: %f", location.x, location.y); 

    pe.sourcePosition = Vector2fMake(location.x, location.y); 
} 

Затем я попытался вручную повернуть систему координат под углом 90 градусов, делая это в моем viewWillAppear методе:

self.view.transform = CGAffineTransformIdentity; 
self.view.transform = CGAffineTransformMakeRotation((M_PI * (-90)/180.0)); 
self.view.bounds = CGRectMake(0.0, 0.0, 480, 320); 

Указание CGAffineTransformMakeRotation вызова с -90 градусов, как показано выше, следует изменить систему координат, но не делает.

Любая помощь очень ценится.

+0

Я не вижу OpenGL. Измените систему координат при рисовании. –

+0

Ive отредактировал мой вопрос и добавил фотографии, чтобы лучше объяснить мою проблему, спасибо. – coderz

ответ

-1

В общем, вы должны избегать установки рамки просмотра VC, ограничений и преобразования. Они автоматически устанавливаются UIKit для обработки таких вещей, как вращение и изменение размера (например, для строки состояния вызова).

Есть два простых исправления:

  • преобразование точки касания (location.x, height-location.y)
  • использовать верхний левый источник в матрице проекции (glOrthof(0, width, height, 0, ...)). Возможно, вам придется беспокоиться о ручности системы координат.

В настоящее время я предпочитаю второй вариант: все гораздо менее беспорядочно, когда есть как можно меньше систем координат.

Другие незначительные проблемы

  • Вы должны использовать фактическую ширину и высоту вместо жесткого кодирования 320 и 480. Не забудьте проверить на «Retina» и «Retina 4 дюйма», а также.
  • self.view.transform = CGAffineTransformIdentity; Бессмысленно, так как вы немедленно сбиваете его с помощью записи. на следующей строке.

Если вы действительно нужно, чтобы установить преобразование зрения, сделать его подтаблицы зрения в ВК. Также обратите внимание, что некоторые представления не работают должным образом, если вы установите их преобразование (например, UITableView на некоторых версиях iOS использует его фрейм, чтобы определить, насколько должны быть широкие ячейки, когда он должен использовать свои границы). Это не редкость, нужен вид структуры, как это:

  • Наружный контейнер (чей кадр/преобразование задается, например, UIKit)
    • Внутренний контейнер (это где вы установили преобразование)
      • фактическое представление, о котором вы заботитесь (например, UITableView), чье преобразование вы не задаете.

Само собой разумеется, я стараюсь, чтобы избежать этого, когда это возможно.

+0

Идеальное решение! Я поменял glorthof, как вы предлагали, и он отлично работает, не могу поверить, что я пропустил это. Да, 320 и 480 жестко закодированные были только потому, что я спешил, но я собираюсь определенно изменить его. Огромное спасибо – coderz

 Смежные вопросы

  • Нет связанных вопросов^_^