Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Obtener Uv De Vertices En Maxscript

Iniciado por Ahuman, 28 de Septiembre de 2005, 08:25:38 PM

« anterior - próximo »

Ahuman

 Hola a todos,

Vereis, estoy obteniendo la geometria de un modelo desde 3dsmax, pero las coordenadas de texturas me da a mi que las exporto mal.

Estoy usando gettvert para obtener las coordenadas, pero no estoy seguro de que sea la funcion mas fiable.

¿Alguna idea?   :huh:  

BeRSeRKeR

 Esa función debería darte valores correctos. Es la que yo utilizaba antes, hasta que tuve que dar soporte a cualquier número de canales de mapeado (utilizando, entre otras funciones, meshOp.getMapVert). ¿Qué te lleva a pensar que te devuelve valores incorrectos?.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

zupervaca

 tengo un codigo que hice hace bastante, la verdad no se si llegue a acabarlo o si funciona ya que lo tenia en la carpeta de desechos desde hace meses, pero el tema es que en el exportaba los vertices correctamente con sus coordenadas de textura, no se si te valdra de mucho ya que este script, si no recuerdo mal, lo hice cuando estaba aprendiendo maxscript, osea que bien bien no creo que este, pero te orientara

-- MaxToXml.ms
-- Fichero para escenas max a xml
-- Por David Inclán

-- Valores globales
global xmlFile
global xmlFile_SaveCeroData = 1
global xmlFile_ABC = -- Indices de los vertices a, b, c
#( "a", "b", "c" )
global xmlFile_Materials = -- Lista de materiales
#()
global xmlFile_MapChannels = -- Nombre de los canales segun su shader
#(
#( -- Anisotropico
 "AmbientMap", "DiffuseMap", "SpecularMap", "DiffuseLevelMap", "SpecularLevelMap", "GlossinessMap", "AnisotropyMap",
 "OrientationMap", "SelfIllumMap", "OpacityMap", "FilterMap", "BumpMap", "ReflectionMap", "RefractionMap"),
#( -- Blinn
 "AmbientMap", "DiffuseMap", "SpecularMap", "SpecularLevelMap", "GlossinessMap", "SelfIllumMap", "OpacityMap",
 "FilterMap", "BumpMap", "ReflectionMap", "RefractionMap", "DisplacementMap" ),
#( -- Metal
 "AmbientMap", "DiffuseMap", "SpecularMap", "SpecularLevelMap", "GlossinessMap", "SelfIllumMap", "OpacityMap",
 "FilterMap", "BumpMap", "ReflectionMap", "RefractionMap", "DisplacementMap" ),
#( -- Multi.Layer
 "AmbientMap", "DiffuseMap", "DiffuseLevelMap", "DiffuseRoughNessMap", "SpecularMap", "SpecularLevelMap", "GlossinessMap",
 "AnisotropyMap", "OrientationMap", "SpecularMap2", "SpecularLevelMap2", "GlossinessMap2", "AnisotropyMap2", "OrientationMap2",
  "SelfIllumMap", "OpacityMap", "FilterMap", "BumpMap", "ReflectionMap", "RefractionMap", "DisplacementMap" ),
#( -- Oren-Nayar-Blinn
 "AmbientMap", "DiffuseMap", "SpecularMap", "GlossinessMap", "SpecularLevelMap", "SelfIllumMap", "OpacityMap",
 "FilterMap", "DiffuseLevelMap", "DiffuseRoughNessMap", "BumpMap", "ReflectionMap", "RefractionMap", "DisplacementMap" ),
#( -- Phong
 "AmbientMap", "DiffuseMap", "SpecularMap", "SpecularLevelMap", "GlossinessMap", "SelfIllumMap", "OpacityMap", "FilterMap",
 "BumpMap", "ReflectionMap", "RefractionMap", "DisplacementMap" ),
#( -- Strauss
 "DiffuseMap", "GlossinessMap", "MetalnessMap", "OpacityMap", "FilterMap", "BumpMap", "ReflectionMap", "RefractionMap",
 "DisplacementMap" ),
#( -- Translucent
 "AmbientMap", "DiffuseMap", "SpecularMap", "GlossinessMap", "SpecularLevelMap", "SelfIllumMap", "OpacityMap", "FilterMap",
 "DiffuseLevel", "TranslucentColor", "BumpMap", "ReflectionMap", "RefractionMap", "DisplacementMap" )
)
global xmlFile_ShaderType = -- Tipos de shaders
#( "Anisotropico", "Blinn", "Metal", "Maulti-Layer", "Oren-Nayar-Blinn", "Phong", "Strauss", "Translucent" )

-- Exportar la escena
-- path : ruta del archivo en el que se exportaran los datos
-- savecerodata : indica si los valores cero se guardan en el archivo xml
fn MaxToXML path savecerodata =
(
-- Actualizar configuracion
xmlFile_SaveCeroData = savecerodata
-- Crear el archivo
xmlFile = createFile path
format "<?xml version=\"1.0\"?>\r\n" to: xmlFile
-- Nodo principal
nodeCreate "scene"
 nodeCreateClose "scene"
 -- Exportar los materiales
 exportMaterials()
 -- Exportar todos los nodos
 exportChildrens rootNode
nodeClose "scene"
-- Cerrar el archivo y dar por finalizada la exportacion
close xmlFile
)

-- Exportar los materiales
fn exportMaterials =
(
-- Agregar todos los materiales a la lista de materiales propia
xmlFile_Materials = #()
for node in geometry do
(
 if (getIndexOfMaterial node.material) == 0 then
  append xmlFile_Materials node.material
)
-- Si se agrego alguno exportarlos
if xmlFile_Materials.count > 0 then
(
 nodeCreate "materials" -- Crear nodo de materials
  nodeVar "count" xmlFile_Materials.count -- Número de materiales
  nodeCreateClose "materials"
  for n = 1 to xmlFile_Materials.count do
  (
   exportMaterial_One xmlFile_Materials[n]
  )
 nodeClose "materials"
)
)

-- Exportar un material y sus submateriales
fn exportMaterial_One material =
(
local classID = (classOf material)
nodeCreate "material" -- Material
 nodeVar "classID" (classOf material) -- classID
 if classID == Standardmaterial then
 (
  exportMaterial_Standardmaterial material
 )
nodeClose "material"
)

-- Exportar material
fn exportMaterial_Standardmaterial material =
(
nodeVar "name" material.name -- Nombre
nodeVar "shaderType" xmlFile_ShaderType[material.shaderType + 1]
nodeCreateClose "material"
local nindex = 1
for n = 1 to material.maps.count do
(
 if material.maps[n] != undefined then
 (
  nodeCreate "map"
   nodeVar "n" nindex
   nodeVar "type" xmlFile_MapChannels[material.shaderType + 1][n]
   nodeVar "name" material.maps[n].name
   nodeCreateClose "map"
  nodeClose "map"
  nindex = nindex +1
 )
)
)

-- Obtener un material indicado su handle (0 si no existe)
fn getIndexOfMaterial material =
(
for n = 1 to xmlFile_Materials.count do
(
 if xmlFile_Materials[n] == material then
 (
  -- Encontrado
  return n
 )
)
return 0
)

-- Exportar los hijos
fn exportChildrens node =
(
-- Guardar todos sus hijos si los tiene
if node.children.count > 0 then
(
 -- Crear nodo de los hijos
 nodeCreate "children"
  nodeVar "count" node.children.count -- Número de hijos de este nodo
  nodeCreateClose "children"
  for child in node.children do
  (
   -- Exportar el hijo indicado
   nodeCreate "node" -- Crear nodo
    -- Guardar datos genericos del nodo
    nodeVar "name" child.name -- Nombre
    nodeVar "pos.x" child.pos.x -- Posicion
    nodeVar "pos.y" child.pos.y
    nodeVar "pos.z" child.pos.z
    nodeVar "rotation.x" child.rotation.x -- Rotacion
    nodeVar "rotation.y" child.rotation.y
    nodeVar "rotation.z" child.rotation.z
    nodeVar "scale.x" child.scale.x -- Escala
    nodeVar "scale.y" child.scale.y
    nodeVar "scale.z" child.scale.z
    nodeCreateClose "node"
    -- Guardar datos de la malla
    exportMesh 0 child
    -- Exportar los hijos de este
    exportChildrens child
   nodeClose "node"
  )
 nodeClose "children"
)
)

-- Guardar datos de la malla
fn exportMesh time node =
(
-- Memorizar transformacion antigua de este nodo e indicar una nueva para destransformar los vertices
local old_transform = node.transform
local old_parent = node.parent
node.parent = $rootNode
node.transform = identity node.transform
-- Procesar
at time time mesh = snapShotAsMesh node
nodeCreate "mesh" -- Crear nodo de la malla
 nodeCreateclose "mesh"
 nodeCreate "verts" -- Crear nodo de los vertices
  nodeVar "count" mesh.numverts -- Número de vertices
  nodeCreateClose "verts"
  -- Exportar todos los vertices de esta malla
  for n = 1 to mesh.numverts do
  (
   nodeCreate "vertex"
   nodeVar "n" n
    nodeCreateClose "vertex"
    nodeCreate "position" -- Posicion
     local vertex = getVert mesh n
     nodeVar "x" vertex.x
     nodeVar "y" vertex.y
     nodeVar "z" vertex.z
     nodeCreateClose "position"
    nodeClose "position"
   nodeClose "vertex"
  )
 nodeClose "verts"
 nodeCreate "faces" -- Crear nodo de las caras
  nodeVar "count" mesh.faces.count -- Número de caras
  nodeCreateClose "faces"
  -- Exportar todas las caras
  for n = 1 to mesh.numfaces do
  (
   local face = getFace mesh n
   nodeCreate "face"
    nodeVar "n" n
    nodeVar "nmaterial" (getIndexOfMaterial node.material)
    nodeCreateClose "face"
    for i = 1 to 3 do -- Indices de la cara
    (
     nodeCreate "index"
      nodeVar xmlFile_ABC[i] (face[i] as integer) -- Exportar su indice de vertice
      if mesh.numtverts > 0 then
      (
       local vcoord = getTVFace mesh face[i] -- Exportar coordenadas de textura del vertice
       local coord = getTVert mesh vcoord[i]
       nodeVar "u" coord[1]
       nodeVar "v" coord[2]
       nodeVar "w" coord[3]
      )
      nodeCreateClose "index"
     nodeClose "index"
    )
    nodeCreate "normal" -- Normal de la cara
     local normal = getFaceNormal mesh n
     nodeVar "x" normal.x
     nodeVar "y" normal.y
     nodeVar "z" normal.z
     nodeCreateClose "normal"
    nodeClose "normal"
   nodeClose "face"
  )
 nodeClose "faces"  
nodeClose "mesh"
-- Restaurar la transformacion de este nodo
node.parent = old_parent
node.transform = old_transform
)

-- Abrir un nodo
fn nodeCreate tag =
(
format "<%" tag to: xmlFile
)

-- Guardar un nombre y valor del nodo
fn nodeVar name value =
(
if xmlFile_SaveCeroData == 0 then if value == 0 then return 0
format " %=\"%\"" name value to: xmlFile
)

-- Cerrar la apertura del nodo
fn nodeCreateClose tag =
(
format ">\r\n" to: xmlFile
)

-- Agregar tags como variables
fn nodeTagVar name value =
(
if xmlFile_SaveCeroData == 0 then if value == 0 then return 0
format "<%>%</%>\r\n" name value name to: xmlFile
)

-- Cerrar el nodo por completo
fn nodeClose tag =
(
format "</%>\r\n" tag to: xmlFile
)


-- Exportar toda la escena
MaxToXML "c:\pruebas.xml" 1


suerte

Ahuman

 
Cita de: "BeRSeRKeR"Esa función debería darte valores correctos. Es la que yo utilizaba antes, hasta que tuve que dar soporte a cualquier número de canales de mapeado (utilizando, entre otras funciones, meshOp.getMapVert). ¿Qué te lleva a pensar que te devuelve valores incorrectos?.

Saludos.
Efectivamente me da valores correctos como tu dices. Lo he probado con un cubo normalito y si exporta bien los valores. Ahora otra pregunta:

¿Para exportar los indices de los vertices que forman cada triangulo de cada cara que funcion utilizas?

BeRSeRKeR

Cita de: "Ahuman"¿Para exportar los indices de los vertices que forman cada triangulo de cada cara que funcion utilizas?
Utilizo getFace. En el código que ha puesto zupervaca puedes ver el procedimiento.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!






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.