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:
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.
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
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?
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.