Поскольку я достаточно хорошо знаю 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 не позволяют мне размещать здесь большие фрагменты кода, но, пожалуйста, не стесняйтесь спрашивать, если у вас есть какие-либо конкретные вопросы.