GLKMathProject: построение UIView на основе OpenGl Corrds

Я использовал GLKMathUnProject для реализации выбора лучей, чтобы я мог касаться объекта в трехмерном пространстве. Теперь я хотел бы (например) показать метку над этим объектом. Поэтому мне нужно преобразовать 3D-пространство в 2D-экранные шнуры (я знаю, что использование OpenGl и UIKit - плохая идея, и уже реализован текст в текстуру).

Я использовал следующий метод ниже, но я думаю, что что-то упускаю. Включаю iPad, Предмет передо мной, честно говоря не знаю что делать с z.:
{922.111, 763.055, 0.990884}

 GLKVector3 x = GLKMathProject(building.position, _baseModelViewMatrix, _projectionMatrix, viewport);

  NSLog(@"%@", NSStringFromGLKVector3(x));

  UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(x.x, x.y, 50, 20)];
  label.text = @"TEST";
  [self.view addSubview:label];

person Burf2000    schedule 05.05.2014    source источник
comment
В чем проблема? Возможно, вам придется разделить эти координаты на 2,0 для дисплеев Retina. Координата Z бесполезна для вашего случая. Кстати, смешивание OpenGL и UIKit — неплохая идея.   -  person Matic Oblak    schedule 05.05.2014
comment
О, хорошо, это сетчатка, и можно ли показывать метки над 3D, такие как имена и прочее (динамическое) текстовые сообщения, все кажется излишним   -  person Burf2000    schedule 05.05.2014
comment
Пожалуйста, напишите как решение, как вы это исправили   -  person Burf2000    schedule 05.05.2014


Ответы (1)


Полученный вектор результата зависит от системы координат области просмотра, а не от системы координат вашего вида. В общем случае X и Y нужно разделить на ширину и высоту области просмотра, а затем умножить на ширину и высоту области просмотра. В вашем случае это деление на 2 из-за дисплея сетчатки.

Что касается координаты Z, она вам не нужна для позиции, но вы можете использовать ее для порядка Z. Например, если у вас будет несколько текстовых меток, вы можете упорядочить их по значению Z, чтобы те, что сзади, оставались сзади, и если 2 из них находятся в одном и том же положении на экране, правильная будет впереди. Также вы можете использовать это значение, чтобы сделать некоторые дальние метки меньше.

Что касается смешивания UIKit с OpenGL, с этим не должно быть проблем, и это неплохая практика. Обратите внимание, что вы не можете смешивать буфер глубины: вы не сможете нарисовать какой-либо объект, нарисованный OpenGL, перед какой-либо меткой. Если в конце концов вы решите рисовать метки в OpenGL, я предлагаю создать изображение из UIView (или метки) и использовать его как текстуру, а не пытаться найти какие-то библиотеки для рисования текста. Таким образом, вы сможете использовать все уже готовые инструменты, такие как шрифты, цвета, обтекание...

person Matic Oblak    schedule 05.05.2014