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

Skin: Удаление скриптом нескольких костей из скина

Тема в разделе "MAXScript", создана пользователем McST, 31 янв 2008.

Модераторы: Savin Denis
  1. McST

    McST Знаток

    С нами с:
    01.06.2002
    Сообщения:
    609
    Симпатии:
    1
    Баллы:
    28
    не пойму в чем дело, написал функцию удаления костей из скина
    на входе подаю массив из индексов удаляемых костей и скина

    по операциям если идти - все работет
    а так - нет

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

    _________________

    fn RemBnLstFromSkin BnArray SkinMod =
    (
    RemovingBones = for i = 1 to BnArray.count collect SkinOps.GetBoneName SkinMod BnArray 0 -- collect removing bones names in array
    bi = 1
    for i = 1 to BnArray.count do -- go by bones ID
    (
    do -- loop while bone ID (bi) less than number of bones in skin
    (
    if (SkinOps.GetBoneName SkinMod bi 0) == RemovingBones -- test bones name that should be removed with bone in current loop iteration
    then
    (
    SkinOps.removeBone SkinMod bi
    --exit --with messagebox "exit"
    )
    else bi +=1
    )while (bi > (skinOps.getNumberBones SkinMod))
    )

    )
    ________________
     
  2. Savin Denis vip

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

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Код:
    fn RemBnLstFromSkin BnArray SkinMod = 
    ( 
    RemovingBones = for i = 1 to BnArray.count collect SkinOps.GetBoneName SkinMod BnArray[i] 0 -- collect removing bones names in array 
    bi = 1 
    for i = 1 to BnArray.count do -- go by bones ID 
    ( 
    do -- loop while bone ID (bi) less than number of bones in skin 
    ( 
    if (SkinOps.GetBoneName SkinMod bi 0) == RemovingBones[i] -- test bones name that should be removed with bone in current loop iteration 
    then 
    ( 
    SkinOps.removeBone SkinMod bi 
    --exit --with messagebox "exit"
    format "Remove: %\n" bi 
    ) 
    else bi +=1 
    )while (bi < (skinOps.getNumberBones SkinMod)) 
    ) 
    
    ) 
    

    1) Как минимум ошибка в условии while - знак >
    2) скорее всего вместо while нужен for или сбросить bi = 1
    3) Скрипт посути ничего не делает с таким же успехом мог сразу в цикле по масиву индексов удалять кости, так как ты далее по именам находиш теже самые индексы



     
  3. McST

    McST Знаток

    С нами с:
    01.06.2002
    Сообщения:
    609
    Симпатии:
    1
    Баллы:
    28
    все, спасибо,
    вопрос решен :)

    в цикле по индексам я не мог потому что как только ты удаляешь одну кость, список уменьшается, и все кости смещают вверх.
     
  4. McST

    McST Знаток

    С нами с:
    01.06.2002
    Сообщения:
    609
    Симпатии:
    1
    Баллы:
    28
    собсно правильный ответ вот

    Код:
    fn RemBnLstFromSkin BnArray SkinMod =
    	(
      	-- Get the names of the bones...
      	local lstBoneNames = for i = 1 to BnArray.count collect SkinOps.GetBoneName SkinMod BnArray[i] 0
      
      	-- Open the modify panel and select the skin modifier	
      	max modify mode
      	modPanel.setCurrentObject SkinMod ui:true
      
      	-- Starting bone index	
      	local iSkinBone = 1
      	
      	-- Loop through until we reach the end
      	-- The bone list is dynamic so we need to do
      	-- a check on every loop
      	while iSkinBone <= (SkinOps.getNumberBones skinMod) do 
    		(	
      		-- Get the name of the bone at the appropriate index
      		local sBoneName = SkinOps.GetBoneName SkinMod iSkinBone 0
      		
      		-- Check to see if the name is in our name array
      		local iIndex = findItem lstBoneNames sBoneName
      		-- Check...
      		if iIndex > 0 then 
    			(  			
      			-- Kill it...
      			SkinOps.removeBone SkinMod iSkinBone
      			
      			-- This is the funny part.  If we delete a bone, all the items in the
      			-- skinops bone array move up by one, so we don't need to
      			-- change the iSkineBone index!!
      			) else iSkinBone += 1
      					
      		)
      )
    
    спасибо некоему RustyKnight из Австралии
     
  5. Savin Denis vip

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

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Понятно такбы сразу и сказал, я то голову ломал зачем такие извращения.
    Тогда это делается так:

    Код:
    fn RemBnLstFromSkin BnArray SkinMod = 
    (
     max modify mode 
     modPanel.setCurrentObject SkinMod ui:false 
     sort BnArray
     for i = BnArray.count to 1 by -1 do SkinOps.removeBone SkinMod  BnArray[i]
    )
     
  6. McST

    McST Знаток

    С нами с:
    01.06.2002
    Сообщения:
    609
    Симпатии:
    1
    Баллы:
    28
    Хм...
    удалять с конца... :\ как же это я не додумался :)
    да, так даже проще получается.
    спасибо
     
Модераторы: Savin Denis

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