Skybox OpenGL ES для iPhone и iPad - PullRequest
       1

Skybox OpenGL ES для iPhone и iPad

3 голосов
/ 06 ноября 2010

Мне нужно создать инструмент виртуального тура для iOS .Это археологическое приложение: пользователь может открыть его, когда он находится внутри исторического здания или когда он посещает археологические раскопки.Нет необходимости в субъективной точке зрения, похожей на дум: просто скайбокс.Приложение будет иметь список достопримечательностей (POI).Каждый POI будет иметь свой собственный скайбокс.

Я подумал, что мог бы использовать OpenGL-ES для создания своего рода текстурированных скайбоксов, которые можно было приводить в движение или вращать касаниями.Текстуры - это фотографии PNG высокого разрешения.

Это финансируемый проект, и у меня есть 4 месяца.

Куда мне обратиться, чтобы узнать, как его разработать?Должен ли я купить книгу?Который из?

У меня только умеренные навыки Objectve-C и Cocoa-touch, так как я создал только одно приложение для iPad.У меня нулевое знание OpenGL-ES .

Ответы [ 3 ]

10 голосов
/ 09 ноября 2010

Поскольку я достаточно хорошо знаю OpenGL ES, я попробовал демо-проект, выполняя многое из того, что вы описываете.Конкретное намерение состояло в том, чтобы сделать все самым простым способом, доступным в OpenGL ES, при условии, что производительность была достаточно хорошей.

Начиная с шаблона OpenGL, который поставляет Apple, я написал один новый класс с сильно прокомментированной реализацией.файл длиной 122 строки, который загружает изображения PNG в качестве текстур.Я изменил пример контроллера представления, чтобы нарисовать скайбокс как требуется и реагировать на прикосновения версией обычной инерциальной прокрутки iPhone, что означало написание менее 200 строк (также прокомментированных) кода.

Чтобы достичь этого, мне нужно было знать:

  • CoreGraphics означает для получения данных пикселей из PNG
  • , как настроить стек PROJECTION, чтобы получить перспективную проекцию с правильным соотношением сторон
  • как манипулировать стеком MODELVIEW, чтобы обеспечить двухосное вращение (шутер от первого лица или стиль Google StreetView) сцены в соответствии с переменными-членами и чтобы убедиться, что заданная мной геометрия куба не пересекает ближнююплоскость отсечения
  • как указать расположение вершин и координаты текстуры для OpenGL
  • как указать треугольники OpenGL должен построить между вершинами
  • как установить параметры текстуры OpenGL соответственно для предоставлениятолько один уровень детализации для текстуры
  • как отследить касание, чтобы управлять переменными-членами, диктующими вращение, включая небольшую механику, чтобы дать инерционное вращение

Конечно, инструкции нормального жизненного цикла контроллера представления соблюдаются.Текстуры загружаются в viewDidLoad и выпускаются, например, в viewDidUnload, чтобы гарантировать, что этот контроллер представления хорошо работает с потенциальными предупреждениями памяти.

Основные наблюдения заключаются в том, что, помимо знания механизмов сигнализации Objective-C, большая часть этогоэто C вещи.В первую очередь вы используете массивы C и ссылки для выполнения вызовов функций C, как для OpenGL, так и для CoreGraphics.Поэтому обязательным условием для написания этого кода является то, что вы должны быть счастливы в C, а не только в Objective-C.

Материал CoreGraphics немного утомителен, но все это просто чтение документов, чтобы выяснить, как каждый тип вещей относится кдальше - ничего из этого не смущает.Просто подумайте, что вам нужен поставщик данных для данных PNG, вы можете создать изображение из этого поставщика данных, а затем создать растровый контекст с памятью, которую вы выделили сами, нарисовать изображение в контексте и затем освободить всекроме памяти, которую вы выделили себе, чтобы остаться с результатом.Этот результат может быть непосредственно загружен в OpenGL.Это сравнительно короткий пример, но OpenGL не имеет понятия PNG, а CoreGraphics не имеет удобных методов вставки чего-либо в OpenGL.

Я предположил, что текстуры подходящего размера на диске.Для практических целей это означает, что они имеют степень двойки вдоль каждого края.Мои 512x512.

Управление текстурой в OpenGL достаточно простое;это просто чтение руководства, чтобы узнать об именах текстур, распределении имен, параметрах текстур и загрузке данных изображений.Более рутинные вещи, которые больше относятся к знанию правильных функций, чем к управлению интуитивным скачком.

Для предоставления геометрии в OpenGL я только что полностью выписал массивы.Я думаю, вам нужно немного пространственного разума, чтобы сделать это, но набросок трехмерного куба на бумаге и нумерация углов были бы большой помощью.Существует три соответствующих массива:

  • позиции вершин
  • координаты текстуры, которые идут с каждым местоположением вершины
  • список индексов, относящихся к позициям вершин, который определяетгеометрия

В моем коде я использовал 24 вершины, рассматривая каждую грань куба как логически дискретную вещь (так, шесть граней, каждая с четырьмя вершинами).Я определил геометрию, используя только треугольники, для простоты.Поставка этого материала в OpenGL на самом деле довольно раздражает, когда вы начинаете;Ошибка обычно означает, что ваша программа падает глубоко внутри драйвера OpenGL, не давая вам подсказку о том, что вы сделали неправильно.Вероятно, лучше всего создать немного за один раз.

С точки зрения UIView, способного к размещению контента OpenGL, я более или менее использовал ванильный материал, который Apple напрямую поставляет в шаблон OpenGL.Единственное изменение, которое я сделал, было явно отключить любую попытку использования OpenGL ES 2.x.1.x более чем достаточно для этой задачи, поэтому мы получаем простоту, во-первых, не предоставляя два альтернативных пути рендеринга, и, во-вторых, потому что путь ES 2.x будет намного сложнее.ES 2.x - это полностью программируемый конвейер с пиксельными и вершинными шейдерами, но на земле ES фиксированный конвейер полностью удален.Так что если вы хотите один, то вы должны предоставить свои собственные заменители для обычных матричных стеков, вы должны написать вершинный и фрагментный шейдеры, чтобы сделать «треугольник с текстурой» и т. Д.

Отслеживание касания не происходит 'Это особенно сложно, более или менее просто требуя от меня понимания, как работает усеченный вид и как касания доставляются в Cocoa Touch.Как только вы сделаете все остальное, этот бит будет довольно простым.

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

Итак, сколько времени вам понадобится, чтобы написать, зависит от вашей уверенности в C и CoreGraphics, а также от того, насколько вы счастливы, когда кодируете в темноте.Поскольку я знаю, что делаю, все это заняло два или три часа.

Я постараюсь найти место для загрузки проекта, чтобы вы могли на него взглянуть.Я думаю, что было бы полезно пролистать его и посмотреть, как он выглядит.Это, вероятно, даст вам хорошее представление о том, сможете ли вы реализовать что-то, удовлетворяющее всем вашим потребностям, в сроки, установленные для вашего проекта.

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

2 голосов
/ 06 ноября 2010

Будет довольно сложно, если вы изучаете OpenGL ES с нуля. Я бы использовал графический движок, чтобы выполнять большую часть тяжелой работы. В настоящее время я играю в Ogre3d, из того, что я видел до сих пор, я могу порекомендовать его: http://www.ogre3d.org/. Он имеет Skybox (и многое другое) из коробки, и должен быть довольно простым делом. *

1 голос
/ 07 ноября 2010

Я думаю, что вы можете сделать это, вот несколько ссылок, которые помогут вам начать:

http://sidvind.com/wiki/Skybox_tutorial

общие проблемы:

(я бы опубликовал прямые ссылкино stackoverflow не позволяет мне)

посмотреть на элементы stackoverflow № 2859722 и 2297564.

некоторые программы и советы, которые помогут сделать текстуры:

spacescape

здесь есть несколько отличных обучающих программ по opengl:

nehe.gamedev.net

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

...