Hola a todos.
Tengo hecho un Script en Max que saca la informacion de la malla con la que estes trabajando. Te saca la geometria, las coordenadas de textura y la lista de las texturas usadas en la escena. Pero despues de recorrerme toda la ayuda de MaxScript no consigo encontrar ninguna funcion que me diga que material esta usando cada una de las caras de la malla.
¿Alguna idea?
Gracias a todos ;)
Hola:
Iria bien que dijeses la version de MAX que usas. En cualquier caso, te digo como se puede hacer en la 3.1:
Existe una funcion que se llama "getFaceMatId" a la cual le pasas la malla ( tiene que ser EditableMesh, evidentemente ) y el indice de la cara que quieres mirar. Esta te devuelve un integer que es el id del material que esta usando.
Di algo si te sirve :)
Un saludote!
La version de MAX que uso es la 5. Probe esa funcion pero me daba un numero distinto por cada dos triangulos de los que sacaba los datos.
Para manejar la malla lo que hago en el script es hacer una copia( un snapshot o algo asi :P ) y trabajar con ella en lugar del original. ¿Existe algun problema al usar la funcion que dices y una copia de la malla con este metodo?.
Pues que yo sepa no hay ningun problema en trabajar con una copia. He de decirte que no se como va lo que tu quieres; lo mire ayer para contestarte. Haz una prueba con una caja y le endosas solo un material. Una vez tengas esto, intenta utilizar la funcion que te dije.
Ahora que me acuerdo, cuando exportaba un ASE, a veces me decia que una cara estaba usando un material que no existia ( !! ) y me jode un monton. Quizas vaya por ahi la cosa, no se...
Y segui investigando sobre tu duda y tambien encontre como sacar las propiedades de un material ( si es que no lo sabes ya ).
Tienes un array global de materiales que se llama "meditMaterials". En teoria, la funcion de ayer ( getFaceMatId o algo asi ) te devuelve un indice sobre ese array. Y luego puedes acceder a las texturas del material, utilizando algo como esto: meditMaterials[ i ].maps, donde "maps" es otro array. Los indices de este ultimo array van por el orden en el que se encuentran en el editor de materiales. Es decir, el indice 2 es la textura difusa ;)
Y nada mas. Solo recordarte que yo todo esto lo hago para el MAX 3.1, no para el 5, y es muy posible que hayan cambiado muchas cosas.
Un saludote!
Pues que yo sepa no hay ningun problema en trabajar con una copia. He de decirte que no se como va lo que tu quieres; lo mire ayer para contestarte. Haz una prueba con una caja y le endosas solo un material. Una vez tengas esto, intenta utilizar la funcion que te dije.
Ahora que me acuerdo, cuando exportaba un ASE, a veces me decia que una cara estaba usando un material que no existia ( !! ) y me jode un monton. Quizas vaya por ahi la cosa, no se...
Y segui investigando sobre tu duda y tambien encontre como sacar las propiedades de un material ( si es que no lo sabes ya ).
Tienes un array global de materiales que se llama "meditMaterials". En teoria, la funcion de ayer ( getFaceMatId o algo asi ) te devuelve un indice sobre ese array. Y luego puedes acceder a las texturas del material, utilizando algo como esto: meditMaterials[ i ].maps, donde "maps" es otro array. Los indices de este ultimo array van por el orden en el que se encuentran en el editor de materiales. Es decir, el indice 2 es la textura difusa ;)
Y nada mas. Solo recordarte que yo todo esto lo hago para el MAX 3.1, no para el 5, y es muy posible que hayan cambiado muchas cosas.
Un saludote!
Pues que yo sepa no hay ningun problema en trabajar con una copia. He de decirte que no se como va lo que tu quieres; lo mire ayer para contestarte. Haz una prueba con una caja y le endosas solo un material. Una vez tengas esto, intenta utilizar la funcion que te dije.
Ahora que me acuerdo, cuando exportaba un ASE, a veces me decia que una cara estaba usando un material que no existia ( !! ) y me jode un monton. Quizas vaya por ahi la cosa, no se...
Y segui investigando sobre tu duda y tambien encontre como sacar las propiedades de un material ( si es que no lo sabes ya ).
Tienes un array global de materiales que se llama "meditMaterials". En teoria, la funcion de ayer ( getFaceMatId o algo asi ) te devuelve un indice sobre ese array. Y luego puedes acceder a las texturas del material, utilizando algo como esto: meditMaterials[ i ].maps, donde "maps" es otro array. Los indices de este ultimo array van por el orden en el que se encuentran en el editor de materiales. Es decir, el indice 2 es la textura difusa ;)
Y nada mas. Solo recordarte que yo todo esto lo hago para el MAX 3.1, no para el 5, y es muy posible que hayan cambiado muchas cosas.
Un saludote!
Pues que yo sepa no hay ningun problema en trabajar con una copia. He de decirte que no se como va lo que tu quieres; lo mire ayer para contestarte. Haz una prueba con una caja y le endosas solo un material. Una vez tengas esto, intenta utilizar la funcion que te dije.
Ahora que me acuerdo, cuando exportaba un ASE, a veces me decia que una cara estaba usando un material que no existia ( !! ) y me jode un monton. Quizas vaya por ahi la cosa, no se...
Y segui investigando sobre tu duda y tambien encontre como sacar las propiedades de un material ( si es que no lo sabes ya ).
Tienes un array global de materiales que se llama "meditMaterials". En teoria, la funcion de ayer ( getFaceMatId o algo asi ) te devuelve un indice sobre ese array. Y luego puedes acceder a las texturas del material, utilizando algo como esto: meditMaterials[ i ].maps, donde "maps" es otro array. Los indices de este ultimo array van por el orden en el que se encuentran en el editor de materiales. Es decir, el indice 2 es la textura difusa ;)
Y nada mas. Solo recordarte que yo todo esto lo hago para el MAX 3.1, no para el 5, y es muy posible que hayan cambiado muchas cosas.
Un saludote!
Ok, consultare en el array que dices. Yo hasta ahora usaba el array que te dice los materiales que has usado en la escena, no los que tienes en el editor de materiales.
Voy a probar a ver que valores me devuelve con el array que tiene los elementos del editor de materiales, a ver que me dice :P.
Cuando hice la prueba que me dices me daba algo parecido a estos:
Las 2 primeras caras: Material1
Las 2 siguientes caras: Material2
Las 2 siguientes caras: Material3
...
asi todo el rato.
No se si seria lo que te pasaba a ti.
Un saludo ;)
¿Te has quedado dormido sobre la tecla de enviar? :ojo:
Mmmm se ha rayao solo creo yo :D un poco mas y se contesta el mismo !! xD
ei eiiiii se siente! No se que le ha pasado a esto. No puedo borrar posts, verdad? ^_^
Sobre lo del MaxScript, yo lo he probado ( por encima ) y me funciona bien lo de los materiales. Tampoco tengo mucha experiencia con MaxScript, asi que no me hagas demasiado caso.
Si consigues algo, dimelo, ya sabes :)
Un saludote!
Lo de tantos post no pasa nada, asi parece que tiene vida este Topic :).
Esta tarde cuando termine el curro probare lo de los materiales y os informare sobre los posibles descubrimientos :P.
0ki! Espero que lo consigas!
He estado viendo los tutoriales de MaxScript, y he visto que en sus ejemplos la funcion getFaceMatID saca un numero identificativo de material por cada cara.
A lo mejor habia entendido mal el uso de esta funcion. Pensaba que getFaceMatID deberia devolverme siempre 1 por ejemplo si solo he usado un material.
¿Me equivoco?.
Ah!! No no. Claro, en teoria te devuelve el identificador del material que esta usando esa cara, no cuantos materiales usas. Te devuelve directamente un indice al array que te comente el otro dia, el meditMaterials creo que se llama.
Coñ... pero ahora que lo dices... si la cara tiene 2 materiales o mas... como te enteras? x(
Claro, el problema es que en teoria deberia ser como tu dices ( seria lo mas logico :P ), pero el caso es que para cada cara del cubo me devuelve un indice distinto, con lo que me veo que tengo 6 indices para 1 solo material.
Me veo exportando la geometria y las texturas unicamente y asignandolas a mano :I
x( joper, cagonlaleche... pues esta misma noche ( o si no mañana :b ) me pongo a programar un exportador de malla en MaxScript! Mañana o pasado te digo algo.
Si consigues algo, ya sabes :)
Hola Ghost!
Bueno, creo que algo he conseguido.
Realmente la funcion getFaceMatID funciona como te habia dicho; el problema viene por otro motivo.
He creado una caja, le he dado coordenadas de textura, la he pasado a EditableMesh, he creado un material con un mapa difuso y se lo he asignado a la malla creada.
Haciendo el script, me he encontrado con lo que me habias dicho: cada 2 caras, cambia el material. Pero esto no quiere decir que la funcion getFaceMatID devuelva valores que no son; los devuelve bien. Si editas la malla en modo "cara" y vas seleccionando una a una las caras de la caja, podras comprobar que cada lado de la caja ( 2 triangulos ) tienen un material distinto que van del 1 al 6 ( uno por lado de la caja ). Parece que es problema del MAX, o de nosotros, que no sabemos asignar materiales ;)
Para reafirmar nuestra inocencia ( :b ) he exportado esa misma cajita en formato ASE y cual ha sido mi sorpresa ( tono ironico ) que, efectivamente, cada 2 caras tenian un material distinto.
En fin, que no he encontrado la solucion, pero creo que si el problema. Si hay por ahi alguien que sepa el porque pasa esto, seria de gran utilidad, almenos para nosotros 2 ;b
Un saludote!