Скелет (модели)

From Valve Developer Community
< Ru
Jump to navigation Jump to search
English (en)Русский (ru)Translate (Translate)

Скелет модели представляет собой упорядоченную структуру из одной или нескольких костей. Он подобен реальному скелету человека и животных, обеспечивает построение поз, движений и физических взаимодействий моделей(en).

Скелеты моделей позволяют художникам и аниматорам создавать и анимировать персонажей таким образом, чтобы они выглядели и привычными и реалистичными. Подобно тому, как наша кожа прикреплена к костям и изгибается и растягивается при движении костей, геометрия вершин персонажа прикреплена к его скелету и изгибается и растягивается при движении костей. Процесс привязки каждой вершины к одной или нескольким костям скелета называется облачением(en), который управляет деформацией видимых поверхностей(en) модели при движениях её костей.

Иногда скелет модели используют и/или он действует как его оснащение, стирая различия между фактически скелетом и отдельным анимационным оснащением, которое может существовать поверх него.

Основы структуры

В Source каждая модель имеет скрытую, неявную коренную кость, которая позиционирует и ориентирует модель относительно её модельного объекта(en). Эта специальная кость создается studiomdl при компиляции MDL-файла(en) и служит границей между внутренней структурой модели и её местоположением в мире. Модель не знает о своем неявной коренной кости; следовательно, эта кость не может быть анимирована с помощью $sequence(en) модели.

Все остальные последовательности костей, которые определены в SMD(en)/DMX(en) файлах модели или с помощью $definebone(en) в её QC-файлах(en), становятся дочерними к коренной кости. Эти определенные пользователем кости фактически составляют скелет модели. Поскольку в модели нельзя анимировать свою коренную кость, привычной практикой является создание пользовательской "коренной кости" в скелете персонажа, которая фактически становится дочерней к неявной корневой кости. Так это сделано в типичных скелетах двуногих персонажей Valve ValveBiped.Bip01_Pelvis. Если в SMD/DMX-файле модели нет костей, то скелет в итоговом MDL-файле будет содержать только неявную коренную кость. Это часто происходит с объектами статичного реквизита(en), таким как ящики или столы.

Ограничения количества костей

Для каждой ветви платформы Source и каждой игры определено ограничение на количество костей, которое может быть у модели. Это ограничение включает в себя и коренную кость, что фактически ограничивая количество костей, определяемых пользователем, до MAXSTUDIOBONES - 1.

Большинство игр, созданных на основе этой ветви платформы, придерживаются этого ограничения, включая Half-Life 2, Counter-Strike: Source, Portal и Team Fortress 2
Garry's Mod основан на Source 2013, но имеет несколько значимых изменений, включая общее увеличение значений пределов
Нужно сделать: Determine the limit for other notable games, including Alien Swarm, Portal 2

Движения скелета

Движения скелета - это процесс, при котором кости скелета движутся относительно друг друга, перемещая вместе с собой облачение из сеток(en) модели с обликом(en)персонажа.

Жёсткие скелеты

Модели, движение которых определяется только коренной костью, называются имеющими жёсткий "скелет". Они имеют только одну кость, поэтому вся модель следует за этой единственной костью. Это наиболее подходит для неизменных объектов, изготовленных из твердых материалов, таких как древесина или металл.

Сочленённые скелеты

Типичная пара костей родитель-потомок в скелете образует сочленение, которое может сгибаться. Например, рассмотрим человеческий локоть. Кости "локоть" не существует; "локоть" - это сочленение между плечевой костью и локтевой/лучевой костями. Скелеты большинства персонажей построены по принципу "шаровой опоры" между парой костей родитель-потомок. Сгибание (а иногда и растяжение) сочленений обеспечивает фундаментальную основу (без каламбура) движений(en) персонажей и физики кукол трупов(en).

Сочлененные скелеты могут быть любой сложности - от простых, как дверная ручка, до сложных, как целое человеческое тело. Кроме того, поскольку скелетная анимация является самым дешёвым(en) из всех методов деформирования, то обычным делом является упрощение сложных движений, таких как движение ткани, с помощью специально разработанных скелетов, вместо того чтобы моделировать дорогую(en) точную физику. Кукла матраца в Half-Life 2 является ярким примером этого.


Нужно сделать: Clean up everything below this line

Иерархия движений

Система иерархии движений Source используется для прикрепления различных объектов между собой, та же логика может быть использована для понимания того, как между собой соединены кости скелета.

По умолчанию каждый объект, входящий в иерархию движений, наследует свое местоположение и ориентацию от местоположения и ориентации точки крепления родительского объекта. Точка крепления $attachment(en) является частью геометрии родительского объекта, но имеет свои собственные свойства смещения, то есть свое собственное местоположение и ориентацию относительно местоположения и ориентации родительского объекта. Когда дочерний объект прикреплён, его точка отсчёта и углы выравниваются по местоположению и ориентации, определенным точкой крепления $attachment(en).

Если родительский объект перемещается, прикреплённый дочерний объект перемещается (совместно) с ним. Если родительский объект вращается (вокруг своей точки отсчёта), дочерний объект будет вращаться вокруг точки отсчёта родительского объекта.

  • 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 - спрайт (дульного пламени)


  • Объект(Entity) : местоположение и ориентация объекта в мире игры, которые "наследуются" далее:
    • Точка отсчёта модели : относительная точка с учетом ... смещёния на $origin(en) ...?
      • Коренная кость(en) : любая кость "прикреплённая" (непосредственно) к точке отсчёта. Обычно это только единственная коренная кость на модель... смещённая на $root(en)
  • (!) подмодели, в том числе "оснащённые" оружием (w_weapon, $bonemerge(en)) и потомки иерархии движений(en)...
  • упрощённый (LOD) скелет : bonetreecollapse(en), replacebone(en),
  • IK связи(en)

Сочленения, кости и крепления

Кости и сочленения
Если представить, что у каждой кости есть конец шар и конец чашка, то конец шар называется сочленением (joint) кости и этим концом она всегда соединёна с родительской костью(en). Когда эта кость движется, она вращается вокруг своего сочленения, поэтому сочленение можно назвать локальной точкой отсчёта (Origin) кости. Конец чашка, который вращается на фиксированном расстоянии вокруг сочленения, собственно и называется костью (bone). Любые дочерние кости, крепления и/или облачённые вершины, "связанные" с этой костью, используют местоположение и ориентацию кости (а не сочленения) в качестве своей точки отсчёта. Обратите внимание, что дочерняя кость "наследуется" от родительской кости, а не от сочленения.
Имена_костей
Cочленения обозначаются по имени их кости (bone_name), а не по имени родительской кости (parentbone_name); например, лодыжка = кость_стопа (foot_bone), колено = кость_голень (shin_bone) и т.д. Иногда кости называют по имени сочленения, например, стопа = кость_лодыжка (ankle_bone), голень = кость_колено (knee_bone). Однако это вызвает путаницу: что-либо, прикрепленное(en) к кости_колено (knee_bone), будет смещёно относительно лодыжки, а не от колена.
Отличие точек креплений от сочленений
Кость связана со своей родительской костью посредством сочленения. Свойства сочленения (углы и т.п.) определяются костью, а не родительской костью; дочерняя кость присоединяется к родительской. В отличие от этого, точка крепления является частью родительской кости скелета, и когда к ней присоединяется объект (например, оружие), точка крепления определяет свойства (жёсткого) соединения (углы и т.п.); родитель присоединяется к наследнику. Точку крепления на самом деле следует называть ограничением. Вот почему скелет оснащается w_weapons через $bonemerge, а не точек крепления ... ?

A skeleton is comprised of "chains" of bones, joints, effectors, and a root. Some good things to know:

  • Root(en): Where your skeleton starts. Moving the root moves the skeleton as one unit. Apex of the skeletal movement hierarchy.
  • Joint(en): Joins two bones, and is where bending and IK(en) occur.
  • Bone(en): This is the principle object in the skeleton and is what the mesh will be attached to.
  • Effector(en): These move a bone system around. The end point of a bone chain.

Коренная кость

Коренная кость (root или rootbone) - это особый тип кости. Она связана с точкой отсчёта (EntityOrigin) объекта и, следовательно, перемещает всю геометрию скелета относительно местоположения и ориентации объекта в игровом мире.

"По умолчанию" скелет имеет только коренную кость нулевой длины; и все облачённые на него вершины, размещаются относительно начала координат.

// пример SMD-файла(en) скелета "по умолчанию":
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(en) и $root(en).

Оснащение скелета

  • Нужно сделать: clarify:
    rigged(en), rigging(en), rig(en) ... 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(en) = a bone, deforms the mesh, so the "deformation(en)" would be applied to the mesh & skin, ... however if deformation(en) = a bone movement, either animation or (ragdoll) vphysics applied to the bone, then bone = "deformee" !
  • $weightlist(en) defines the skeleton's bone weight(en)s, used for "cross-fading" when blend animations(en) are combined.
  • $jointconstrain(en)ts are local vphysics forces used only for ragdolls. They have no effect in sequence animation.
  • $ikchain(en)s are


Геометрия поверхностей

Нужно сделать: probably move this section out to its own page Surface geometry or Vertex geometry ?

Геометрия поверхности объекта (также известная как его облачение (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(en) 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 данные геометрии поверхности всегда определяются как система вершин в трехмерном пространстве.

Нужно сделать: differences between Brush, Model and Sprite.
  • Данные местоположения вершин : (X Y Z) координаты относительно родительской точки отсчёта(en) в иерархии движений.
  • Данные ориентации вершин : (вектор(en) нормали вершины) определяет её ориентацию относительно соседних вершин ? ... смотрите Сглаживание вершин(en).
  • Данные вершин облика (skin) координаты (UV-разметки(en)) и имя файла skin.vmt ... смотрите UV-разметку(en) (используется только для отображаемых поверхностей)
  • Данные развесовки вершин (Vertex Weight) : (вещественное значение, по умолчанию равное 1.0) ... : смотрите развесовку вершин(en) (используется только для деформируемой отображаемых поверхностей)
  • Нужно сделать:  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.


Пространственная геометрия

Редактирование вершин