Как сделать персонажа для игры
Как создать персонажа: восемь этапов
Персонажи везде: на сайтах и упаковке, в фильмах, рекламе и рассылках компаний. Рассказываем, как их создать — шаг за шагом.
У каждого иллюстратора и дизайнера свой стиль и способы работы. Поэтому единого плана создания персонажа не существует. Нет и строгих правил, которых нужно обязательно придерживаться, потому что это индивидуальный процесс. Но есть этапы, о которых нужно помнить, если хотите создать проработанного и полноценного персонажа.
Этап первый
Понять, зачем создаётся персонаж
С ответа на этот вопрос стоит начинать всегда. Потому что от целей зависят характеристики и внешний вид персонажа. Подумайте вот о чём:
Ответы на эти вопросы помогут сориентироваться и понять, нужно ли подробно прорабатывать персонажа или хватит базовых поз и минимального количества деталей.
Например, если нужен статичный персонаж для сайта, логотипа или буклета, то можно не изображать его в движении, не продумывать мимику и выражение им эмоций. А если персонажа будут анимировать для видео, то позы и движения нужно разрабатывать гораздо тщательнее. Персонаж для комикса тоже потребует подробной проработки в динамике, а для видеоигры — ещё и деталей костюма.
Пишет про управление в Skillbox. Работала координатором проектов в Русском музее, писала для блога агентства
CRM-маркетинга Out of Cloud.
Этап второй
Оценить важность персонажа
Этот пункт актуален, если ваша задача — рассказать историю, в которой задействованы несколько персонажей. Нужно понимать, какая роль у каждого из них. Кто главный, а кто второстепенный. Или, возможно, все персонажи одинаково важны и никого нельзя выделять. Эти детали тоже отразятся на внешнем виде.
Вот что вам нужно понять о каждом из персонажей:
Этап третий
Придумать историю персонажа
Чтобы персонаж получился правдоподобным, у него должна быть история. Как и любого живого существа, у него есть прошлое, настоящее и будущее.
На первый взгляд кажется, что это неважно. Зачем продумывать биографию, если персонаж нужен для стартовой страницы сайта или приложения? Дело в том, что персонажи без истории получаются скучными и неправдоподобными. Никто про них ничего не знает, а значит, в их внешности нет ничего, что делало бы их самобытными.
Представьте пожилого художника, который всю жизнь провёл в Париже. А теперь представьте молодого программиста, который вырос в России, а теперь работает в Google где-то за границей. Картинки, которые появились у вас в голове, различаются, верно?
Любые детали — национальность, место жизни, профессия, возраст — помогают создать образ. Все эти особенности, если вы их придумали, можно обыграть во внешнем виде персонажа.
Детали, которые помогут рассказать о вашем персонаже больше:
Это только начало — деталей может быть больше, и они могут быть какими угодно.
История важна не только для человеческих персонажей, но и для животных или любых оживлённых предметов.
Этап четвёртый
Описать, как выглядит персонаж
На этом этапе иллюстраторы начинают делать наброски, потому что общей информации уже достаточно: база есть, а теперь пришло время уточнить физические характеристики вашего персонажа.
Может, он будет крупный и даже толстый, с выдающимся носом и торчащими усами:
Или, наоборот, ваш персонаж будет худощавый и высокий. Подумайте, пропорционально ли его тело, или какая-то часть будет сильно акцентирована. Может быть, вы нарисуете ему длинные ноги, выдающийся нос и уши странной формы.
Кроме физических характеристик нужно продумать, как персонаж будет одет, какая у него причёска.
Что важно во внешнем виде персонажа:
Этап пятый
Продумать характер персонажа
После того как появились первые наброски, характер персонажа уже начинает проявляться. Иногда это случается и раньше, но на этом этапе вы уже неплохо знаете своего персонажа и понимаете, каким он будет. Если ещё нет, то самое время с этим разобраться.
Характер всегда отражается на внешнем виде. Например, вы хотите показать, что ваш персонаж очень умный и эрудированный, поэтому рисуете ему очки и книгу в руках. Или нужно подчеркнуть его легкомысленность и воздушность, тогда вы добавляете ему широкую нелепую улыбку. Если вы хорошо представляете своего персонажа, то и детали, которые передают его характер, могут быть не такими банальными.
Например, так можно передать плавность и женственность, даже если вы рисуете неуклюжего медведя.
Этап шестой
Выделить особенности персонажа
Этот пункт — дополнение двух предыдущих. Он нужен, если после проработки внешнего вида и характера появились новые детали, которые хочется добавить в образ.
У любого персонажа должны быть свои особенности. Что-то такое, чем он отличается от остальных. Это могут быть любые детали: например, он необычно одет, нетипично двигается или у него очень оригинальная причёска. Или персонаж подчёркнуто непропорционален: голова намного крупнее туловища, а ноги такие тощие, что непонятно, как они выдерживают вес его тела.
Этап седьмой
Понять, как персонаж выражает эмоции
Продумать мимику персонажа — это важный этап работы. Нужно понять, как он реагирует в разных ситуациях: радуется, злится, смеётся. Как меняется его лицо и тело, когда он плачет или задумался.
Чтобы выбрать наиболее выигрышные для персонажа эмоции, иллюстратор обычно делает разворот, где изображает персонажа в разных состояниях. Количество состояний зависит от ситуации. Когда персонаж нужен только для размещения на главной странице сайта, можно ограничиться базовыми эмоциями. Если нужно рассказать историю, то и эмоциональных состояний нужно продумать больше.
Как создать 3D персонажа и не выжить из ума
Character Аrtist Данил Соловьев раскрывает таинство создания 3D моделей на примере юнита Heavy Archer для игры «Спарта: Война империй».
Обычно модель юнита «с нуля» создает Character Аrtist, но на этот раз решили поработать совместно с Сoncept Аrtist. Так что я получил пачку концептов, из которых мы вместе с арт-директором выбрали и утвердили тот, который наиболее подходил для данного юнита.
Прежде всего нужно понимать, насколько важен выбор силуэта, телодвижения (gesture) и какую огромную роль играет так называемые S-curve и С-curve даже на стадии T-позы и болванки. Многие думают, что эти параметры можно задать при постановке персонажа в позу. Отчасти это правда, но поспешу заметить: в таком случае персонаж не получится настолько же плавным и динамичным, как если бы мы установили данные характеристики в болванку (тело) персонажа изначально.
У нас был один шаблон тела для всех юнитов. Его разработал Вова Силкин, наш Team Lead. Имея ранее готовый образец, я начал набрасывать на него малополигональный 3D-макет для того, чтобы быстро представить силуэт и дизайн персонажа.
Таких вариантов было много, но разновидностей шлемов было больше всего, поскольку голова персонажа – очень важный элемент дизайна. После танцев с бубном мы все-таки остановились на этом варианте, попутно доделывая элементы, которые уже устраивали нас.
Наконец-то, утвержденный дизайн! Можно приступать к проработке деталей!
Почти вся работа над персонажем была выполнена непосредственно в программе 3ds Max. Так как мы делаем иллюстрации, а не модели для игровых движков, у меня было неограниченное количество полигонов и полная свобода в разрешении текстурных карт.
В итоге у меня получилось 1,5 миллиона полигонов и 10 комплектов карт (diffuse map, reflection map, specular map, normal map,displacement и opacity) разрешением 4096×4096. Один комплект приходился чуть ли не на каждый элемент персонажа, из-за чего в конце очень «тормозила» сцена. В таких случаях надо отключать отображение текстур во вьюпорте.
Возьмем, к примеру, висящий через плечо колчан. Он кожаный, следовательно, фактура колчана не может быть такой идеально гладкой, какой мы ее смоделировали под Turbosmooth. Чтобы избавиться от этого недостатка, накидываем модификатор Noise для придания эффекта мятой поверхности.
Уже выглядит более реалистично. Поскольку это грубая и толстая кожа, такой вариант нам вполне подходит.
Складки на кожаной окантовке сделаны экструдом граней внутрь на местах, где могли бы быть складки. Таким образом я делал кожаные окантовки на всех частях брони.
Далее идет болванка под стёганую кожу, которую мы загоняем в ZBrush (рис. 1). Там же разворачиваем болванку при помощи UV master для того, чтобы наложить на нее аlpha-map. Затем делим модель на максимальное количество полигонов. Открываем Noise в свитке Surface (рис. 2), жмем совершенно незаметную кнопку Аlpha on/off для загрузки вашей альфа-карты и включаем кнопку UV, чтобы карта проецировалась по UV-развертке. Если альфа-карта легла криво, то надо выровнять развертку и повторить сделанное. (рис. 3).
После этого выравниваем UV-развертку, чтобы альфа-карта ложилась прямо.
Теперь добавляем складочки кистью Dam-Standart.
Наручи и некоторые детали я слепил в ZBrush.
Фактура металла делалась точно так же, через Noise, только с использованием другой карты.
Когда я начал ваять морду льва, столкнулся с проблемой: наручи не симметричны. Поэтому пришлось лепить без симметрии. После трех неудачных попыток я наконец нашел элементарное решение для себя, вспомнив уроки рисования. Необходимо было расчертить таким образом:
Эта ситуация еще раз доказывает, насколько важно знать и помнить основы дизайна. Возможно, дизайнеры, привыкшие к Аctivate Symmetry, могут также допустить подобные ошибки.
Рассмотрим шаги создания наколенника.
1. Сначала я моделирую болванку в 3ds Max, покрывая тело. Смотрю, нравится ли мне ее пропорции и силуэт. На данном этапе этого достаточно.
2. Начинаю подбирать подходящий дизайн в ZBrush. В данном случае, полагаясь на знание анатомии человека, повторяя направления мышц и костей, мы получим красивые линии. Так, собственно, и делали древние греки, и не только они.
3. Только после того как мы убедились, что нам нравятся пропорции и дизайн, начинаем добавлять мелкие детали. Такой метод (от общего к частному) применяют везде.
4. Теперь, когда мы закончили работу над всеми деталями, можем переносить болванку в 3ds Max обратно. Я делаю иллюстрацию, соответственно, у этой модели нет ограничения в полигонах и картах.
Следовательно, я могу позволить себе авторетопологию ZRemesher – новую функцию ZBrush. Эта опция позволяет в считанные секунды, путем нажатия всего одной кнопки, сделать из миллионной сетки вот такую, как на картинке ниже, сетку в 5к полигонов, что для 3ds Max сейчас абсолютно несмертельно.
По поводу текстурирования я мало что могу написать, потому что он был сделан дедовским способом: в Photoshop. А о Photoshop всем и так давно все известно. Не обошлось все-таки и без Mudbox: в нем я всего лишь намечал маски для царапин и импортировал модель обратно в Photoshop. Данный способ я нахожу самым удобным в последнее время.
Все развертки были произведены автоматически с помощью UV master в ZBrush.
В этой работе я открыл для себя две новые вещи: Additional bump и правила нанесения узоров по краям. Собственно, они связаны между собой.
Мне хотелось нарисовать греческие узоры по краям таким образом, чтобы они чуть-чуть выступали над тканью.
Я не знал, как это лучше сделать, поэтому полез их лепить в ZBrush. Получалось жутко криво и долго. После еще нескольких неудачных попыток я в конечном итоге нашел выход. Итак, берем прямой орнамент.
Применяем к нему Edit>Puppet Warp – функцию в Photoshop, которая позволяет смять и согнуть изображение в любую желаемую форму.
Ставим опорные точки. И, зажимая каждую из точек, выгибаем орнамент в нужную нам форму. Нажимаем Enter – и готово.
Что касается создания материалов, то здесь ничего военного! Все регулируется картами, никаких мудреных настроек нет.
Немаловажно помнить, что некоторые металлы – золото, бронза – отливают желто-оранжевым цветом. Поэтому на Reflect надо кидать карту именно с таким оттенком, а не привычную нам черно-белую. На картинке показана схема освещения.
Выполнив рендеринг, мы получаем вот такой чистый рендер без постобработки.
В этой работе я убедился, что внимание даже к незначительным и практически незаметным на первый взгляд деталям – залог успешной работы, признак профессионализма и любви к своему делу. Мой рецепт таков: не спешить и всегда двигаться от общего к частному!
Моделирование персонажей и создание графического дизайна для мобильной игры
Недавно увидела свет игрушка в стиле Tower Defense под названием Bug Invasion для Windows Phone. В статье разработчики делятся ключевыми моментами моделирования жучков и разработки дизайна игры.
Для создания игры были использованы два инструмента: Adobe Photoshop CS5 и Autodesk 3D`s Max 2011.
Первым шел этап обсуждения — какие элементы графического интерфейса нужно нарисовать и как они приблизительно должны выглядеть. На основании этих обсуждений создавались скетчи интерфейса пользователя, схематические рисунки размещения декораций и элементов игрового экрана, а также схематические рисунки будущих персонажей. Красоты тут мало, просто схемы.
Скетч меню выбора башни
Дизайн игры начал с рисования фона игры в Adobe Photoshop — рисования цветов, травы, камней, оградки, мест для размещения башен, холмы и т.д. В дальнейшем этот фон мы разрезали на две части, с прозрачностью. Первая часть — холм со слотами для установки башен, нижние и верхние декорации (для того, чтобы жуки могли заходить за кустики, ну чтобы было прикольнее :-), вторая, собственно, фон с зеленой травой и клевером.
Кажется, что все просто, но на самом деле все это миллион раз перерисовывалось, дорисовывалось, та как приходили приходили новые идеи.
Потом рисовались элементы GUI: кнопки, менюшки, иконки скилов, табы и фончики:
По поводу иконографики: никогда не нужно забывать о том, что иконки должны быть понятными и интуитивными. Также очень важно попадать в пиксель, отчего границы ваших иконок будут четкими:
Пример не попадания shapes в пиксель:
А тут мы исправились и попали:
В итоге получился полноценный графический интерфейс для игры. Ничего сложного, но уж больно трудоемкая это работа — тратится очень много времени и сил. Но, когда получаешь приемлемый результат, то радуешься и понимаешь, что оно того стоило.
Далее делались персонажи игры в Autodesk 3D`s Max. Мы всегда помнили, что персонажи должны гармонично сочетается с фоном игры. Процесс создания персонажа делится на такие этапы: скетчирование, моделирование, текстурирование и анимация, ну и порендерить еще надо.
Представьте или посмотрите на фотографию жука и нарисуйте на планшете скетч — это ускорит процесс моделирования. Создайте модель жука с небольшим количеством полигонов, потом их можно будет сгладить с помощью модификатора Mesh Smooth. Далее создаем материалы для жука и назначаем их на бездушный серый полигон:
Этапы создания башен такие же. Только при анимации нужно создавать дополнительные источники света перед дулом для имитации выстрела и освещения огнем.
Для создания персонажей использовался Autodesk 3D`s Max 2011. Такой способ показался нам оптимальным и более быстрым, нежели рисовать каждый кадр для башен и жуков. Для того, чтобы анимация жука была плавной использовалось 48 кадров. 12 кадров на умирание букашки, 18 для движения, 18 для пожирания посевов. Все кадры собирались посредством Photoshop в один спрайт. Для башен количество кадров больше — 84. 21 кадр на поворот без выстрела, 21 — на начало выстрела башни, 21 — для отображения выстрела во всей красе, 21 — для затухания огня.
Также для каждой башни нужно было создавать частицу, которая использовалась при выстреле. Для рендеринга использовал Mental Ray Render.
По поводу анимации. Если вы хотите, чтобы жук получился динамичным и не пластиковым — уделяйте много внимания мелочам в процессе анимирования. К примеру, когда гусень двигается, то ее тело сжимается и в центре как будто немного раздувается, усики двигаются, а глаза увеличиваються, что, в принципе, говорит о том, что ей не легко ползать быстро 🙂 Это самый простой пример анимации жука.
Для некоторых экземпляров, чтобы ускорить процесс анимирования, нужно было настраивать систему костей (Bones System). Система костей упрощала на порядок анимирование лапок жука.
Также важно настроить один раз сцену в 3ds Max с одинаковым освещением (для того, чтобы тени и освещенность наших игровых объектов были одинаковыми), установить камеру в одном положении (чтобы вид на жука или башню был всегда с одной и той же точки)
и что не мало важно — настроить откидывание тени на плоскость, невидимую для рендера, используя материал matte/shadow/reflection.
В итоге получаем красивыю детализированую тень на прозрачностью в формате *.png а не безвкусное овальное пятно.
Создание лица персонажа для игры «OnAir»
Добрый день! Меня зовут Дарья, я 3d artist в студии RainStyle production. В настоящее время мы заняты разработкой игры в жанре Sci-fi horror под названием “On Air”.
Игра рассказывает о загадочных событиях, случившихся с главным героем, который волей случая остановился в американском отеле Алгол. Это происшествие полностью поменяет его жизнь и заставит столкнуться с неизвестным.
Это наш первый игровой проект и в нем мы стараемся добиться максимальной реалистичности персонажей, передать их эмоции и характер. Поэтому для их создания было принято решение использовать технологию сканирования лиц. В рамках задач проекта нам потребуется две степени детализации персонажей: под рендер — для синематика и low poly — для использования в самой игре.
Игра On Air разрабатывается на движке Unreal Engine 4. Мы планируем написать несколько статей, в которых расскажем подробно этапы подготовки персонажа.
В данный момент мы занимаемся созданием демо версии игры, которая уже в скором времени появится в Стиме. В данной статье я расскажу о начальном этапе создания лица главного персонажа нашей игры.
Часть 1
На изображении ниже представлены некоторые из эмоций, которые мы получили после обработки сканов.
В основном они утрированы и не кажутся реалистичными. Это было сделано намеренно. Дело в том, что в основе данного метода создания лица лежит принцип смешивания форм «Blend shapes». То есть, каждая из этих эмоций будет применяться не в “чистом” виде, а в совокупности с другими. Об этом я подробнее расскажу в самом конце статьи. Для начала, надо разобраться, что делать с отсканированной головой и как мы можем ее использовать. Очевидно, что топология скана не позволяет применить ее в качестве модели, но при помощи запечения карты нормалей мы получим основные черты лица, морщины, поры, неровности или шрамы. Также со скана мы можем извлечь текстуру базового цвета.
В этом нам поможет программа Wrap 3.3. Она широко используется для обработки отсканированных моделей. С ее помощью мы будем проецировать нашу будущую модель головы на сканы.
Часть 2
Для начала необходимо создать так называемый базовый меш. То есть, нейтральное выражение лица, которое будет лежать в основе всех эмоций. Наш скан с нейтральной эмоцией выглядит так:
Программа Wrap 3.3 имеет нодовую систему, то есть все функции представлены в виде узлов (нод), которые связаны друг с другом цепочкой.
Выбор нод осуществляется при помощи клавиши Tab. При помощи нод «LoadGeom» и «LoadImage» подгружаются скан с нейтральной эмоцией и соответствующая ему текстура. Для этого в окне File Names надо указать путь. В настройках ноды «LoadGeom» вы можете выбрать различные режимы отображения геометрии (на изображении ниже отключена функция wireframe). Также здесь можно изменить цвет геометрии (не работает, если подключена текстура), координаты и масштаб.
Далее необходимо подгрузить базовый меш, который будет проецироваться на данный скан. Найти его можно на вкладке “Gallery”. Здесь представлено множество уже готовых эмоций. В данном случае я выбираю Basemesh.
Basemesh стоит приближенно сопоставить со сканом. Для этого можно использовать оси координат.
Чтобы спроецировать базовый меш на скан, я использую ноду Wrapping. При наведении курсора мыши на узлы ноды, высвечивается подсказка: первый узел, Floating geometry — предназначен для проецируемой геометрии, второй узел, Fixet geometry — для фиксированного объекта, по которому будет проецироваться геометрия (в нашем случае это скан с нейтральной эмоцией).
Чтобы запустить вычисление, необходимо отметить точки на обеих моделях, которые будут соответствовать друг другу. Для этого используется нода Select points, которая подключается в соответствующие узлы моделей. Выбрав эту ноду, следует перейти на вкладку Visual Editor. Включенная функция Sync views позволяет синхронизировать камеры для левого и правого окон.
Если проецируемая модель содержит полигоны, которые должны оставаться на месте, необходимо выделить их, воспользовавшись функцией Select Polygons. Иначе могут возникнуть артефакты, связанные со внутренними деталями меша.
Для применения ноды Select Polygons используется вкладка Visual Editor. Здесь можно выделить те полигоны, которые Модели из галереи разбиты на полигруппы, это упрощает задачу: их можно выделить или снять выделение на верхней панели.
Я выделяю внутренние детали горла, ноздри, крайние лупы век и нижнюю часть шеи.
После этого модель будет проецироваться корректно.
Также, для большей детализации, можно использовать ноду Subdivide. Она подключается к базовому мешу и все ноды, которые находятся ниже, подсоединяются к ее нижнему узлу (Output).
Далее, надо запечь текстуру со скана на базовый меш. Для этого применяется нода Transfer Texture. Узел Source geometry подключается к модели, с которой будет запекаться текстура. В нашем случае это скан. Узел Target geometry подключается к базовому мешу, но уже не к ноде LoadGeom, а к ноде Wrapping, так как мы будем использовать уже измененную, спроецированную геометрию.
В настройках этой ноды можно выбрать качество запеченной текстуры. После этого стоит добавить ноду Extrapolate Image, чтобы заполнить прозрачные места, и сохранить полученную текстуру с помощью ноды Save Image и нажатием кнопки Compute current frame. Геометрия сохраняется аналогично, с помощью ноды Save Geom.
Часть 3
После того, как мы получили нейтральную эмоцию и текстуру для нее, можно перейти к получению геометрии для других эмоций. Для этого подгружаем модель скана и Basemesh с текстурами.
Далее нужно выровнять Basemesh по скану. Для начала можно сопоставить модели приближенно, воспользовавшись координатными осями.
Нода, которая позволяет более точно выравнивать модели относительно друг друга — Rigid Alignment. В узел Floating geometry подсоединяется геометрия, которую необходимо выровнять. В узле Fixed geometry, соответственно, будет статичная геометрия (в нашем случае это скан).
При использовании ноды Rigid Alignment необходимо использовать ноду Select Points:
На моей модели есть контрольные маркеры, которые упрощают задачу при выборе точек. Для выравнивания моделей относительно друг друга точки необходимо ставить на тех частях лица, которые незначительно меняются при изображении той или иной эмоции. В случае с данной эмоцией это лоб, верхняя часть носа, шея и тп. Также, точки желательно расставлять по всем сторонам модели (то есть, например не только на лице, но и на затылке и ушах).
В результате мы получаем выровненные относительно друг друга модели:
В настройках ноды Rigid Alignment есть функция “Match skale”. Она используется, если модели необходимо выровнять также по масштабу.
После этого можно заняться проекцией базового меша на скан. Для этого мы будем использовать ноду Optical Flow Wrapping (оптический поток). Она позволяет выравнивать геометрию по текстуре скана. При этом полученная в итоге текстура эмоции будет полностью совпадать с текстурой базового меша за исключением складок, морщин и других изменений. Все неровности кожи и поры при использовании этого метода остаются на своих местах.
Перед использованием оптического потока, как и в первом случае, используется нода Select Polygons:
Таким образом, неподвижные части головы останутся на месте.
Также можно использовать ноду Select Points. Здесь указываются точки на подвижных частях лица:
Далее переходим в настройки оптического потока. В окне Visual Editor вокруг модели появились камеры, которые можно корректировать.
Сверху есть выпадающее меню, с помощью которого можно перейти в вид из камеры. По умолчанию их 13. Надо поставить их так, чтобы лицо полностью попадало в кадр.
По рекомендации разработчиков почти все настройки я оставляю по умолчанию за исключением параметров Resolution final и Optical flow smoothness final:
После этого, можно нажать Compute и посмотреть результат:
После того, как меш ровно спроецировался на скан, нужно запечь текстуру. делается это по тому же принципу, что и в первой части статьи:
В итоге, если совместить полученную текстуру с текстурой базового меша, добавятся некоторые детали, но, при этом, контрольные точки будут совпадать:
После этого, текстуру и полученную геометрию можно сохранить.
В итоге, мы получили меш новой эмоции с текстурой.
Часть 4
Метод Blend shapes позволяет “смешивать эмоции”. Для этого нужно подгрузить уже полученные меши в ноду Blend shapes.
Я подгрузила в первый узел нейтральную эмоцию. Двигая ползунки в настройках ноды, можно выбрать, насколько сильно будет выражена та или иная эмоция. Для того, чтобы этот метод сработал, модели должны иметь одинаковую топологию.
Результат
Вышеописанный процесс — это лишь небольшая часть очень объемной работы. После получения LowPoly моделей головы необходимо было создать карты нормалей, rougness, subsurface и т.д., а также настроить шейдер (в нашем случае мы настраивали шейдер для рендера и для движка). Также отдельно создавались глаза, одежда и волосы. Стоит также отметить, что данную задачу выполняли всего три человека. Это был наш первый опыт в создании высокодетализированного персонажа. Мы остались довольны результатом, но будем стремиться к большему.