我有一个3DS Max场景对象,我对其应用了外观包裹修改器。我想将其转换为皮肤修改器,然后在堆栈中直接将其下面的皮肤包裹删除。
所以我应该简单地通过正确的堆栈号删除修饰符? 哎呀,我什至还有一条打印线,用于标识堆栈中的编号。
我为python和EvalMAXScript之间的来回道歉,我不是编码人员,只是一个努力理解的人。
# setup =======================================================
import MaxPlus as mp
from pymxs import runtime as rt
mySel = rt.selection
max = mp.Core.EvalMAXScript
box = mp.Factory.CreateGeomObject(mp.ClassIds.Box)
sphere = mp.Factory.CreateGeomObject(mp.ClassIds.Sphere)
cyl = mp.Factory.CreateGeomObject(mp.ClassIds.Cylinder)
node = MaxPlus.Factory.CreateNode
node(box)
node(sphere)
node(cyl)
#setup =======================================================
max("select #($Sphere001, $Cylinder001)")
# =============================================
rt.addModifier (mySel[0], rt.Skin())
max("select $Sphere001")
max("skinOps.addBone $.modifiers[#Skin] $Cylinder001 1")
# =============================================
max("select $Box001")
rt.addModifier (mySel[0], rt.Skin_Wrap())
max("append $" + str(mySel[0].name) +".modifiers[#Skin_Wrap].meshList $Sphere001")
mySel[0].modifiers[0].meshDeformOps.convertToSkin (False)
print mySel[0].modifiers[0].name + " <----- ZERO"
print mySel[0].modifiers[1].name + " <----- ONE!!!!"
#print mySel[0].modifiers[2].name #<----- will say IndexError: Index out of range <--- This makes sense
rt.deleteModifier (mySel[0], 2) #<------------------ I want to delete the SKIN WRAP modifier SO WHY 2???
但是,为什么删除skin wrap修饰符在deleteModifer arg中需要“ 2”?
打印出修改器的名称时,3D Max的编号顺序与删除时的编号顺序不同吗?
这与python计数/迭代从0开始而不是从1开始有关吗?
有人可以将我/或想通过python学习max脚本的任何人指向我可以获取有关此类信息的文档吗?因为我认为在某些基本文档(我显然找不到)中应该放一些与输入正确索引号相同的东西。
请原谅焦虑。我花了好几个小时试图弄清楚为什么它不起作用,直到我偶然发现一个超出范围的索引号。
谢谢。
答案 0 :(得分:0)
according to the doc,您可以直接将修饰符而不是索引传递给deleteModifier
函数:
deleteModifier <node> <modifier_or_index>
所以类似的东西可以工作:
import MaxPlus as mp
from pymxs import runtime as rt
mySel = rt.selection
max = mp.Core.EvalMAXScript
node = MaxPlus.Factory.CreateNode
box = mp.Factory.CreateGeomObject(mp.ClassIds.Box)
node_box = node(box) # Watch out, 'node_box' this is a MaxPlus node
max("select $Box001")
# Create the modifiers
rt.addModifier (mySel[0], rt.Skin_Wrap()) # Skin Wrap
rt.addModifier (mySel[0], rt.Skin()) # Skin
# Get their references
modifier_skin = mySel[0].modifiers[0]
modifier_skin_wrap = mySel[0].modifiers[1]
print (modifier_skin.name + " <----- modifier_skin")
print (modifier_skin_wrap.name + " <----- modifier_skin_wrap")
rt.deleteModifier (mySel[0], modifier_skin_wrap)
rt.deleteModifier (mySel[0], modifier_skin)
您甚至可以执行一个函数,该函数可以删除给定名称的修饰符:
import MaxPlus as mp
from pymxs import runtime as rt
def delete_modifier_by_name(node, modifier_name):
max_node = rt.getnodebyname(node.Name)
for modifier in max_node.modifiers:
if modifier.name == modifier_name:
print("Deleting %s..." % modifier.name)
rt.deleteModifier (max_node, modifier)
return
mySel = rt.selection
max = mp.Core.EvalMAXScript
node = MaxPlus.Factory.CreateNode
box = mp.Factory.CreateGeomObject(mp.ClassIds.Box)
node_box = node(box) # Watch out, 'node_box' this is a MaxPlus node
max("select $Box001")
# Create the modifiers
rt.addModifier (mySel[0], rt.Skin_Wrap()) # Skin Wrap
rt.addModifier (mySel[0], rt.Skin()) # Skin
delete_modifier_by_name(node_box, "Skin")
#~ delete_modifier_by_name(node_box, "Skin Wrap")