Текстурщикам
Текстуры МАНУАЛ: ЛИЦЕВОЙ РИГ ПЕРСОНАЖА
IN
_______________________________________________________________________________
ОТДЕЛ АРТА
Здесь
представлен
- подробный
гайд по настройке лицевого рига персонажа. Настраивать лицевой сетап персонажа рекомендуется по порядку в соответствииконцепт с пунктамиуказанием ниже.материалов, Какреференсов результат,(желательно наCG выходереференсы, будетно получениз лицевой риг,жизни так же будетдопустимы) произведено+ подключенияуказание этогостепени лицановизны кобъекта существующемуи боди_ригупредполагаемая плановость в rig_devкадре.
ассете
ПРИМЕР иПЛОХОГО рассказаныКОНЦЕПТА



ПРИМЕРЫ особенностиОТНОСИТЕЛЬНО сборкиХОРОШИХ персонажаКОНЦЕПТОВ
для получения финального анимационного ассета.
ОТДЕЛ АРТА

ПРИМЕР



ПРИМЕРЫ
_______________________________________________________________________________
- Если в текстурах необходимы определённые картинки или надписи - нужны эти самые картинки и надписи четкие и в хорошем качестве(если еще и в векторе то вообще супер)
ПЛОХОЙ ПРИМЕР КАРТИНКИ(ПРИСУТВСТВУЕТ ЛИШНИЙ ЭЛЕМЕНТ СКОТЧА И НЕЧЕТКИЕ НАДПИСИ)
ПРИМЕР ХОРОШЕЙ КАРТИНКИ
1.ОТДЕЛ ИМПОРТ ЛИЦЕВОГО ПРЕСЕТАМОДЕЛЛИНГА
- Модель в в формате USD - у всех объектов есть UV и
Преждеотсутствуютчемоверлапы.начатьУработукаждойнеобходимомоделиоткрытьювипоследнийдолжныфайлначинаться в 1001 юдиме, особенно когда ассет создается при выносе объекта измоделлинга,другогои произвести небольшойклинап. Для этого в окнеригБилдера (РБ)необходимо открыть модульcleanup, там выделить подмодульcleaning_hashи кликнутьRUN. Далее,удаляем все, кроме:группа for_rigгруппа blendshapesгеометрические меши в группе geo, которые относятся к лицу (глаза, брови, ресницы, челюсти, язык, волосы, очки и т.п.)
Если нужно освежить память, как вызватьнеобходимый модульвРБ, то можно обратить внимание на статьюниже, награфу:создание риг_дев ассета, пункт 2.https://bookstack.yarko.com/books/rigging-AtN/page/manual-rigging-biped-personazaТеперь когда сцена максимально очищена от разного мусора и лишних геометрий, нужно импортироватьпресет лицевого рига, где уже будут созданы все необходимыеконтролы, а так же созданы все нужные связи между ними. Импортировать этотпресетможно черезРБ, открыв модульimport_face_temp.Каждое лицо уникально, потому недостаточно простоимпортнуть пресет, его нужноподогнать- для этого первая кнопкаimport helpersмодуляimport_face_tempимпортирует в сценухелперы. С помощью этих хелперов можно расставить ориентиры, где будут созданыконтролы.Чтобы избежать ошибокассета. припозингесозданиихелперов,UVполезнымразверткибудетпользоватьсяоткрытьруководством1отсюдаиз существующих лицевых ригов (на момент написания статьи, готовы лица на персонажей doc и vinilion) и посмотреть в каких местах расставлены контролы.Хелперы следует расставлять аккуратно, в правильные и логичные места на лице. На некоторых хелперах будут скрыты атрибуты вращения - это не ошибка, а умышленное действие, поскольку поворот хелпера будет учитываться при конвертации в контролы. Пример подгонки хелперов, изображен на изображении ниже.Следующим этапом будетконвертация хелперов в контролы, для этого нужно просто нажать вторую кнопкуface adaptв модулеimport_face_temp. После этого, работа над подгонкой лицевого сетапа будетпочти завершена. Оставшиеся 10-20 процентов будут подгоняться за счет работы стюнерами, которые будут находиться в группахлокальных риговвнутриface_others.Как работать с тюнерами будет описано ниже, в отдельных блоках посвященных локальным ригам.Шейпы контролов, к сожалению, придется настраивать вручную, так как хелперы конвертируюттолько оффсет трансформыПоскольку данная системалицевого ригаимеетлокальную основу, каждая часть лица будет выполняться наотдельной геометрии, т.е. вся работа лицевого сетапа выполняетсялокально- такой подход позволяет удобно работать с ригом, а так же минимизирует время надебаггингв случае, если риг нуждается в правках.Начинать работубудем с локального рига рта- поскольку бленды на уголки рта моделлеры делают наоснове лицевого рига. То есть, когда риг рта будетзакончен, эта версия рига отправляется вотдел моделлинга, где создаютдополнительные корректыпод заданные лимиты уголков рта. В это время работа над лицевым риггомне прекращается, а просто выполняются другие элементы лицевого рига(риг век, бровей, доработка рига рта и т.п.). После того, как бленды будутзакончены иодобрены- их нужноподключить уже в лицевом сетапе.Тем самым, все бленды будут готовы. Ниже будут ссылки на статьи по блендшейпам, для того, чтобы можно было самостоятельно проверить все ли бленды присутствуют на геометрии.https://bookstack.yarko.com/books/modelirovanie/page/
blendseipy-licevye-dlia-glavnyx-personazeicastye-osibki-v-topologii-uv-i-materialaxhttps://bookstack.yarko.com/books/modelirovanie/page/blendseipy-licevye-dlia-vtorostepennyx-personazei - Геометрия моделей должна максимально соответствовать материалам с концепта.
Резина, кожа, бумага, ткань, стекло и лампочки должны всегда быть отдельной геометрией не скомбайненной с другими объектами.(допускается совмещение металлов\не металлов внутри одной геометрии)
При наличии нескольких стеклянных объектов одного цвета в ассете такую геометрию лучше комбайнить, если цвета по концепту разные то и геометрия должна быть у каждого стекла своя, но в одной группе
Все светящиеся элементы типа лампочек всегда должны в одной группе и отдельными объектами как друг от друга, так и от любой другой части ассета.
Текстуры _______________________________________________________________________________OUT
2. РИГ РТА
- Приемка работы текстуры у худпоста подразумевает набор скриншотов в заметку к версии паблиша проекта Substance Painter в Ftrack с
чегонесколькихначинаемракурсовработу,иэтоподчеркивающиесматериаллокального рига рта. Выполнятьлицевой сетапнужно именно с этогопотому, чтобленды, которые отдаетотдел моделлированияне полные, то есть,бленды, корректирующие уголок рта они выполняюттолькоосновываясь на ужелицевом сетапе. Таким образом, нет необходимости "целиться" в положенияблендов, а так(эти женескриншотытормозит производственный процесс, такиспользуются каклицевойориентирригдлявшейдинга)
Первоеработу
ПРИМЕР
братьПЛОХОГО не имея бленды.СКРИНШОТА
На старте, нужно сделать 3 копии головы head, что для нас готовят моделлеры, и переименовать их в blends_mouth_geo, lips_minor_geo, mouth_geo, где mouth_geo будет нашей финальной геометрией рта, lips_minor_geo будет нужен для минорных изменений и blends_mouth_geo - под основную настройку открытия рта и деформаций уголков - начинать как раз будем с этой геометрии. Все геометрии перенесем в группу mouth_others, в face_others.
Для позинга внутренних элементов локальных ригов нужно двигать тюнеры. Тюнеры можно назвать внутренними хелперами, с помощью которых можно донастроить лицевой сетап каждой локальной части лица. Тюнеры двигают непосредственно элементы рига, что находятся внутри others групп. Так же внутри имеются группы с констрейнами - все они нужны ТОЛЬКО для позинга - в работе они не нужны - отсюда, после того как тюнеры будут в правильных местах, группу _constraint_tuners_others нужно удалять.
_tuners_group - группы с тюнерами;_constraint_tuners_others - группа с констрейнами, после позинга должна быть удалена--------------------------------------------------------------------------------------------------------------------------------------Внутри 3 тюнера:1) jaw_main_tuner обычно уже находится в корректном месте - его можно не двигать, однако должен он располагаться в середине между верхней и нижней губой;2) jaw_pivot_tuner нужно ставить в точку открытия челюсти;3) tongue_pivot_tuner нужно тоже ставить в точку открытия челюсти.
В силу стилизации, важное замечание:
jaw_main_tuner не всегда нужно ставить в анатомически верное положение
После того, как все тюнеры были расставлены и группа с констрейнами были удалены, необходимо создать пару кривых на верхнюю губу - M_jaw_up_curve, и на нижнюю губу - M_jaw_low_curve. Сделать подобное можно с помощью модуля mouthRig_temp в РБ.
Принцип работы следующий:1) в окне name пишем название кривой, то есть если мы настраиваем верхнюю губу, то M_jaw_up, если нижнюю, то M_jaw_low;2) далее на персонаже выделяем соответствующий эйджЛуп от левого уголка рта, до правого. Важно понимать, что эйджлупы нужно брать на рту, которые пересекаются;3) далее жмем кнопку RUN.В конечном итоге будут созданы все необходимые кривые и размещены в правильных местах в иерархии групп.
ХОРОШИХ СКРИНШОТВажно обращать внимание на нейминг, на момент написания статьи все локаторы имеют одинаковый префикс - потому его нужно править вручную, руководствуясь тем, что левые локаторы и кости внутри имеют префикс L, правые R, а центральный - оставить M.
Так же нужно уделять внимание на начало кривых, т.е. направление кривых должны быть одинаковые
Когда кривые настроили, нужно обратить внимание на трансформу face_head_transform. В атрибутах у этой трансформы есть много каналов, каждый из которых уже связан с элементами лицевого рига. Все эти каналы разбиты на группы для удобства. Благодаря этим атрибутам можно не копаться в риге, а сразу настраивать все, что необходимо.
Следующим этапом будет создания скина, как на кривых, так и на геометрии. Наш основной вектор, это при открытие рта попасть в положение блендшейпа открытого рта, который отдают моделлеры. Конечно, точь в точь попасть в положения блендов не получится, однако нужно стремиться к тому, чтобы кривые при открытие рта были почти по форме блендшейпа открытого рта.
Здесь представлены 3 скинКластера на кривые и на геометрию соответственно, а в окне outJoints представлены кости, на которые нужно выполнять этот скинКластер.А именно:1) jaw_low_psd_skinCluster - это скин на кривую M_jaw_low_curve;2) jaw_up_pds_skinCluster - это скин на кривую M_jaw_up_curve;3) mouth_skinCluster - это скин на геометрию blends_mouth_geo.
Добиться этого могут помочь атрибуты на face_head_transform. Регулировать их нужно когда рот уже открыт на максимум (вкл. limits на контроле M_jaw_control и опускаем рот максимально по оси Y).
CornerX - отвечает за движение уголка рта по оси X при максимально открытом положении рта;CornerY - отвечает за движение уголка рта по оси Y при максимально открытом положении рта;CornerZ - отвечает за движение уголка рта по оси Z при максимально открытом положении рта; jaw_open_ty - отвечает за движение челюсти по оси Y при максимально открытом положении рта;jaw_open_tz - отвечает за движение челюсти по оси Z при максимально открытом положении рта;jaw_open_rx - отвечает за поворот челюсти по оси X при максимально открытом положении рта;jaw_upper_open_tz - отвечает за движение верхней части челюсти по оси Z при движении челюсти вверх;jaw_upper_open_rx - отвечает за поворот верхней части челюсти по оси X при движении челюсти вверх;corner_angle - отвечает за угол наклона уголка рта - этот атрибут автоматически настраивается исходя из угла наклона хелпера (см. пункт 1 - этого мануала). Однако его можно регулировать и потом, если при работе появляется необходимость поменять этот параметр.
Как результат (см. картинки ниже), на выходе мы получим максимально приближенный к блендшейпу открытого рта результат основанный только на скиннинге, где выделенные кривые и наш blends_mouth_geo максимально приближены к блендшейпу, что выделен черной сеткой.
При покраске blends_mouth_geo важное замечание, уделять больше вниманию уголку рта, поскольку задача покрасить рот настолько хорошо, насколько это возможно ДАЖЕ С ЭКСТРЕМАЛЬНЫМИ положениями рта (для этого нужно на L(R)_corner_control выключить атрибут limits.
Добиться нужного результата за счет использования только скинКластера не получится, потому нужны корректирующие бленды. Здесь работа делится на 2 части - 1 часть выполняется отделом риггинга, 2 - отделом моделлинга.
Количество блендов на уголки рта лимитировано и они выполняются как на кривых, так и на геометрии, а именно:
ОВ
- Так
же требуется один ракурс из Iray имеющий темную и светлую сторону, показывающий объем и материал. такой кадр необходимо сохранить в формате png в разрешении 3840x2160, отключив ground в настройках iraycorner_U - Паблиш
набораcorner_Dтекстур - под
задачуcorner_Iс - использованием
пресетаcorner_Oв - формате
exrcorner_UOи - разрешении
4кcorner_OD
Для материала - стекла
необходимоcorner_IDиспользовать -
максимальноcorner_IUбелый - цвет,
максимальноjaw_open__corner_Uчерный - рафнесс
отjaw_open__corner_D0 - до
0.05jaw_open__corner_Iи - металличность
наjaw_open__corner_O1. - у
загрязненийjaw_open__corner_UOна - стеклах
металличностьjaw_open__corner_ODдолжна - быть
наjaw_open__corner_ID0, - остальные
настройки не регламентируются.jaw_open_corner_IU
максимально допустимый цвет черного
максимально допустимый белый
Где, U - означает вверх, D - вниз, I - в центр, O - наружу. Префикс jaw_open означает, что рот персонажа открыт в положение открытого рта, которое задается блендшейпом открытого рта.Так же применяется как на кривых, так и на геометрии корректирующий шейп jaw_open, который был взят для ориентира когда настраивали скин кривых.Бленды, которые так же будут присутствовать в лицевом сетапе рта, но применяются только на геометрии:
jaw_Uroll_up_inroll_up_outroll_bot_inroll_bot_outmouth_rotate_Lmouth_rotate_Umouth_rotate_Dmouth_rotate_R
Исходя из описания блендов выше, необходимо создать блендшейпы на кривых M_jaw_low_curve - jaw_low_psd_blendShape и M_jaw_up_curve - jaw_up_psd_blendShape, и создать на них соответствующие таргеты уголков рта. На геометрии тоже нужен блендшейп - mouth_blendShape, на который следует продублировать таргеты, что есть на кривых, а так же добавить таргеты, которые должны быть, но только на геометрии (см. выше).
Корректы на кривых следует выполнять таким образом, чтобы кривые по ходу движения уголка рта двигались по черепу персонажа - это придаст более реалистичный вид деформациям
Поскольку большую часть корректов, что отдают моделлеры, на начало работы с лицевым ригом уже готовы - их следует подключить к таргетам mouth_blendShape.
Бленды на roll_up и roll_bot отдаются нераздельно, т.е. на нижнюю и верхние части нужно делить уже в риге. Выполняется это с помощью покраски блендшейпа или любым другим известным способом.
Бленд mouth_rotate_R получается путем миррора mouth_rotate_L
Итоговым результатом будет открытие рта и максимально хорошая покраска скина. Далее этот файл передается в отдел моделлинга или руководителю риг отдела, чтобы тот передал это в отдел моделлинга - для дополнительных корректов на уголках рта. Когда бленды будут готовы, их следует подключить/заменить на соответствующие таргеты в блендшейпе mouth_blendShape.

Результат с блендами уголков рта и открытой челюстью

Далее, нужно создать блендшейп с геометрии blends_mouth_geo на геометрию lips_minor_geo, тем самым передадим деформации открытого рта на другой меш лица. Создадим скинКластер для настройки минорных изменений рига рта. Сами миноры нужны для создания дополнительных форм лица, когда обычные контролы не позволяют передать ту или иную мимику.
Здесь представлен скинКластер на lips_minor_geo, а в окне outJoints представлены кости, на которые нужно выполнять этот скинКластер.А именно:lips_minor_skinCluster - это скин на геометрию lips_minor_geo
Красить миноры рекомендую уже в позе, поскольку мимика персонажа должна позволять расширять рот настолько широко, насколько это возможно.
Чтобы миноры следовали за геометрией, нужно настроить uvPin на null группы миноров. uvPin следует цеплять к mouth_geo (эта геометрия будет изменяться, потому миноры будут спокойно следовать за геометрией без возникновения циклов). Однако выходящую матрицу из uvPin я рекомендую декомпозировать через ноду decomposeMatrix и передавать только каналы транслейта, поскольку ротейт в данном случае не нужен.
Однако при движении миноров теперь, будут возникать двойные трансформации, для нивелирования такой проблемы, достаточно создать multiplyDivide ноду, в input1 которой будут входить атрибуты транслейта минора, а в input2 находиться минусовые значения (-1, -1, -1). Выход multiplyDivide ноды следует подключить на группу трансформу между минором и его null группой.
1) L_lips_low_3_minor_control_null - оффсет группа минора2) L_lips_low_3_minor_control_transform - трансформа минора3) L_lips_lower_3_minor_control - сам минор
Теперь назначим блендшейп от lips_minor_geo к геометрии mouth_geo. Это будет финальная геометрия рта, соответственно назвать этот блендшейп нужно как minors_final_blendShape. Создадим последние управляющие элементы рига к рту с помощью скинКластера к mouth_geo и назовем его как mouth_final_skinCluster.
Здесь представлен скинКластер на mouth_geo, а в окне outJoints представлены кости, на которые нужно выполнять этот скинКластер.А именно:mouth_final_skinCluster - это скин на геометрию mouth_geo
Требования к покраске будут таким же, как и к минорам. Нужно стараться добиваться таких деформаций, чтобы регулируя контролы, можно было добиться максимальной экспрессии.
Иногда полезно будет использовать деформер deltaMush, который позволит выровнять местами сетку. Однако следует помнить, что больше 10 smoothing iteration ставить нельзя, поскольку на больших значениях deltaMush с удовольствием скушает не мало fps
На данном моменте лицевой сетап рта считается законченным и геометрию mouth_geo можно подключать через блендшейп к геометрии head_final_geo и переходить к другим локальным ригам.
_______________________________________________________________________________
3. РИГ ВЕК И ГЛАЗ
Для создания локального рига век нужно будет использовать 3 геометрии: eyes_geo - геометрия, на которой будут деформации внутренней границы века; eyes_outer_geo - геометрия, на которой будут деформации внешней границы века; eyes_final_geo - финальная геометрия, на которой будет финальный скейл век и подключенные eyes_outer_geo и eyes_geo, через блендшейп.
Геометрию eyes_geo обычным дубликатом не получить, потому начинать работу нужно с геометрией блендшейпа закрытого глаза closed_eyes.
Выделим геометрию closed_eyes и подвинем тюнеры век в группе lids_tuners_group/internal_tuners_group по границе линии смыкания век. Тюнеры подгонят необходимые элементы для риггинга век в нужные места, после их подгонки нужно удалить группу lids_constraint_tuners_others.
Тюнеры век не стоит ставить куда попало, нужно руководствоваться простой логикой:1) L_lids_corner_out_tuner и L_lids_corner_in_tuner ставятся в положения L_lids_minor_outer_control и L_lids_minor_inner_control соответственно;2) тюнеры верхние и нижние должны двигаться в "синергии", то есть не нужно брать желтые тюнеры и двигать 1 влево, другой вправо - такой подход просто не позволит вам сомкнуть веко корректно при дальнейшем сетапе;3) располагать тюнеры следует логично, где центральные желтые тюнеры должны находить в середине, крайний левый и крайний правый на равноудаленное расстояние от центра и голубые тюнеры на середине между corner тюнерами и low(up)_1_tuner и low(up)_3_tuner соответственно.Для наиболее простого понимания, картинка ниже визуально описывает правила расстановки тюнеров век.
Следующей задачей будет создание геометрической плашки L(R)_eyelids_plane_geo, на которой будут находиться косточки, от которых в свою очередь будет идти скин. Сами косточки цепляются через uvPin - такой подход не снизит производительность и сильно облегчит скин. Как альтернатива плашке может являться кривая, однако красить её не совсем комфортно.
Получить плашку можно выделив полигоны по линии смыкания век, и удалить все не нужное, кроме этой плашки.
Небольшой помощью при работе будет если последний полигон при выделении фейсЛупа убрать из этого выделения, тем самым будет четкое понимание где находится край века.
После получения плашки, нужно прискинить её к следующим косточкам, которые находятся в группах face_others/eyelids_others/lids_others.
Эти косточки можно найти в группе, что описаны выше. Следует понимать, что эти косточки нужны лишь для левой плашки, для правой будут ровно те же самые косточки, но уже с префиксом R, вместо L.
Прежде чем перейдем к настройке открытия века, нужно выполнить еще 1 действие - создать косточки, от которых будет идти базовый скин на открытие/закрытие века. Количество этих джоинтов будет эквивалентно количеству лупов на плашке, а их создание происходит вручную. Сами косточки нужно расставить по крайним положениям эйджЛупов.
Сами косточки нужно приврапить к плашке. Выполняется подобное через uvPin, поскольку это наиболее быстрый способ с точки зрения производительности ригга. Однако, стандартный uvPin передает все трансформы на джоинты, что создает ненужные ротейты на костях. В нашем случае ничего, кроме транслейтов не нужно, потому нужно декомпозировать исходящую матрицу из uvPin ноды в транслейты и передать на джоинты. Вручную такое выполняется с помощью decomposeNode, однако для экономии времени можно воспользоваться модулем uvPin_2 в RB.
1) geo - это имя плашки;2) new_name - это имя, которое будет у uvPin ноды;3) joints - лист джоинтов.Принцип работы достаточно тривиален, сначала нужно вставить в графу geo плашку или геометрию, на которой будет создан uvPin. В графу new_name нужно написать имя будущей uvPin ноды. В окно joints нужно вставить джоинты, которые будут приврапены к geo, сделать это можно выделив все нужные косточки в сцене и нажав правой кнопкой мыши по окну joints выбрать get selected from maya. Теперь жмем RUN и все приврапится как нужно.
В процессе открывания глаза, вероятен такой исход событий, когда джоинты или прыгают в нуль координат или врапятся к другому вертексу на плашке. В таком случае, я рекомендую приоткрыть глаз, удалить uvPin ноду и вручную перетащить в нужные места "улетевшие" джоинты. После снова применить модуль uvPin_2 в RB.
Когда все подготовительные элементы сделаны, можно начинать настройку открытия глаз. Первым делом корректно раскрасим скин на плашке L(R)_eyelids_plane_geo, результатом которого будет являться - корректные деформации при перемещении миноров века и вращении основных контролов век L_lids_upper_control и L_lids_lower_control.


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


Теперь можно открыть веко с помощью атрибутов на face_head_transform. Поскольку мы открываем глаза из положения закрытого века - результатом будет максимальное приближение к открытому глазу, то есть нужно настроить атрибуты таким образом, чтобы плашка L(R)_eyelids_plane_geo при открытии века была приближена к открытому веку настолько, насколько это возможно. Управлять открытием глаза можно с помощью атрибута blink на контроле L(R)_eye_lids_control.
Процесс настройки выполняется в соответствии с порядком атрибутов начиная с upper_remap и заканчивая min tZ. upper remap - угол на который поднимется верхнее веко;lower remap - угол на который опустится нижнее веко;corners remap - угол по которому будет двигаться угловые контролы (обычно дефолтное значение около -40 хватает);lower info - максимальный угол нижнего века (атрибут заблокирован, он нужен только как информация);upper info - максимальный угол верхнего века (атрибут заблокирован, он нужен только как информация);upper value - максимальный угол верхнего века;lower value - минимальный угол верхнего века;upper angle joints - угол поворота верхних косточек при открытие/закрытие глаза;lower angle joints - угол поворота нижних косточек при открытие/закрытие глаза;max tX - максимальное положение по транслейту Х верхнего века;max tY - максимальное положение по транслейту Y верхнего века;max tZ - максимальное положение по транслейту Z верхнего века;min tX - минимальное положение по транслейту Х нижнего века;min tY - минимальное положение по транслейту Y нижнего века;min tZ - минимальное положение по транслейту Z нижнего века.
При изменении атрибутов upper и lower remap можно регулировать угол на который будут опускаться и подниматься веки - таким образом, изменение этих атрибутов подгонит верхнюю и нижнюю границы плашки под открытый глаз на геометрии.
- картинка где плашка при blink 1 и открытый глаз
Для наиболее точной работы рига век, значение атрибутов upper remap и lower remap стоит сохранять равными друг другу. Конечно, система позволяет использовать разные значение этих атрибутов, но работать с настройкой век будет проще и комфортнее, имея равные значения в upper и lower remap.