Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Maxscript

Iniciado por Dingo, 08 de Septiembre de 2004, 09:46:52 AM

« anterior - próximo »

Dingo

 Hola a todos,

Estoy escribiendo un exportador en MaxScript y ya he conseguido que funcione al exportar la geometria de la escena y los objetos, pero me gustaria saber tambien como sacar la informacion de los bones y de las texturas de cada objeto.

He estado buscando por el google pero la verdad la info de MaxScript no abunda mucho y la ayuda del Max la veo un poco liosa.

¿Alguna idea de donde ver esto o como hacerlo?.

: :rolleyes:  

BeRSeRKeR

 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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Dingo

 !Muchisimas gracias, esto era justo lo que necesitaba!.
(uoh)  (uoh)  (ole)  






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.