Опрос
Что такое, по вашему мнению, «демократия»?
Сценарий scaleSkeleton
| Индекс материала |
|---|
| Сценарий scaleSkeleton |
| Страница 2 |
Весьма распространенной задачей является адаптация готового скелета для представления более мелких или более крупных персонажей. Простое масштабирование скелета часто не дает желаемого результата. Проблема состоит в том, что эта операция увеличивает или уменьшает скелет относительно начала отсчета корневого сустава. В действительности же все суставы должны увеличиваться или уменьшаться в направлении соответствующих костей. На рис.
3.6 показан результат применения к исходному скелету простой операции масштабирования (scale 0.5 0.5 0.5). Пропорции, очевидно, не сохранились. Вместе с тем применение сценария scaleSkeleton позволяет получить ожидаемый результат масштабирования. Сценарий scaleSkeleton на удивление невелик, proc scaleSkeleton( string $rootNode, float $scale ) string $childs[] = 'listRelatives - fullPath -type joint - allDescendents $roo"Node'; for( $child in $childs ) float $pos[] = "joint - query - relative - position $i;hild'; $pos[0] *= $scale; $pos[1] *= $scale; $pos[2] *= $scale; joint - edit - relative - position $pos[0] $pos[1] $pos[2] $child; Сначала следует описание процедуры scaleSkeleton, которая принимает на вход корневой узел скелета ($rootNode) и масштабный коэффициент ($scale). ргос scaleSkeletonf string $rootNode, float $scale ) Затем по команде listRelatives создается полный список всех узловсуставов, лежащих ниже корневого узла. Список включает не только прямых потомков, но и всех остальных. string $childs[] = 'listRelatives - fullPath - type joint - allDescendents $rootNode'; Очень важно использовать полный путь к дочерним узлам.
По причине того что некоторые потомки имеют одно и то же имя, а значит, являются неуникальными, применение подобных имен в операторах стало бы причиной проблем. На самом деле Maya выдаст сообщение о том, что имя узла неуникально. Однако полные пути к узлам (куда входят имена предков) не повторяются, поэтому используются именно они.
Далее организуется цикл по всем потомкам. for( $child in $childs ) Запрашивается текущее положение сустава, рассчитанное относительно его родителя, float $pos[] = 'joint - query - relative - position $chilo"; Затем позиция $pos масштабируется с коэффициентом $scale. Позиция - это вектор, отложенный из центра родителя в центр данного сустава.
Таким образом, он указывает в том же направлении, что и кость, соединяющая оба сустава. Посредством масштабирования этого вектора вы фактически перемещаете центр дочернего сустава ближе к родительскому суставу либо дальше от него. $pos[0] *= $scale; $pos[1] *= $scale; $pos[2] *= $scale; Наконец, устанавливается новое относительное положение сустава. Joint - edit - relative - position $pos[0] $pos[1] $pos[2] $child; При работе с суставом его центр является простым объектом, поскольку положение узла относительно собственного родителя является всего лишь значением его трансляции.
Поиск
В закладку
Авторизация
Погода


