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

Созание модификатора

Тема в разделе "MAXScript", создана пользователем oguretz, 19 май 2009.

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

    oguretz Пользователь сайта

    С нами с:
    24.11.2008
    Сообщения:
    24
    Симпатии:
    0
    Баллы:
    2
    Собственно задача модификатора - выделить полигоны по matID и задать им outline - с помощью polyop.bevelFaces с высотой ноль. Естественно, скрипт не работает никак) Укажите ошибки, пожалуйста.

    Код:
    plugin modifier selectAndOutline
    	name:"SelectAndOutline"
    	classID:#(252525,262626)
    (
    	parameters main rollout:params
    	(
    		matid type:#integer default:1
    		on matid do
    		(
    			global face_selection = #{}
    			local base_obj = $.baseobject
    			local num_faces = polyop.getNumFaces base_obj
    			for f = 1 to num_faces do
    			(
    				local mat_id = polyop.getFaceMatID base_obj f
    				if mat_id = matid do face_selection[f] = true
    			)
    		)
    		amount type:#float default:0
    		on amount do
    		(
    			polyop.bevelFaces $.baseobject $face_selection 0 $amount
    		)
    	)
    	rollout params "General"
    			(
    				spinner matid "MatID: " type:#integer range:[1,100,1]
    				spinner amount "Amount: " type:#float
    			)
    	
    )
    
     
  2. Savin Denis vip

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

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    В целом это хак, ибо в хелпе черным по белому написано что топологию не меняет.
    Но поправил чтоб както работало.
    Регировать будет только после введения Ammaunt
    Да и и крутить нельзя ибо будут наложение операции, так как меняем базовою геометрию.

    Код:
    plugin modifier selectAndOutline
    name:"SelectAndOutline"
    classID:#(0xec38c0a, 0x23db2118)
    (
    
    local last_ammaunt = 0.
    local last_setID = 1
    fn setOutLine =
    (		
    	local face_selection = #{}
    	local base_obj = $.baseobject
    	local num_faces = polyop.getNumFaces base_obj
    	for f = 1 to num_faces do
    	(
    	local mat_id = polyop.getFaceMatID base_obj f
    	if mat_id == last_ammaunt do face_selection[f] = true
    	)
    	polyop.bevelFaces ($.baseobject) face_selection 0 (-last_ammaunt)
    )
    parameters main rollout:params
    (
    matid type:#integer default:1 animatable:false ui:matid
    amount type:#float default:0	animatable:false ui:amount
    on matid set val do
    (
    	last_setID = val
    )
    
    on amount set val do
    (
    	if val != last_ammaunt  do 
    	(
    	setOutLine()
    	last_ammaunt = val
    	)
    )
    )
    rollout params "General"
    (
    spinner matid "MatID: " type:#integer range:[1,100,1]
    spinner amount "Amount: " type:#float
    )
    
    ) 
     
  3. oguretz

    oguretz Пользователь сайта

    С нами с:
    24.11.2008
    Сообщения:
    24
    Симпатии:
    0
    Баллы:
    2
    Хмхмхм... А вообще возможно ли сделать модификатор, не меняющий базовую геометрию и выполняющий все те же самые действия? то есть полноценный и настраиваемый, алгоритм действия-то простой... или обязательно использовать SDK и какой-нибудь C++?
     
  4. Savin Denis vip

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

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Таки да, чтобы написать нормальный модификатор потребуется "SDK и какой-нибудь C++". Можно попробовать создавать ниже по стеку например модификатор Edit_Poly который работает с топологией. Но чтобы сбросить топологию тебе придется каждый раз его пере-создавать.
     
Модераторы: Savin Denis

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