1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

Получения веса точки. Skin

Тема в разделе "MAXScript", создана пользователем Олег Гомозов 92913, 16 окт 2009.

Модераторы: Savin Denis
  1. Олег Гомозов 92913

    Олег Гомозов 92913 Пользователь сайта

    С нами с:
    07.03.2009
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    2
    Всем привет.
    Мне нужно сделать экспортер весов точек с привязкой к костям. С макс скриптом до этого не сталкивался так что пришлось немного пошаманить и вот что получилось (Все на стадии эксперементов):


    Вариант 1:
    Код:
    
    k= skinOps.GetNumberVertices  $Box01.modifiers[#Skin]
    l=  skinOps.GetNumberBones  $Box01.modifiers[#Skin]
    
    for i=1 to k do (
          for j=1 to l do (
                        m=skinOps.GetVertexWeight $Box01.modifiers[#Skin] i j
                        print m
    	)
    )
    
    Тут возникает проблем в том что цикл прирывается когда jая кость не действует на iую вершину, т.е. вес равен 0.
    По идее нужно проверять влияет ли кость на вершину но нужную функцию я так и не нашел.

    Вариант 2:
    Код:
    k= skinOps.GetNumberVertices  $Box01.modifiers[#Skin]
    l=  skinOps.GetNumberBones  $Box01.modifiers[#Skin]
    
    for i=1 to k do (
    	for j=1 to l do (
    		skinOps.SelectVertices $Box01.modifiers[#Skin] i
    		skinOps.SelectBone $Box01.modifiers[#Skin] j
    		m=skinOps.GetBoneName $Box01.modifiers[#Skin] j 1
    		print m
    		print $Box01.modifiers[#Skin].Effect
    		print
    	)
    )
    
    Тут мы смотрим сколько всего вершин и костей в модели а затем в цикле выбираем кость и вершину и выводим значение. Тут проблема в том что кость выбирается правильно но вес точки остается тем же что и для первой, т.е. получается чтото такое:

    Bone1 0.665
    Bone2 0.665 ( а должно быть 0.335, что видно в листенере когда переключаем кости вручную)

    Как это исправить я тоже без понятия. Надеюсь кто-нибудь сможет помочь, потомучто я в ступоре (.
     
  2. Олег Гомозов 92913

    Олег Гомозов 92913 Пользователь сайта

    С нами с:
    07.03.2009
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    2
    Пошаманил еще немного. skinOps.SelectVertices выбирает вершину но $Box01.modifiers[#Skin].Effect всегда возвращает значение веса той точки, которая была последний раз выбрана вручную мышью.
     
  3. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Информацию о весах можно получить для конкретной точки, по видимому это связанно с методом хранения информации.
    По этому делаем цикл по всем точкам:

    Код:
    obj = $
    m = obj.modifiers[#Skin]
    nv = skinOps.GetNumberVertices m
    --//for i = 1 .. nv
    _
    nw = skinOps.GetVertexWeightCount m i -- количество весов дл_ вертекса
    --//for j = 1 .. nw
    
    BoneID = skinOps.GetVertexWeightBoneID m i j -- Номер кости в списке Skin
    Weight = skinOps.GetVertexWeight m i j
    
    --// End for j = 1 .. nw
    --// End for i = 1 .. nv
     
  4. Олег Гомозов 92913

    Олег Гомозов 92913 Пользователь сайта

    С нами с:
    07.03.2009
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    2
    Спасибо за помощь. Немного поправлю: в
    Код:
    Weight = skinOps.GetVertexWeight m i BoneID
    вместо BoneID нужно ставить j т.к. функция смотрит вес по "внутреннему" ID кости для вершины.
     
  5. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Подправил
     
Модераторы: Savin Denis

Поделиться этой страницей