Июл 08

В большинстве случаев, выбрав элемент из списка, пользователь загружает подробные сведения по нему в отдельном представлении. “UITableView” отвечает только за отображение списка элементов — переходы от списка к детальному представлению элемента контролирует “UINavigationController“. Таким образом, табличное представление всегда взаимодействует с контроллером навигации, и наоборот. Вот как выглядит готовое приложение:

Создание проекта

Выполнив “File -> New Project“, в разделе “iPhone OS” выберите “Navigation-Based Application“, чтобы создать новый проект XCode. Присвоив ему имя, сохраните проект (свой я назвал “TableView“). Шаблон “Navigation-Based Application” уже содержит связанные контроллер навигации и табличное представление — ручной настройки не требуется. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (Оцените приложение)
Загрузка ... Загрузка ...
Нет комментариев »

Июл 05

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

Я начну с самого начала — с прямоугольных треугольников — и постепенно подойду к тому, как с помощью круга и треугольника осуществляется поворот в функции “gluLookAt()“. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (1 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Комментариев: 4 »

Июл 03

В Сидней практически пришла зима — и я умудрился подхватить грипп (простой, не свиной). А тут еще работа, день Матери и пр. и пр. Одним словом, ввиду недостатка времени двигаться будем быстро. Но прежде чем приступать к созданию “уникального” трехмерного мира, освоим концепции перемещения в 3D пространстве.

Нам предстоит освоить код обработки событий, который позволит ходить “по полу”. С помощью касаний мы будем поворачивать влево, вправо, перемещаться вперед и назад. Обойдемся без бега, поворотов головы и наведения резкости, хотя добавить их легко. Подобные ограничения объясняются как желанием упростить изложение, так и возможностью для не располагающих iPod Touch или iPhone добиваться аналогичных результатов в симуляторе.

Для начала загрузим основу проекта здесь.

Кода там не много — в основном объяснения, что и как происходит.

Мифическая камера

Большинство воспринимает 3D миры как пространство, на которое смотришь через камеру, но в OpenGL камеры как таковой нет. Для иллюзии движения по сцене относительно начальной точки (0, 0, 0) перемещаются объекты, а не камера, как в кино.

Процесс может показаться трудоемким, но это не так. В зависимости от приложения есть множество способов решения данной задачи и еще больше — оптимизации для действительно больших миров. На этом я вкратце остановлюсь чуть позже. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (Оцените приложение)
Загрузка ... Загрузка ...
Комментариев: 3 »

Июл 02

На днях имел интересный разговор с боссом. Несмотря на то, что профессионально с OpenGL мы оба работаем примерно одинаковое время, он гораздо осведомленнее меня как в этой сфере, так и в графике в целом. Увидев мои уроки, он пошутил: «Если бы я так оценивал OpenGL, никогда бы тебя на работу не взял!».

Причиной его шутки стали мои фразы типа: “OpenGL визуализирует этот как…” или “отправьте OpenGL массив вершин”. Я, как и многие другие читатели этих уроков, прекрасно знаю, что говорить об OpenGL как о чем-то целостном — все равно настаивать на существовании Санта-Клауса. Ни в коем случае не пытаясь ввести кого бы то ни было в заблуждение, я всего лишь упрощаю подачу материала, преподнося его так, как хотел бы, чтобы объясняли мне.

Кстати, мой босс пообещал подобрать хорошую литературу для новичков, поскольку он не считает книги устаревшим артефактом. Если они мне понравятся, обязательно дам вам знать.

Впервые я столкнулся с OpenGL на моей первой работе — в исследовательском отделе государственной организации. Нам утвердили бюджет на ужасно дорогое аппаратное обеспечение от SGI, и в преддверии его прибытия меня еще с одним сотрудником срочно направили на недельные интенсивные курсы изучения OpenGL.

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

1 звезда2 звезд3 звезд4 звезд5 звезд (2 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Комментариев: 6 »

Июн 29

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

Как-то раз я сидел на задней парте, размышляя о чем-то занимательном и не имея ни малейшего представления о том, что в тот день изучали. Меня это не интересовало, поскольку я знал, что могу освоить предмет, как только мне он понадобится. Но в тот день, посмотрев на доску, я был крайне удивлен, обнаружив на ней

[ a b c ] . [ d e f ]

Я так и сел. Я знал, что это математика матриц — читал об этом в литературе по графическим программам, но не совсем понял. Вдохновившись, я решил почтить урок своим вниманием и узнал массу интересного.

Вдохновение — великая вещь. Сколько ни пытался, у меня никак не получилось довести до ума урок по смешиванию (Часть 1). Поэтому я просто опубликовал его, решив вернуться к этой теме позже — когда посетит вдохновение.

Но дело в том, что изучение усложняющихся концепций OpenGL ES на примере куба и пирамиды меня вряд ли когда-нибудь вдохновит. Настало время (постепенно) увеличивать сложность сцен, с которыми мы экспериментируем — не давая иссякать вдохновению.

Наращивать сложность сцен мы будем, не спеша, давая возможность подтянуться всем желающим. Но делать это нужно, хотя бы для того, чтобы освоить управление сценами наряду с новыми концепциями OpenGL ES. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (3 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
1 Комментарий »

Июн 27

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

Я помню, как первый раз включил в код смешивание. Алгоритм писал не сам, но результат все равно потряс. Это было на SGL Indigo II с графической платой GR3-Elan (те, кому доводилось видеть SGI Indigo или прочие графические станции 90-х, знают, какого размера были на них графические платы!). Вычислительные мощности системы того времени составляли буквально доли от Мака, на котором я работаю сейчас, но тогда это было по-настоящему впечатляюще!

Момент был особенно волнующим, еще и потому, что в то время никто из нас не сталкивался со смешиванием в реальном времени на объектах с наложенными текстурами, перемещениями в сцене и эффектами освещения. Само собой, все это встречалось в LightWave и другом ПО с имитацией эффектов света, но о реальном времени речь не шла. Да… В то время программированием занимались, чтобы выдать нечто новое и необычное, а не чтобы через пару дней выпустить игру и подзаработать…

Что ж, будем переходить к изучению смешивания. Смешивание (blending) — это процесс комбинирования двух изображений, при котором находящееся ближе к зрителю кажется полупрозрачным. Представьте, что вы смотрите на предметы через кусок красного плексигласа в руке. Мир перед глазами становится красным, поскольку цвет плексигласа меняет окраску других объектов.

Чтобы претворить блендинг в реальность, нам понадобится частично прозрачный объект на переднем плане (в RGBA определении цвета значение альфа должно быть менее 1.0) плюс объект сзади, с которым он и будет “смешиваться”. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (Оцените приложение)
Загрузка ... Загрузка ...
Комментариев: 3 »

Июн 25

В этом уроке мы по-быстрому освоим оставшиеся последними примитивы — точки и линии. Ничего сложного, но мне уже пришлось ответить на несколько вопросов по данным объектам, поэтому я решил остановиться на них подробнее.

Итак, наша цель — оперативное знакомство с точками и линиями, которое позволит нам двигаться дальше в нужном направлении.

Главное, не взять слишком высокий темп. При вызове “glVertexPointer()” я буду работать с таинственным параметром “stride” (шаг индекса) Рассмотрим эту тему сейчас, поскольку один из следующих уроков будет посвящен объектам Blender в программировании на iPhone, позволяющим без особого труда обзаводится на экране объектами в неприлично больших количествах

Шаг индекса — интересный параметр, которым многие просто пренебрегают (как, собственно, до этого момента и я) или описывают как “слишком сложную тему, к которой вы еще не готовы” (возможно, потому, что сами ее еще не проработали….). Главное — разобраться в основах — и все станет понятно. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (1 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Комментариев: 7 »

Июн 23

simulatorshotСначала думал перейти к теме освещения, но решил, что мы еще не рассмотрели множество базовых вопросов, связанных с объектами и трансформациями. Сейчас в первую очередь я имею в виду трансформацию (анимацию) двух разных объектов разными способами в одном пространстве.

Помните, как мы применяли к сцене “glTranslatef()” и “glRotatef()“? Чтобы менять условия, я пользовался вспомогательной функцией “glLoadIdentity()“. Но для вычислительных ресурсов и визуализации сцен она “дорого обходится”, поэтому сейчас мы познакомимся с более эффективным методом.

Для этой цели введем новый объект: создадим пирамиду, переместим ее с помощью “glTranslatef()” и повернем независимо от куба с помощью “glRotatef()” — не обращаясь к “glLoadIdentity()” для сброса вершин.

Добавляем в пространство пирамиду

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

В прошлом уроке я намеренно не упоминал, что созданный нами куб является сложной фигурой, т.е. состоит из нескольких примитивов. Мне кажется, что данный термин создает ощущение чего-то проблемного. Теоретически, квадрат — тоже сложный объект, но поскольку при рисовании мы обошлись одним вызовом функции OpenGL, будем считать его простым.

Итак, один сложный объект мы уже успешно создали! Приступаем ко второму.

Пирамиды не особенно проблематичны: основание-квадрат с присоединенными четырьмя треугольниками, соединяющимися над его центральной точкой. Любой интересующий объект создать гораздо проще, если мысленно разбить на простые составляющие. Меняется только количество задействуемых при его рисовании примитивов. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (1 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Нет комментариев »

Июн 22

colouredcubeДо сих пор мы с успехом осваивали плоские двухмерные объекты. Пришло время переходить к объемным — трехмерным. В принципе, они не намного сложнее, зато у них гораздо больше вершин (если создавать их из массива вершин) и трансформаций (если пытаться квадрат превратить в куб).

Наверное, сначала стоило рассмотреть точки и линии, но раз уж мы уже наложили текстуру на квадрат и раскрасили треугольники, будем скорее переходить к более интересным формам!

Вернемся мы еще и к трансформациям, и к вращению, рассмотрев их в деталях. Даже материалы для новичков мы еще не успели освоить в полном объеме… Так что впереди и нас еще множество уроков!!

Для начала урезаем метод “drawView”

Попрощайтесь с утомительным кодированием: убираем все лишнее и возвращаем метод “drawView” в первоначальное состояние. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (1 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Комментариев: 2 »

Июн 21

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

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

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

Как уже упоминалось, основная часть кода относится к загрузке текстур в программу и непосредственно в OpenGL для последующего использования. Ничего сложного, но поработать с iPhone SDK придется немало.

Готовимся к текстурам

Перед тем, как использовать текстуру, предварительно ее нужно загрузить в приложение, отформатировать для OpenGL и сообщить, где ее искать. Остальное будет ничуть не сложнее раскрашивания квадрата в прошлом уроке. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (8 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Комментариев: 10 »