Render.ru

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

McST

Знаток
Рейтинг
28
#1
не пойму в чем дело, написал функцию удаления костей из скина
на входе подаю массив из индексов удаляемых костей и скина

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

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

_________________

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))
)

)
________________
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#2
Код:
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) Скрипт посути ничего не делает с таким же успехом мог сразу в цикле по масиву индексов удалять кости, так как ты далее по именам находиш теже самые индексы



 

McST

Знаток
Рейтинг
28
#3
все, спасибо,
вопрос решен :)

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

McST

Знаток
Рейтинг
28
#4
собсно правильный ответ вот

Код:
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 из Австралии
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#5
в цикле по индексам я не мог потому что как только ты удаляешь одну кость, список уменьшается, и все кости смещают вверх.
Понятно такбы сразу и сказал, я то голову ломал зачем такие извращения.
Тогда это делается так:

Код:
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]
)
 

McST

Знаток
Рейтинг
28
#6
Хм...
удалять с конца... :\ как же это я не додумался :)
да, так даже проще получается.
спасибо
 
Сверху