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

Подготовка исходных данных
Как видим, все страны разделены на две категории: “Countries to visit” (Страны, которые нужно посетить) и “Countries visited” (Посещенные страны).
Для сгруппированной информации источник данных создается особым способом — упрощающим вывод данных. Продолжить чтение »
В этом уроке мы познакомимся с навигацией по детализированному представлению с параллельной передачей данных. Для следующей статьи серии “UITableView” воспользуемся исходным кодом из первого урока.
Создаем детализированное представление
Откройте редактор интерфейсов Interface Builder и, выполнив File -> New -> View (выберите Cocoa Touch), сохраните объект в папку приложения под именем “DetailView“. Щелчком на кнопке “Add” подтвердите добавление представления в текущий проект. Возможно, нужно будет перетащить представление (в XCode) в папку “Resources“. Обзаведясь представлением, создадим класс контроллера представления для управления им на экране. В XCode выберите “Classes” и выполните File -> New File. В разделе “iPhone OS” укажите подкласс “UIViewController“, присвоив ему имя “DetailViewController” (расширение не менять). Теперь привяжем представление к только что созданному контроллеру. В редакторе IB выделите объект “File’s Owner” и откройте окно инспектора “Identity Inspector“. Для класса “Identity” выберите тип “DetailViewController“, после чего откройте инспектор связей “Connections Inspector” и создайте связь между свойствами представления и объектом представления в nib-файле. Продолжить чтение »
В большинстве случаев, выбрав элемент из списка, пользователь загружает подробные сведения по нему в отдельном представлении. “UITableView” отвечает только за отображение списка элементов — переходы от списка к детальному представлению элемента контролирует “UINavigationController“. Таким образом, табличное представление всегда взаимодействует с контроллером навигации, и наоборот. Вот как выглядит готовое приложение:

Создание проекта
Выполнив “File -> New Project“, в разделе “iPhone OS” выберите “Navigation-Based Application“, чтобы создать новый проект XCode. Присвоив ему имя, сохраните проект (свой я назвал “TableView“). Шаблон “Navigation-Based Application” уже содержит связанные контроллер навигации и табличное представление — ручной настройки не требуется. Продолжить чтение »
В этот раз небольшое дополнение к прошлому уроку. Вернуться к основам математики меня заставили электронные письма с вопросами о том, что я имел в виду под рисованием круга и как это относится к поворотам и вращению в трехмерном пространстве.
Я начну с самого начала — с прямоугольных треугольников — и постепенно подойду к тому, как с помощью круга и треугольника осуществляется поворот в функции “gluLookAt()“. Продолжить чтение »
В Сидней практически пришла зима — и я умудрился подхватить грипп (простой, не свиной). А тут еще работа, день Матери и пр. и пр. Одним словом, ввиду недостатка времени двигаться будем быстро. Но прежде чем приступать к созданию “уникального” трехмерного мира, освоим концепции перемещения в 3D пространстве.
Нам предстоит освоить код обработки событий, который позволит ходить “по полу”. С помощью касаний мы будем поворачивать влево, вправо, перемещаться вперед и назад. Обойдемся без бега, поворотов головы и наведения резкости, хотя добавить их легко. Подобные ограничения объясняются как желанием упростить изложение, так и возможностью для не располагающих iPod Touch или iPhone добиваться аналогичных результатов в симуляторе.
Для начала загрузим основу проекта здесь.
Кода там не много — в основном объяснения, что и как происходит.
Мифическая камера
Большинство воспринимает 3D миры как пространство, на которое смотришь через камеру, но в OpenGL камеры как таковой нет. Для иллюзии движения по сцене относительно начальной точки (0, 0, 0) перемещаются объекты, а не камера, как в кино.
Процесс может показаться трудоемким, но это не так. В зависимости от приложения есть множество способов решения данной задачи и еще больше — оптимизации для действительно больших миров. На этом я вкратце остановлюсь чуть позже. Продолжить чтение »
На днях имел интересный разговор с боссом. Несмотря на то, что профессионально с OpenGL мы оба работаем примерно одинаковое время, он гораздо осведомленнее меня как в этой сфере, так и в графике в целом. Увидев мои уроки, он пошутил: «Если бы я так оценивал OpenGL, никогда бы тебя на работу не взял!».
Причиной его шутки стали мои фразы типа: “OpenGL визуализирует этот как…” или “отправьте OpenGL массив вершин”. Я, как и многие другие читатели этих уроков, прекрасно знаю, что говорить об OpenGL как о чем-то целостном — все равно настаивать на существовании Санта-Клауса. Ни в коем случае не пытаясь ввести кого бы то ни было в заблуждение, я всего лишь упрощаю подачу материала, преподнося его так, как хотел бы, чтобы объясняли мне.
Кстати, мой босс пообещал подобрать хорошую литературу для новичков, поскольку он не считает книги устаревшим артефактом. Если они мне понравятся, обязательно дам вам знать.
Впервые я столкнулся с OpenGL на моей первой работе — в исследовательском отделе государственной организации. Нам утвердили бюджет на ужасно дорогое аппаратное обеспечение от SGI, и в преддверии его прибытия меня еще с одним сотрудником срочно направили на недельные интенсивные курсы изучения OpenGL.
Первые три с половиной дня из этой недели мы не увидели ни единой строки кода. Часами обсуждались спецификации, состояния и прочая базовая информация, которая в общем и целом оказалась за исключением редких моментов невероятно скучной. Часто я просто кивал, делая вид, что все понимаю, но реально ситуация начала проясняться лишь после появления кода. Продолжить чтение »
Когда обучение в школе уже подходило к концу, в расписание закрался предмет по высшей математике, сравниться с которым по занимательности могло разве что наблюдение за сохнущей краской. Я со спокойной душой пропускал уроки, поскольку изучение столь продвинутых концепций с классом меня не вдохновляло.
Как-то раз я сидел на задней парте, размышляя о чем-то занимательном и не имея ни малейшего представления о том, что в тот день изучали. Меня это не интересовало, поскольку я знал, что могу освоить предмет, как только мне он понадобится. Но в тот день, посмотрев на доску, я был крайне удивлен, обнаружив на ней
[ a b c ] . [ d e f ]
Я так и сел. Я знал, что это математика матриц — читал об этом в литературе по графическим программам, но не совсем понял. Вдохновившись, я решил почтить урок своим вниманием и узнал массу интересного.
Вдохновение — великая вещь. Сколько ни пытался, у меня никак не получилось довести до ума урок по смешиванию (Часть 1). Поэтому я просто опубликовал его, решив вернуться к этой теме позже — когда посетит вдохновение.
Но дело в том, что изучение усложняющихся концепций OpenGL ES на примере куба и пирамиды меня вряд ли когда-нибудь вдохновит. Настало время (постепенно) увеличивать сложность сцен, с которыми мы экспериментируем — не давая иссякать вдохновению.
Наращивать сложность сцен мы будем, не спеша, давая возможность подтянуться всем желающим. Но делать это нужно, хотя бы для того, чтобы освоить управление сценами наряду с новыми концепциями OpenGL ES. Продолжить чтение »
Данная статья открывает цикл из двух (а может быть и трех) материалов по смешиванию — блендингу — в OpenGL. Сам эффект достаточно прост, но с ним связано немало тонкостей.
Я помню, как первый раз включил в код смешивание. Алгоритм писал не сам, но результат все равно потряс. Это было на SGL Indigo II с графической платой GR3-Elan (те, кому доводилось видеть SGI Indigo или прочие графические станции 90-х, знают, какого размера были на них графические платы!). Вычислительные мощности системы того времени составляли буквально доли от Мака, на котором я работаю сейчас, но тогда это было по-настоящему впечатляюще!
Момент был особенно волнующим, еще и потому, что в то время никто из нас не сталкивался со смешиванием в реальном времени на объектах с наложенными текстурами, перемещениями в сцене и эффектами освещения. Само собой, все это встречалось в LightWave и другом ПО с имитацией эффектов света, но о реальном времени речь не шла. Да… В то время программированием занимались, чтобы выдать нечто новое и необычное, а не чтобы через пару дней выпустить игру и подзаработать…
Что ж, будем переходить к изучению смешивания. Смешивание (blending) — это процесс комбинирования двух изображений, при котором находящееся ближе к зрителю кажется полупрозрачным. Представьте, что вы смотрите на предметы через кусок красного плексигласа в руке. Мир перед глазами становится красным, поскольку цвет плексигласа меняет окраску других объектов.
Чтобы претворить блендинг в реальность, нам понадобится частично прозрачный объект на переднем плане (в RGBA определении цвета значение альфа должно быть менее 1.0) плюс объект сзади, с которым он и будет “смешиваться”. Продолжить чтение »
В этом уроке мы по-быстрому освоим оставшиеся последними примитивы — точки и линии. Ничего сложного, но мне уже пришлось ответить на несколько вопросов по данным объектам, поэтому я решил остановиться на них подробнее.
Итак, наша цель — оперативное знакомство с точками и линиями, которое позволит нам двигаться дальше в нужном направлении.
Главное, не взять слишком высокий темп. При вызове “glVertexPointer()” я буду работать с таинственным параметром “stride” (шаг индекса) Рассмотрим эту тему сейчас, поскольку один из следующих уроков будет посвящен объектам Blender в программировании на iPhone, позволяющим без особого труда обзаводится на экране объектами в неприлично больших количествах
Шаг индекса — интересный параметр, которым многие просто пренебрегают (как, собственно, до этого момента и я) или описывают как “слишком сложную тему, к которой вы еще не готовы” (возможно, потому, что сами ее еще не проработали….). Главное — разобраться в основах — и все станет понятно. Продолжить чтение »
Сначала думал перейти к теме освещения, но решил, что мы еще не рассмотрели множество базовых вопросов, связанных с объектами и трансформациями. Сейчас в первую очередь я имею в виду трансформацию (анимацию) двух разных объектов разными способами в одном пространстве.
Помните, как мы применяли к сцене “glTranslatef()” и “glRotatef()“? Чтобы менять условия, я пользовался вспомогательной функцией “glLoadIdentity()“. Но для вычислительных ресурсов и визуализации сцен она “дорого обходится”, поэтому сейчас мы познакомимся с более эффективным методом.
Для этой цели введем новый объект: создадим пирамиду, переместим ее с помощью “glTranslatef()” и повернем независимо от куба с помощью “glRotatef()” — не обращаясь к “glLoadIdentity()” для сброса вершин.
Добавляем в пространство пирамиду
Вместо работы с треугольником предлагаю переключиться на трехмерные объекты и добавить пирамиду (практически точно такую же, как в Гизе).
В прошлом уроке я намеренно не упоминал, что созданный нами куб является сложной фигурой, т.е. состоит из нескольких примитивов. Мне кажется, что данный термин создает ощущение чего-то проблемного. Теоретически, квадрат — тоже сложный объект, но поскольку при рисовании мы обошлись одним вызовом функции OpenGL, будем считать его простым.
Итак, один сложный объект мы уже успешно создали! Приступаем ко второму.
Пирамиды не особенно проблематичны: основание-квадрат с присоединенными четырьмя треугольниками, соединяющимися над его центральной точкой. Любой интересующий объект создать гораздо проще, если мысленно разбить на простые составляющие. Меняется только количество задействуемых при его рисовании примитивов. Продолжить чтение »
|
Последние комментарии
пока я не получил лицензию разработчика, но уже очень хочу...
vodos, да...
Злые вы,...
iPhone Application writes data to a text file,...
ошибка...