Оглавление:
1. Подготовительный этап, создание концепции и подготовка к моделированию персонажа в 3d max
2. Моделирование головы персонажа
3. Развертка головы для последующего текстурирования
4. Моделирование тела персонажа
7. Анимация (скелет и модификатор skin)
9. Лицевая анимация и финальная компиляция
IX
Суть заключается в том, чтобы создать анимацию для модели примерно из 35 фреймов, каждый из которых будет содержать одно выражение лица, затем файл с анимацией экспортируется в формат vta. Не важно, каким образом будет создана анимация, я вкратце расскажу, как это сделать с помощью модификатора morpher . Для создания фаз анимации воспользуемся шаблоном http://developer.valvesoftware.com/wiki/Character_Facial_Animation_Shapekey_Set. И так, откроем модель в 3DS MAX, удалим модификатор skin, и скелет, оставим только сетку. Выделяем модель, инструментом Select and Move с зажатой клавишей shift клонируем модель как copy, и располагаем копию рядом, даем ей имя 01. Это будет первый фрейм, в нулевом будет референс. Заходим по ссылке данной выше, под номером 01- Upper lid lowerer, то есть опускание верхнего века. Скроем пока референсную модель, оставим только копию под именем 01. Теперь, перемещая вершины, нужно аккуратно опустить верхние веки. Именно перемещая вершины, нельзя создавать новые или соединять, только перемещать. С глазами все довольно просто.

Закончив с копией 01, снова выделяем референсную модель и клонируем под именем 02, располагаем рядом с 01, скрываем все кроме копии 02. Все то же самое, перемещаем вершины в нужное положение, сверяясь с шаблоном. Немного сложнее с фазами анимации рта. Важно помнить о некоторых нюансах: чтобы сделать улыбку естественной, мало просто растянуть губы, пойдите к зеркалу и широко улыбнитесь. Что вы видите? Все мышцы лица приходят в движение. Так что смелее, постарайтесь передать эмоции. И еще один момент, перед тем как начать создавать очередное выражение лица, связанное с губами – выделите элементы челюстей и спрячьте их, будет неприятно, когда вместе с улыбкой или другим движением губ зубы тоже станут деформироваться как резиновые.

И так, все 34 копии приведены в соответствие с шаблоном. Выбираем в контекстном меню Unhide All, выделяем референсную модель и присваиваем ей модификатор Morpher. В настройках модификатора находим свиток Channel List и жмем Load Multiple Targets. В открывшемся окне нажимаем All, а затем Load

Сохраним этот файл под каким-нибудь именем, вдруг придется подправить какие-то из фаз анимации. Теперь выбираем Select Invert (Ctrl+I) и удаляем все копии, оставив только референсную модель с модификатором Morpher. В настройках Time Configuration выставляем Start Time – 0, End Time – 34, создадим ключ в каждом фрейме. Перемещаемся в нулевой фрейм, жмем Auto Key. В нулевом кадре у нас референсная модель, тут ничего менять не будем. Перемещаемся в первый фрейм, в свитке Channel List напротив канала 01 выставляем значение 100

Двигаемся во второй фрейм, напротив 01 выставляем значение 0, напротив 02 – значение 100. Нужно вернуться назад в первый фрейм и изменить значение 02 так же на 0. Затем двигаемся в третий фрейм и повторяем те же операции. В итоге должна получится анимация, каждый из фреймов которой соответствует шаблону. Преимущество создания анимации при помощи Morpher состоит в том, что можно при необходимости смешивать в одном фрейме несколько разных фаз, добиваясь нужного выражения лица. Когда настройка анимации будет закончена, жмем File > Export и сохраняем файл в формате vta под именем имя_модели_expressions в папке hl2/models/имя_модели.
Пора внести изменения в файл qc. Но пред этим сделаем еще кое-что. Откроем сохраненный ранее файл с фазами анимации, нам нужны координаты для ограничения движения глаз. Процедура вычисления этих координат громоздко и путано описана здесь: http://developer.valvesoftware.com/wiki/Eye_Position_Setup на английском языке да еще с ошибкой J А в сущности все довольно просто. Координаты центра глаза у нас уже есть, они записаны в qc, мы их вычислили при помощи сфер. Собственно нам нужна только одна координата –Z(по высоте) Теперь нам нужно записать координату по оси Z вершины в центре верхнего века для нормального положения века, для крайнего верхнего положения и крайнего нижнего(когда глаз закрыт), Затем вычислить разницу между координатой центра глаза по оси Z и каждой из трех координат вершины в центре века.

Для этого выделим референсную модель, а так же копии с номерами 01 и 02, все остальные копии скроем (Hide Unselected) Теперь запишем координату по оси Z для вершины в центре века на каждой из трех копий, и вычислим значения, необходимые для qc:
Для upper_right (правое верхнее веко)
Neutral = Z_neutral – Z_center
Lowerer = Z_lowerer – Z_center
Raiser = Z_raiser – Z_center
Так как лицо симметрично, для левого верхнего века значения будут идентичны.
Для вычисления координат нижнего века скроем все кроме референсной модели и копий под номерами 03 и 04.

Проделаем аналогичные вычисления.
Теперь еще раз отредактируем файл qc:
$cd «d:SDK hl2modelsColonel»
$modelname «ColonelColonel.mdl»
$model «Colonel» «Colonel_reference.smd» {
eyeball righteye ValveBiped.Bip01_Head1 -1.21 -1.904 67.650 eyeball_r 1.000 4.000 grn_pupil_r 0.630
eyeball lefteye ValveBiped.Bip01_Head1 1.21 -1.904 67.650 eyeball_l 1.000 -4.000 grn_pupil_l 0.630
eyelid upper_right «Colonel_expressions.vta» lowerer 1 -0.217 neutral 0 0.098 raiser 2 0.132 split 0.1 eyeball righteye
eyelid lower_right «Colonel_expressions.vta» lowerer 3 -0.139 neutral 0 -0.228 raiser 4 -0.134 split 0.1 eyeball righteye
eyelid upper_left «Colonel_expressions.vta» lowerer 1 -0.217 neutral 0 0.098 raiser 2 0.132 split -0.1 eyeball lefteye
eyelid lower_left «Colonel_expressions.vta» lowerer 3 -0.139 neutral 0 -0.228 raiser 4 -0.134 split -0.1 eyeball lefteye
mouth 0 «mouth» ValveBiped.Bip01_Head1 0.000 1.000 0.000
flexfile «Colonel_expressions» {
$include «standardflex_xsi.qci»
}
$include «facerules_xsi.qci»
$include «bodyrules_xsi.qci»
}
Добавленные строки выделены жирным шрифтом. Кроме координат, вычислением которых мы сейчас занимались, я добавил еще три строки, содержащие ссылки на файлы из папки sourcesdk_contenthl2modelsrchumans_sdk. Эти файлы так же необходимо скопировать в папку hl2/models/имя_модели, они необходимы для правильной работы лицевой анимации.
В окончательном варианте мой qc выглядит так:
$cd «d:SDK hl2modelsColonel»
$modelname «ColonelColonel.mdl»
$model «Colonel» «Colonel_reference.smd» {
eyeball righteye ValveBiped.Bip01_Head1 -1.21 -1.904 67.650 eyeball_r 1.000 4.000 grn_pupil_r 0.630
eyeball lefteye ValveBiped.Bip01_Head1 1.21 -1.904 67.650 eyeball_l 1.000 -4.000 grn_pupil_l 0.630
eyelid upper_right «Colonel_expressions.vta» lowerer 1 -0.217 neutral 0 0.098 raiser 2 0.132 split 0.1 eyeball righteye
eyelid lower_right «Colonel_expressions.vta» lowerer 3 -0.139 neutral 0 -0.228 raiser 4 -0.134 split 0.1 eyeball righteye
eyelid upper_left «Colonel_expressions.vta» lowerer 1 -0.217 neutral 0 0.098 raiser 2 0.132 split -0.1 eyeball lefteye
eyelid lower_left «Colonel_expressions.vta» lowerer 3 -0.139 neutral 0 -0.228 raiser 4 -0.134 split -0.1 eyeball lefteye
mouth 0 «mouth» ValveBiped.Bip01_Head1 0.000 1.000 0.000
flexfile «Colonel_expressions» {
$include «standardflex_xsi.qci»
}
$include «facerules_xsi.qci»
$include «bodyrules_xsi.qci»
}
//end eye/face data
$cdmaterials «modelsColonel»
$hboxset «default»
$hbox 1 «ValveBiped.Bip01_Head1″ -1.250 -6.500 -3.190 8.250 3.500 3.310
$hbox 4 «ValveBiped.Bip01_L_UpperArm» 0.000 -2.750 -2.750 12.510 1.750 2.250
$hbox 4 «ValveBiped.Bip01_L_Forearm» 0.000 -2.190 -2.380 13.000 1.810 1.620
$hbox 4 «ValveBiped.Bip01_L_Hand» 0.060 -2.000 -1.500 4.060 1.000 2.500
$hbox 5 «ValveBiped.Bip01_R_UpperArm» 0.000 -3.000 -2.250 12.390 2.000 2.750
$hbox 5 «ValveBiped.Bip01_R_Forearm» -0.500 -2.200 -1.550 12.500 1.800 2.450
$hbox 5 «ValveBiped.Bip01_R_Hand» 0.060 -2.000 -2.500 4.060 1.000 1.500
$hbox 6 «ValveBiped.Bip01_L_Thigh» 0.000 -3.750 -3.250 17.850 3.750 3.250
$hbox 6 «ValveBiped.Bip01_L_Calf» 0.000 -3.510 -3.280 15.640 3.490 2.720
$hbox 6 «ValveBiped.Bip01_L_Foot» -1.070 -2.000 -2.840 5.040 5.000 2.160
$hbox 6 «ValveBiped.Bip01_L_Toe0″ -0.500 -3.000 -2.190 2.500 0.000 2.460
$hbox 7 «ValveBiped.Bip01_R_Thigh» 0.000 -3.750 -3.250 17.850 3.750 3.250
$hbox 7 «ValveBiped.Bip01_R_Calf» 0.000 -3.510 -2.820 15.640 3.490 3.180
$hbox 7 «ValveBiped.Bip01_R_Foot» -1.060 -2.010 -2.280 5.050 4.990 2.720
$hbox 7 «ValveBiped.Bip01_R_Toe0″ -0.500 -3.000 -2.600 2.500 0.000 2.100
$hbox 3 «ValveBiped.Bip01_Pelvis» -7.500 -5.500 -6.000 7.500 8.500 5.000
$hbox 2 «ValveBiped.Bip01_Spine2″ -2.500 -2.500 -7.000 14.500 7.500 7.000
$attachment «eyes» «ValveBiped.Bip01_Head1″ 3.20 -3.50 0.12 rotate 0.00 -80.10 -90.00
$attachment «mouth» «ValveBiped.Bip01_Head1″ 0.60 -5.50 -0.00 rotate 0.00 -80.00 -90.00
$attachment «chest» «ValveBiped.Bip01_Spine2″ 5.00 4.00 -0.00 rotate -0.00 90.00 90.00
$attachment «forward» «ValveBiped.forward» 0.00 0.00 0.00 rotate 0.00 0.00 -0.00
$attachment «anim_attachment_RH» «ValveBiped.Anim_Attachment_RH» 0.00 0.00 -0.00 rotate -90.00 -90.00 0.00
$attachment «anim_attachment_LH» «ValveBiped.Anim_Attachment_LH» -0.00 0.00 0.00 rotate -90.00 -90.00 0.00
$attachment «anim_attachment_head» «ValveBiped.Bip01_Head1″ -0.00 0.00 0.00 rotate -90.00 -90.00 0.00
$includemodel «humans/male_shared.mdl»
$includemodel «humans/male_ss.mdl»
$includemodel «humans/male_gestures.mdl»
$includemodel «humans/male_postures.mdl»
$includemodel «breen_anims.mdl»
$includemodel «breen_postures.mdl»
$includemodel «breen_gestures.mdl»
$surfaceprop «flesh»
$eyeposition -0.000 0.000 70.000
$illumposition -1.764 0.080 36.127
$sequence ragdoll «ragdoll» ACT_DIERAGDOLL 1 fps 30.00
$ikchain rhand ValveBiped.Bip01_R_Hand knee 0.707 0.707 0.000
$ikchain lhand ValveBiped.Bip01_L_Hand knee 0.707 0.707 0.000
$ikchain rfoot ValveBiped.Bip01_R_Foot knee 0.707 -0.707 0.000
$ikchain lfoot ValveBiped.Bip01_L_Foot knee 0.707 -0.707 0.000
$collisionjoints «phymodel.smd» {
$mass 90.0
$inertia 10.00
$damping 0.01
$rotdamping 1.50
$rootbone «valvebiped.bip01_pelvis»
$jointmerge «ValveBiped.Bip01_Pelvis» «ValveBiped.Bip01_Spine1″
$jointconstrain «valvebiped.bip01_spine2″ x limit -48.00 48.00 0.00
$jointconstrain «valvebiped.bip01_spine2″ y limit -25.00 25.00 0.00
$jointconstrain «valvebiped.bip01_spine2″ z limit -25.00 50.00 0.00
$jointconstrain «valvebiped.bip01_r_upperarm» x limit -39.00 39.00 0.00
$jointconstrain «valvebiped.bip01_r_upperarm» y limit -79.00 95.00 0.00
$jointconstrain «valvebiped.bip01_r_upperarm» z limit -93.00 23.00 0.00
$jointconstrain «valvebiped.bip01_l_upperarm» x limit -30.00 30.00 0.00
$jointconstrain «valvebiped.bip01_l_upperarm» y limit -95.00 84.00 0.00
$jointconstrain «valvebiped.bip01_l_upperarm» z limit -86.00 26.00 0.00
$jointconstrain «valvebiped.bip01_l_forearm» x limit 0.00 0.00 0.00
$jointconstrain «valvebiped.bip01_l_forearm» y limit 0.00 0.00 0.00
$jointconstrain «valvebiped.bip01_l_forearm» z limit -149.00 4.00 0.00
$jointconstrain «valvebiped.bip01_l_hand» x limit -37.00 37.00 0.00
$jointconstrain «valvebiped.bip01_l_hand» y limit 0.00 0.00 0.00
$jointconstrain «valvebiped.bip01_l_hand» z limit -57.00 59.00 0.00
$jointconstrain «valvebiped.bip01_r_forearm» x limit 0.00 0.00 0.00
$jointconstrain «valvebiped.bip01_r_forearm» y limit 0.00 0.00 0.00
$jointconstrain «valvebiped.bip01_r_forearm» z limit -149.00 4.00 0.00
$jointconstrain «valvebiped.bip01_r_hand» x limit -60.00 60.00 0.00
$jointconstrain «valvebiped.bip01_r_hand» y limit 0.00 0.00 0.00
$jointconstrain «valvebiped.bip01_r_hand» z limit -57.00 70.00 0.00
$jointconstrain «valvebiped.bip01_r_thigh» x limit -12.00 12.00 0.00
$jointconstrain «valvebiped.bip01_r_thigh» y limit -8.00 75.00 0.00
$jointconstrain «valvebiped.bip01_r_thigh» z limit -97.00 32.00 0.00
$jointconstrain «valvebiped.bip01_r_calf» x limit 0.00 0.00 0.00
$jointconstrain «valvebiped.bip01_r_calf» y limit 0.00 0.00 0.00
$jointconstrain «valvebiped.bip01_r_calf» z limit -12.00 126.00 0.00
$jointconstrain «valvebiped.bip01_head1″ x limit -20.00 20.00 0.00
$jointconstrain «valvebiped.bip01_head1″ y limit -25.00 25.00 0.00
$jointconstrain «valvebiped.bip01_head1″ z limit -13.00 30.00 0.00
$jointconstrain «valvebiped.bip01_l_thigh» x limit -12.00 12.00 0.00
$jointconstrain «valvebiped.bip01_l_thigh» y limit -73.00 6.00 0.00
$jointconstrain «valvebiped.bip01_l_thigh» z limit -93.00 30.00 0.00
$jointconstrain «valvebiped.bip01_l_calf» x limit 0.00 0.00 0.00
$jointconstrain «valvebiped.bip01_l_calf» y limit 0.00 0.00 0.00
$jointconstrain «valvebiped.bip01_l_calf» z limit -8.00 126.00 0.00
$jointconstrain «valvebiped.bip01_l_foot» x limit 0.00 0.00 0.00
$jointconstrain «valvebiped.bip01_l_foot» y limit -19.00 19.00 0.00
$jointconstrain «valvebiped.bip01_l_foot» z limit -15.00 35.00 0.00
$jointconstrain «valvebiped.bip01_r_foot» x limit 0.00 0.00 0.00
$jointconstrain «valvebiped.bip01_r_foot» y limit -25.00 6.00 0.00
$jointconstrain «valvebiped.bip01_r_foot» z limit -15.00 35.00 0.00
$animatedfriction 1.000 400.000 0.500 0.300 0.000
}
Теперь можно скомпилировать модель с лицевой анимацией.

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

Вот пожалуй и все , больше мне добавить нечего. Удачных компилов!
















































































































