#objective-c #opengl-es #coordinates
#objective-c #opengl-es #координаты
Вопрос:
Есть ли способ получить экранные координаты объектов в 3D мире?
Ответ №1:
Реализовать gluProject()
.
РЕДАКТИРОВАТЬ: в Mesa / SGI есть некоторый код.
ОТРЕДАКТИРУЙТЕ 2: Или возьмите копию GLU для iOS.
Комментарии:
1. @marcg11: Отредактировано. Это в значительной степени самый простой способ.
2. Привет, ты знаешь, как добавить библиотеку в свой проект? В readme сказано: Для компиляции для симулятора: создайте ARCH = ПЛАТФОРМА i386= iPhoneSimulator Для компиляции для устройства: создайте ARCH = ПЛАТФОРМА armv6 = iPhoneOS
Ответ №2:
Просто реализуйте преобразования конвейера OpenGL: modelview, projection, perspective divide, viewport. Вы получаете запрос к текущим матрицам с помощью glGetDoublev и viewort с помощью glGetIntegerv.
Затем вам нужно вычислить матрицу проекции, умноженную на матрицу modelview = MVP.
теперь для каждой вершины v вычислите MVP * v.
затем вычислите v / = v.w;
Итак, у вас есть координаты в диапазоне [-1,1] x[-1,1], последнее, что нужно сделать, это масштабировать и преобразовать это в [x, x w] x [y, y h] (которые являются значениями окна просмотра).
Вы также можете просмотреть информационные страницы справочника OpenGL для glFrustum, glViewport, чтобы увидеть, как выполняются все эти преобразования.
Комментарии:
1. Вау, я не так уж много знаю OpenGLES. То есть функция gluproject не реализована? Кстати, спасибо.
2. Я не знаю, у меня есть только опыт работы с GL на рабочем столе, где реализован gluProject. Если это есть, вы можете использовать это (на самом деле это делает именно то, что я написал). Но, возможно, ссылка genpfault на gluProject предоставит вам лучшее объяснение его работы, чем мой ответ. С этими объяснениями это должно быть довольно легко реализовать самостоятельно.
3. Я посмотрю на это. Я не знаю, насколько opengl для настольных компьютеров отличается от OpenGLES для iphone.
4. В этом отношении не должно быть различий. Я только имел в виду, что я не знаю, есть ли GLU в GL ES
5. Я думаю, что здесь нет проблем: (