Скелет (модели)
Скелет модели представляет собой упорядоченную структуру из одной или нескольких костей. Он подобен реальному скелету человека и животных, обеспечивает построение поз, движений и физических взаимодействий моделей.
Скелеты моделей позволяют художникам и аниматорам создавать и анимировать персонажей таким образом, чтобы они выглядели и привычными и реалистичными. Подобно тому, как наша кожа прикреплена к костям и изгибается и растягивается при движении костей, геометрия вершин персонажа прикреплена к его скелету и изгибается и растягивается при движении костей. Процесс привязки каждой вершины к одной или нескольким костям скелета называется облачением, который управляет деформацией видимых поверхностей модели при движениях её костей.
Иногда скелет модели используют и/или он действует как его оснащение, стирая различия между фактически скелетом и отдельным анимационным оснащением, которое может существовать поверх него.
Основы структуры
В Source каждая модель имеет скрытую, неявную коренную кость, которая позиционирует и ориентирует модель относительно её модельного объекта. Эта специальная кость создается studiomdl при компиляции MDL-файла и служит границей между внутренней структурой модели и её местоположением в мире. Модель не знает о своем неявной коренной кости; следовательно, эта кость не может быть анимирована с помощью $sequence модели.
Все остальные последовательности костей, которые определены в SMD/DMX файлах модели или с помощью $definebone в её QC-файлах, становятся дочерними к коренной кости. Эти определенные пользователем кости фактически составляют скелет модели. Поскольку в модели нельзя анимировать свою коренную кость, привычной практикой является создание пользовательской "коренной кости" в скелете персонажа, которая фактически становится дочерней к неявной корневой кости. Так это сделано в типичных скелетах двуногих персонажей Valve ValveBiped.Bip01_Pelvis. Если в SMD/DMX-файле модели нет костей, то скелет в итоговом MDL-файле будет содержать только неявную коренную кость. Это часто происходит с объектами статичного реквизита, таким как ящики или столы.
Ограничения количества костей
Для каждой ветви платформы Source и каждой игры определено ограничение на количество костей, которое может быть у модели. Это ограничение включает в себя и коренную кость, что фактически ограничивая количество костей, определяемых пользователем, до MAXSTUDIOBONES - 1.
Source 2013 MAXSTUDIOBONES = 128
- Большинство игр, созданных на основе этой ветви платформы, придерживаются этого ограничения, включая
,
,
и 
Garry's Mod: MAXSTUDIOBONES = 256
- Garry's Mod основан на
, но имеет несколько значимых изменений, включая общее увеличение значений пределов
Left 4 Dead и
Left 4 Dead 2: MAXSTUDIOBONES = 128
Source Filmmaker: MAXSTUDIOBONES = 256
Counter-Strike: Global Offensive: MAXSTUDIOBONES = 256
Движения скелета
Движения скелета - это процесс, при котором кости скелета движутся относительно друг друга, перемещая вместе с собой облачение из сеток модели с обликомперсонажа.
Жёсткие скелеты
Модели, движение которых определяется только коренной костью, называются имеющими жёсткий "скелет". Они имеют только одну кость, поэтому вся модель следует за этой единственной костью. Это наиболее подходит для неизменных объектов, изготовленных из твердых материалов, таких как древесина или металл.
Сочленённые скелеты
Типичная пара костей родитель-потомок в скелете образует сочленение, которое может сгибаться. Например, рассмотрим человеческий локоть. Кости "локоть" не существует; "локоть" - это сочленение между плечевой костью и локтевой/лучевой костями. Скелеты большинства персонажей построены по принципу "шаровой опоры" между парой костей родитель-потомок. Сгибание (а иногда и растяжение) сочленений обеспечивает фундаментальную основу (без каламбура) движений персонажей и физики кукол трупов.
Сочлененные скелеты могут быть любой сложности - от простых, как дверная ручка, до сложных, как целое человеческое тело. Кроме того, поскольку скелетная анимация является самым дешёвым из всех методов деформирования, то обычным делом является упрощение сложных движений, таких как движение ткани, с помощью специально разработанных скелетов, вместо того чтобы моделировать дорогую точную физику. Кукла матраца в Half-Life 2 является ярким примером этого.
Иерархия движений
Система иерархии движений Source используется для прикрепления различных объектов между собой, та же логика может быть использована для понимания того, как между собой соединены кости скелета.
По умолчанию каждый объект, входящий в иерархию движений, наследует свое местоположение и ориентацию от местоположения и ориентации точки крепления родительского объекта. Точка крепления $attachment является частью геометрии родительского объекта, но имеет свои собственные свойства смещения, то есть свое собственное местоположение и ориентацию относительно местоположения и ориентации родительского объекта. Когда дочерний объект прикреплён, его точка отсчёта и углы выравниваются по местоположению и ориентации, определенным точкой крепления $attachment.
Если родительский объект перемещается, прикреплённый дочерний объект перемещается (совместно) с ним. Если родительский объект вращается (вокруг своей точки отсчёта), дочерний объект будет вращаться вокруг точки отсчёта родительского объекта.
- WorldOrigin - начало координат игрового мира [worldspawn]
- Vehicle - местоположение (носителя) в игровом мире (WorldPosition) : местоположение и ориентация всех объектов относительно WorldOrigin.
- Seat - смещение точки крепления (сиденья) относительно местоположения (WorldPosition) родительского объекта
- NPC - смещение модели дочернего объекта (НИП) [$origin]
- Pelvis - смещения конца коренной кости Root_bone_end (тазовой кости) скелета
- Chest - смещение конца первой сочленённой кости Joint_bone1_end (грудной клетки)
- Torch - смещение точки крепления (фонаря)
- Torchbeam - спрайт (луча фонаря)
- Arm - смещение конца второй сочленённой кости Joint_bone2_end (рук)
- Sleeve - смещение вершин отображаемой сетки (рукава)
- Muscle - смещение вершин физического короба Physbox (мышц)
- Hand - смещение точки крепления (кисти руки)
- Shotgun - смещение конца коренной кости Root_bone_end подмодели (оружия)
- Muzzleflash - спрайт (дульного пламени)
- Shotgun - смещение конца коренной кости Root_bone_end подмодели (оружия)
- Torch - смещение точки крепления (фонаря)
- Chest - смещение конца первой сочленённой кости Joint_bone1_end (грудной клетки)
- Pelvis - смещения конца коренной кости Root_bone_end (тазовой кости) скелета
- NPC - смещение модели дочернего объекта (НИП) [$origin]
- Seat - смещение точки крепления (сиденья) относительно местоположения (WorldPosition) родительского объекта
- Vehicle - местоположение (носителя) в игровом мире (WorldPosition) : местоположение и ориентация всех объектов относительно WorldOrigin.
- Объект(Entity) : местоположение и ориентация объекта в мире игры, которые "наследуются" далее:
- Точка отсчёта модели : относительная точка с учетом ... смещёния на $origin ...?
- Коренная кость : любая кость "прикреплённая" (непосредственно) к точке отсчёта. Обычно это только единственная коренная кость на модель... смещённая на $root
- bone_joint : место, где кость сочленяется с родительской костью
- bone_name (Смотреть также SMD узлы)
- bone_attach : имеющиеся свойства её местоположения и ориентации являются "началом отсчёта" для последующих наследников кости:
- сетка (mesh) : вершины отображаемой сетки облачённой (enveloped) на одну кость или (развешены (weightmap)) на несколько костей.
- физический короб (physbox) : вершины габаритов столкновений облачены на одну кость.
- крепление (attachment) : захваты, к которым может прикрепляться модель другого объекта (например w_weapons).
- дочернаяя кость : имя следующей кости в структуре скелета
- Коренная кость : любая кость "прикреплённая" (непосредственно) к точке отсчёта. Обычно это только единственная коренная кость на модель... смещённая на $root
- Точка отсчёта модели : относительная точка с учетом ... смещёния на $origin ...?
- (!) подмодели, в том числе "оснащённые" оружием (w_weapon, $bonemerge) и потомки иерархии движений...
- упрощённый (LOD) скелет : bonetreecollapse, replacebone,
- IK связи
Сочленения, кости и крепления
- Кости и сочленения
- Если представить, что у каждой кости есть конец шар и конец чашка, то конец шар называется сочленением (joint) кости и этим концом она всегда соединёна с родительской костью. Когда эта кость движется, она вращается вокруг своего сочленения, поэтому сочленение можно назвать локальной точкой отсчёта (Origin) кости. Конец чашка, который вращается на фиксированном расстоянии вокруг сочленения, собственно и называется костью (bone). Любые дочерние кости, крепления и/или облачённые вершины, "связанные" с этой костью, используют местоположение и ориентацию кости (а не сочленения) в качестве своей точки отсчёта. Обратите внимание, что дочерняя кость "наследуется" от родительской кости, а не от сочленения.
- Имена_костей
- Cочленения обозначаются по имени их кости (bone_name), а не по имени родительской кости (parentbone_name); например, лодыжка = кость_стопа (foot_bone), колено = кость_голень (shin_bone) и т.д. Иногда кости называют по имени сочленения, например, стопа = кость_лодыжка (ankle_bone), голень = кость_колено (knee_bone). Однако это вызвает путаницу: что-либо, прикрепленное к кости_колено (knee_bone), будет смещёно относительно лодыжки, а не от колена.
- Отличие точек креплений от сочленений
- Кость связана со своей родительской костью посредством сочленения. Свойства сочленения (углы и т.п.) определяются костью, а не родительской костью; дочерняя кость присоединяется к родительской. В отличие от этого, точка крепления является частью родительской кости скелета, и когда к ней присоединяется объект (например, оружие), точка крепления определяет свойства (жёсткого) соединения (углы и т.п.); родитель присоединяется к наследнику. Точку крепления на самом деле следует называть ограничением. Вот почему скелет оснащается w_weapons через $bonemerge, а не точек крепления ... ?
A skeleton is comprised of "chains" of bones, joints, effectors, and a root. Some good things to know:
- Root: Where your skeleton starts. Moving the root moves the skeleton as one unit. Apex of the skeletal movement hierarchy.
- Joint: Joins two bones, and is where bending and IK occur.
- Bone: This is the principle object in the skeleton and is what the mesh will be attached to.
- Effector: These move a bone system around. The end point of a bone chain.
Коренная кость
Коренная кость (root или rootbone) - это особый тип кости. Она связана с точкой отсчёта (EntityOrigin) объекта и, следовательно, перемещает всю геометрию скелета относительно местоположения и ориентации объекта в игровом мире.
"По умолчанию" скелет имеет только коренную кость нулевой длины; и все облачённые на него вершины, размещаются относительно начала координат.
// пример SMD-файла скелета "по умолчанию": version 1 nodes 0 "root_bone" -1 end skeleton time 0 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 end
- Для смещения части или всей модели относительно местоположения объекта на карте, смотрите $origin и $root.
Оснащение скелета
- Нужно сделать: clarify:rigged, rigging, rig ... if "rig" = the whole skinned, enveloped, jointed, etc. model, ready and waiting for animations to be applied, then "rigged" means animation-ready or complete, and "rigging" is the process of attaching & tweaking the relationships (uvmap, weightmap, jointconstraints, etc.) between all the elements. On the other hand, "rigging" might refer specifically to configuring all the bone properties for a given skeleton - jointconstraints, attachments, IKrules, etc. - so "rig" = a NotRigid skeleton, and "rigged" still means "animation-ready".
- Нужно сделать: clarify:deformer = a bone, deforms the mesh, so the "deformation" would be applied to the mesh & skin, ... however if deformation = a bone movement, either animation or (ragdoll) vphysics applied to the bone, then bone = "deformee" !
- $weightlist defines the skeleton's bone weights, used for "cross-fading" when blend animations are combined.
- $jointconstraints are local vphysics forces used only for ragdolls. They have no effect in sequence animation.
- $ikchains are
- Подмодели (Sub-models) (например w_weapons) и дополнительные сетки (Sub-meshes) (например предметы одежды) используют $bonemerge для выравнивания с родительской мобулью, тогда как объекты присоединяются к точке крепления модели.
- Смотрите Rigging a weapon model и Attachments о присоединении съёмных подмоделей к скелету.
- Смотрите $bodygroup о присоединении дополнительных сеток к скелету.
- Смотрите облачение и развесовку вершин о присоединении деформируемой сетки на скелет.
- Смотрите облачение и UV-разметку о наложении облика на сетку.
- Смотрите облачение и развесовку вершин о присоединении деформируемой сетки на скелет.
Геометрия поверхностей
Геометрия поверхности объекта (также известная как его облачение (envelope), тело (body), габарит (hull), облик (скин), сетка (mesh), вершинная геометрия или геометрия модели) определяет точную форму и размеры пространственных объёмов, каждый из которых содержится внутри непрерывной поверхности.
- Есть два основных типа геометрии поверхностей с различными свойствами:
- Отображаемая геометрия ... at the end of the day only the Skin texels are rendered, but the skin hangs on a 3D mesh which is deformed by skeletal animation.
- Геометрия столкновений ... is invisible in game but defines this object's Solidity to other objects.
- bbox (bounding box, surrounding bounds, == cbox?, collision hull, movement hull, player hull, npc hull)
- hbox (hit box) используется для проверки попадания пуль (and local damage modifiers ... crowbar, crossbow, phys-object hit locations?)
- physbox (physmodel, collisionmodel, ragdoll) используется только для физических взаимодейтвий vphysics, включая движение/анимацию куклы трупа.
В Source данные геометрии поверхности всегда определяются как система вершин в трехмерном пространстве.
- Данные местоположения вершин : (X Y Z) координаты относительно родительской точки отсчёта в иерархии движений.
- Данные ориентации вершин : (вектор нормали вершины) определяет её ориентацию относительно соседних вершин ? ... смотрите Сглаживание вершин.
- Данные вершин облика (skin) координаты (UV-разметки) и имя файла skin.vmt ... смотрите UV-разметку (используется только для отображаемых поверхностей)
- Данные развесовки вершин (Vertex Weight) : (вещественное значение, по умолчанию равное 1.0) ... : смотрите развесовку вершин (используется только для деформируемой отображаемых поверхностей)
- Нужно сделать: a rectangular box is defined by a pair of ("min" and "max") coordinates relative to the origin which represent opposing corners; the other 6 vertex coords are deduced as necessary. A non-rectangular polygonal mesh is a network of triangles connected by their vertices. Because GPU pipelines are optimised to process triangles, rectangular (brush) surfaces are split into two triangles for Rendering.
Пространственная геометрия
- Геометрия силуэта (outline илиprofile)... проверки трассировки лучей без реальных столкновений, такие как тени и линии взгляда (LOS). Обычно расчитываются автоматически из отображаемой модели во время выполнения, но для большей эффективности может использоваться и другуя геометрия. ($shadowlod и т.д.?) (Смотреть также sprite)
- Геометрия скелета ... иерархия кинематических движений... точка крепления смещена относительно точки отсчёта и углов родительского объекта. (Жёсткая/нежесткая)
- Пространственная геометрия (Spatial geometry) ... Некоторые свойства объекта использующие пространственную геометрию:
- сфера (sphere) : например light - дистанция (Range или Constant-Linear-Quadratic_Falloff) относительно точки отсчёта (EntityOrigin) объекта.
- конус (cone) : например light_spot - направление (углы), сектор (угол обзора), дистанция (Range или Constant-Linear-Quadratic_Falloff) относительно точки отсчёта (EntityOrigin) объекта.
- конус взгляда НИП (FOV и дистанция = 2048 единиц) относительно точки отсчёта (EntityOrigin) объекта.
- PVS : массив потенциальной видимости (областей видимости) относительно области местоположения объекта.
- PAS : массив потенциальной слышимости (областей видимости) относительно области местоположения объекта.
Редактирование вершин
- Элемента карты (Brush) : Инструмент вершины
- Полигональной сетки (Mesh) : (SMD Треугольники), Редактор моделей
- Облика (Skin) : смотрите UV-разметка
- Габарита столкновений (Hull) : C++ объекта НИП, объекта игрока
- Короба поражения (Hitbox) : QC $hbox
- Ограничивающего короба (Bounding box) : QC $bbox
- Спрайта (Sprite) : свойства объекта env_sprite (спрайты могут использовать упрощения и двухмерную графику для представления трехмерных объектов.)