Re: Vertex Animation exporting from MAX
Posted: Tue May 08, 2012 3:49 am
3dsMax 7
Does it every time.
Does it every time.
http://bzforum.matesfamily.org/ -- Battlezone, Battlezone 2 forums
http://bzforum.matesfamily.org/
Code: Select all
sXSIData = ""
envelopeCount = 0
setOfAll = $*
for obj in setOfAll do
(
skinModifier = obj.modifiers[#skin]
if (skinModifier != undefined) do -- check for skin modifier
(
PrepareMaxForSkinOps obj
for i=1 to skinOps.GetNumberBones skinModifier do
(
envelopeCount += 1
boneName = skinOps.GetBoneName skinModifier i 0
sXSIData += " SI_Envelope {\r\n"
sXSIData += " \"frm-" + obj.name + "\";\r\n"
sXSIData += " \"frm-" + boneName + "\";\r\n"
vertArray = getAffectedVerts skinModifier i
sXSIData += " " + vertArray.count as string + ";\r\n"
for j=1 to vertArray.count do
(
vertNumber = vertArray[j]
vertNumber -= 1
weight = getVertexWeightFromWorldBone skinModifier vertArray[j] i
weight *= 100
sXSIData += " " + vertNumber as string + ";" + weight as string + ";,\r\n"
)
sXSIData += " }\r\n"
)
)
)
if (envelopeCount > 0) then
(
sXSIData = "SI_EnvelopeList {\r\n " + envelopeCount as string + ";\r\n" + sXSIData + "}"
print sXSIData
)
Function PrepareMaxForSkinOps _pNode =
(
-- Select @_pNode if needed.
if not _pNode.IsSelected do
(
Select _pNode
)
-- Unfreeze @_pNode if needed.
if _pNode.IsFrozen do
(
Unfreeze _pNode DoLayer:true
)
-- Set Modify Panel active if needed.
if GetCommandPanelTaskMode() != #modify do
(
SetCommandPanelTaskMode mode:#modify
)
-- Set @_pNode skin modifier as current object in modpanel if needed.
if ModPanel.GetCurrentObject() != _pNode.skin do
(
ModPanel.SetCurrentObject _pNode.skin
)
)
fn getAffectedVerts skinMod boneID=
(
vertAr=#()
numVerts=skinOps.getNumberVertices skinMod
for i = 1 to numVerts do
(
numBoneAffectVert=skinOps.GetVertexWeightCount skinMod i
for boneNum = 1 to numBoneAffectVert do
(
sysBoneID=skinOps.GetVertexWeightBoneID skinMod i boneNum
if sysBoneID==boneID then append vertAr i
)
)
vertAr
)
fn getVertexWeightFromWorldBone skinMod vertID boneID=
(
weight = 0
countBones = skinOps.GetVertexWeightCount skinMod vertID
for i = 1 to countBones do
(
if boneID == skinOps.GetVertexWeightBoneID skinMod vertID i then
(
weight = skinOps.GetVertexWeight skinMod vertID i
break
)
)
weight
)
You need to actually have skins and bones in the model. If you do, no idea. The print command should be working. Before it didn't die till it got to the line to generate the output display. Only thing I could do is try to do it remotely on your PC to see why it isn't working. I cant use that version of MAX here.MrTwosheds wrote:Pasted into envelope.ms, opened maxscript listener, run script, nothing at all happens.
Got an Idiots guide?
Which means what exactly? I had used the skin modifier, with ordinary objects, collapsed and saved, as a tutorial showed. I have seen mention of bones in places in Max, but as usual they are there in a "you already know how to use this so no logical layout is required" manner.You need to actually have skins and bones in the model
It is saying that the function 'PrepareMaxForSkinOps' doesn't exist, but it does. it is one of the pile of functions on the bottom of the script.MrTwosheds wrote:Tried again, got this.
-- Error occurred in Obj loop
-- Frame:
-- skinModifier: Skin:Skin
-- Obj: $Editable_Mesh:turret_y @ [-0.000919,-0.547622,1.887849]
-- PrepareMaxForSkinOps: undefined
-- Error occurred during fileIn in <File:D:\3dsmax\scripts\envelope.ms>
>> MAXScript FileIn Exception: -- Type error: Call needs function or class, got: undefined <<
No, skinOps is a variable, PrepareMaxForSkinOps is a function.MrTwosheds wrote:Does the capital S of SkinOps matter, some places it is S others s
Code: Select all
sXSIData = ""
envelopeCount = 0
setOfAll = $*
for obj in setOfAll do
(
skinModifier = obj.modifiers[#skin]
if (skinModifier != undefined) do -- check for skin modifier
(
PrepareMaxForSkinOps obj
for i=1 to skinOps.GetNumberBones skinModifier do
(
envelopeCount += 1
boneName = skinOps.GetBoneName skinModifier i 0
sXSIData += " SI_Envelope {\r\n"
sXSIData += " \"frm-" + obj.name + "\";\r\n"
sXSIData += " \"frm-" + boneName + "\";\r\n"
vertArray = getAffectedVerts skinModifier i
sXSIData += " " + vertArray.count as string + ";\r\n"
for j=1 to vertArray.count do
(
vertNumber = vertArray[j]
vertNumber -= 1
weight = getVertexWeightFromWorldBone skinModifier vertArray[j] i
weight *= 100
sXSIData += " " + vertNumber as string + ";" + weight as string + ";,\r\n"
)
sXSIData += " }\r\n"
)
)
)
if (envelopeCount > 0) then
(
sXSIData = "SI_EnvelopeList {\r\n " + envelopeCount as string + ";\r\n" + sXSIData + "}"
print sXSIData
)
fn PrepareMaxForSkinOps _pNode =
(
-- Select @_pNode if needed.
if not _pNode.IsSelected do
(
Select _pNode
)
-- Unfreeze @_pNode if needed.
if _pNode.IsFrozen do
(
Unfreeze _pNode DoLayer:true
)
-- Set Modify Panel active if needed.
if GetCommandPanelTaskMode() != #modify do
(
SetCommandPanelTaskMode mode:#modify
)
-- Set @_pNode skin modifier as current object in modpanel if needed.
if ModPanel.GetCurrentObject() != _pNode.skin do
(
ModPanel.SetCurrentObject _pNode.skin
)
)
fn getAffectedVerts skinMod boneID=
(
vertAr=#()
numVerts=skinOps.getNumberVertices skinMod
for i = 1 to numVerts do
(
numBoneAffectVert=skinOps.GetVertexWeightCount skinMod i
for boneNum = 1 to numBoneAffectVert do
(
sysBoneID=skinOps.GetVertexWeightBoneID skinMod i boneNum
if sysBoneID==boneID then append vertAr i
)
)
vertAr
)
fn getVertexWeightFromWorldBone skinMod vertID boneID=
(
weight = 0
countBones = skinOps.GetVertexWeightCount skinMod vertID
for i = 1 to countBones do
(
if boneID == skinOps.GetVertexWeightBoneID skinMod vertID i then
(
weight = skinOps.GetVertexWeight skinMod vertID i
break
)
)
weight
)
Code: Select all
sXSIData = ""
envelopeCount = 0
setOfAll = $*
fn PrepareMaxForSkinOps _pNode =
(
-- Select @_pNode if needed.
if not _pNode.IsSelected do
(
Select _pNode
)
-- Unfreeze @_pNode if needed.
if _pNode.IsFrozen do
(
Unfreeze _pNode DoLayer:true
)
-- Set Modify Panel active if needed.
if GetCommandPanelTaskMode() != #modify do
(
SetCommandPanelTaskMode mode:#modify
)
-- Set @_pNode skin modifier as current object in modpanel if needed.
if ModPanel.GetCurrentObject() != _pNode.skin do
(
ModPanel.SetCurrentObject _pNode.skin
)
)
fn getAffectedVerts skinMod boneID=
(
vertAr=#()
numVerts=skinOps.getNumberVertices skinMod
for i = 1 to numVerts do
(
numBoneAffectVert=skinOps.GetVertexWeightCount skinMod i
for boneNum = 1 to numBoneAffectVert do
(
sysBoneID=skinOps.GetVertexWeightBoneID skinMod i boneNum
if sysBoneID==boneID then append vertAr i
)
)
vertAr
)
fn getVertexWeightFromWorldBone skinMod vertID boneID=
(
weight = 0
countBones = skinOps.GetVertexWeightCount skinMod vertID
for i = 1 to countBones do
(
if boneID == skinOps.GetVertexWeightBoneID skinMod vertID i then
(
weight = skinOps.GetVertexWeight skinMod vertID i
break
)
)
weight
)
for obj in setOfAll do
(
skinModifier = obj.modifiers[#skin]
if (skinModifier != undefined) do -- check for skin modifier
(
PrepareMaxForSkinOps obj
for i=1 to skinOps.GetNumberBones skinModifier do
(
envelopeCount += 1
boneName = skinOps.GetBoneName skinModifier i 0
sXSIData += " SI_Envelope {\r\n"
sXSIData += " \"frm-" + obj.name + "\";\r\n"
sXSIData += " \"frm-" + boneName + "\";\r\n"
vertArray = getAffectedVerts skinModifier i
sXSIData += " " + vertArray.count as string + ";\r\n"
for j=1 to vertArray.count do
(
vertNumber = vertArray[j]
vertNumber -= 1
weight = getVertexWeightFromWorldBone skinModifier vertArray[j] i
weight *= 100
sXSIData += " " + vertNumber as string + ";" + weight as string + ";,\r\n"
)
sXSIData += " }\r\n"
)
)
)
if (envelopeCount > 0) then
(
sXSIData = "SI_EnvelopeList {\r\n " + envelopeCount as string + ";\r\n" + sXSIData + "}"
print sXSIData
)