Hola.
Ejemplo de cómo recoger los bones de la escena y la información que es importante a la hora de exportar la animación y la geometría:
for node in $* do
(
if (classOf node) == BoneGeometry do
(
format "Bone: \"%\"\n\n" node.name
for t = animationRange.start to animationRange.end do
(
format "\tAt frame %:\n" (t.frame as Integer)
at time t
(
format "\t\tMatriz de transformación: %\n" node.transform
format "\t\tRotación: %\n" node.transform.rotationPart
format "\t\tPosición: %\n" node.transform.row4
)
)
format "\n"
)
)
Puedes probarlo fácilmente. Sólo tienes que crear unos cuantos bones y opcionalmente crear una pequeña animación y verás como, para cada frame varía la matriz de transformación.
Ejemplo de cómo recoger los materiales de todos los nodos de la escena:
for node in $* do
(
format "Node: %\n\n" node.name
if node.material != undefined then
(
local mtl = node.material
-- Vemos si el material es de tipo Multimaterial o Standar
if (classOf mtl) == Multimaterial then
(
-- Nombre del material
format "\tMaterial de tipo Multimaterial: \"%\"\n\n" mtl.name
for subMtl in mtl do
(
-- Damos por hecho que el material es de tipo standar --
-- Nombre del material
format "\tSubMaterial : \"%\"\n" subMtl.name
-- Vemos si tiene un diffuse map aplicado
if subMtl.diffuseMap != undefined then
(
format "\t\t\tdiffuseMap: \"%\"\n" subMtl.diffuseMap.fileName
)
else
(
format "\t\t\tNo tiene diffuseMap\n"
)
format "\n"
)
)
else
(
-- Nombre del material
format "\tMaterial de tipo Standar: \"%\"\n" mtl.name
-- Vemos si tiene un diffuse map aplicado
if mtl.diffuseMap != undefined then
(
format "\t\tdiffuseMap: \"%\"\n" mtl.diffuseMap.fileName
)
else
(
format "\t\tNo tiene diffuseMap\n"
)
)
)
else
(
format "\tNo tiene material aplicado\n"
)
format "\n"
)
Este también lo puedes probar fácilmente creándote unos pocos objetos y asignándole materiales (standar o multi/sub-object).
Finalmente, supongo que también querrás saber cómo recoger los pesos con los que cada bone afecta a un vértice. Para ello te digo las funciones clave y tú ya miras la ayuda de MAXScript para ver los parámetros. :)
CitargetVertexWeightCount
Devuelve el número de bones que afectan a un determinado vértice.
CitargetVertexWeightBoneID
Devuelve el identificador de un bone determinado.
CitargetBoneName
Devuelve el nombre del bone cuyo identificador es uno de los devueltos por getVertexWeightBoneID.
CitargetVertexWeight
Devuelve el peso con el que un bone afecta a un vértice determinado.
Ahora un poco de código por si te aclara las ideas:
-- NOTA:
-- mesh es una referencia a un mesh válido
-- skin es una referencia al modificador skin del mesh
-- Recorremos todas los vértices del mesh
for nVert = 1 to mesh.numVerts do
(
-- Recogemos el número de bones que afectan al vértice actual
local nBones = skinOps.getVertexWeightCount skin nVert
-- Recorremos todos los bones que afectan al vértice en curso
for nBone = 1 to nBones do
(
-- Recogemos el peso del vértice para el bone actual
local weight = skinOps.getVertexWeight skin nVert nBone
)
)
Lo que hace esto es recorrer todos los vértices del mesh y recoge los pesos para cada uno de ellos.
A ver si eso te aclara las cosas un poco.
Saludos.
!Muchisimas gracias, esto era justo lo que necesitaba!.
(uoh) (uoh) (ole)