Documente Academic
Documente Profesional
Documente Cultură
www.davidinlines.com
www.davidinlines.com
Segunda Parte ! ! ! ! ! ! ! ! ! ! ! ! ! 2.1 Funciones. 2.2 Crear comandos de transformacin. ! 2.2.1 Comando MOVER. ! 2.2.2 Comando ESCALAR. ! 2.2.3 Comando ROTAR. 2.3 Comandos para indicar propiedades. 2.4 Comandos para aadir modicadores. 2.5 Expresar animaciones. 2.6 Argumentos. Simplicar las funciones. 2.7 if... then... else. 2.8 Bucles. ! 2.8.1 Bucle For ! 2.8.2 Bucle While
www.davidinlines.com
Tercera Parte ! ! 3.1 Crear herramientas de entorno con MAXScript. ! 3.2 Mens contextuales de botn dercho. ! 3.3 Denicin de Macros. ! 3.4 Cmo crear un botn. ! ! 3.4.1 Cmo hacerlo operativo. ! 3.5 Aadir un contador deslizante. ! ! 3.5.1 Cmo hacerlo operativo. ! 3.6 Crear mensajes de error. ! 3.7 Crear cajas otantes. ! 3.8 Editor de visual MAXScript. ! 3.9 Herramienta Macro Recorder. ! 3.10 Comando Debugger Dialog. Cuarta parte ! Comandos y funciones ms importantes utilizados en este manual.
www.davidinlines.com
A. El manual
Este manual no esta preparado para formar a un programador de MAXScript con todo el sentido de la palabra, eso s, aprenderemos a entender y crear guiones que podr necesitar ms adelante: Cmo crear, abrir y ejecutar guiones. Crear guiones que generen y editen objetos. Crear funciones dentro de los guiones. Conocer que son las variables o argumentos y su efecto en una funcin. Conocer y aplicar condiciones o bucles. Crear animaciones de geometras y aadir modicadores. Crear utilidades personales operativas con persianas, paneles, botones y cajas otantes. Para poder seguirlo bien, es preferible tener unos mnimos conocimientos de programacin y conocer el funcionamiento del Autodesk 3ds Max, ya que el cdigo que aprenderemos, modica valores de objetos de dicho software. Toda la informacin de este manual esta sacada del libro "3ds Max 2012. Curso Avanzado" , Josep Molero Vera, Inforbook's, S.L. con algunas pequeas correciones. Si algo est mal desarrollado, por favor, envenme un correo a davidinlines@gmail.com para corregirlo. En mi blog personal www.davidinlines.wordpress.com he colgado algunos ejercicios y prcticas que salen en este manual.
www.davidinlines.com
B. MaxScript
MAXScript es un lenguaje de programacin orientado a objetos de 3ds Max y exclusivo de 3ds Max. El dominio de este lenguaje, se pueden conseguir grandes mejoras en al utilizacin de 3ds Max, las tareas de creacin y animacin pueden ser mucho ms ecientes gracias a las operaciones programadas con MAXScript, construir modelos que, "a mano" sera muy costoso, en cambio, con unas lneas de cdigo sencillo se pueden crear cosas complejas con geometras y animaciones. MAXSript Listener: Consta de un espacio mayor donde se escriben los "Scripts" de varias lneas, es la parte rosada; abajo est la ventana donde se muestra el resultado, por ejemplo, si en la parte rosada ponemos "2+2" abajo saldr "4". Mini Listener: Se encuentra en al parte inferior izquierda del 3ds Max y se utiliza igual que el MAXScript Listener.
www.davidinlines.com
Primera parte
1.1 Diferentes componentes de un script
Lnea escrita o Script: Objeto fundamental y evaluable del programa. Generalmente construido por elementos que pueden ser destinos, valores, constantes u otras lneas. Operador: Destino de operacin matemtica. Operando: Componente de una operacin. Argumento: Cualquier variable de una funcin. Factor: Elemento similar al operando, que forma parte de una expresin. Variable: Valor que se almacena en la memoria para su utilizacin posterior. Elemento de la lnea: Cualquier componente de la lnea. Destino: Generalmente sus componentes indican nombres de variables, matrices o funciones denidas por el programador. Expresin: Grupo de destinos que constituyen una operacin matemtica. Nmeros enteros: Valores numricos exactos. Nmeros reales: Valores numricos con coma otante. Cadenas: Son caracteres de texto entre comillas. Lista o Array: Serie ordenada de elementos o expresiones. Descriptores: Son ciertos caracteres que representan cheros. Comando: Es el destino cuyo nombre representa un comando del programa. Funcin: Es un destino de una funcin o comando creada por el programador. 1.1.1 Signos \ : Se utiliza para que una lnea ignore el nal de una expresin. ; : Separa expresiones dentro de una lnea. , : Separa expresiones en una Lista o Array, no es una coma otante para nmero real. . : Es la coma otante de un nmero real. Tambin es un punto de notacin entre un objeto con nombre y su parmetro. : Para comentarios aclaratorios, no se evala la lnea que lo contiene. # : Indica Lista o Array. $ : Identica el texto que sigue como el nombre de un objeto 3ds Max con nombre. Otros utilizados son: () . "
www.davidinlines.com
www.davidinlines.com
Para denir las coordenadas se utiliza el operando position y el valor de la posicin entre corchetes: <Nombre_variable>.position = [valor 1, valor 2, valor 3] micaja.position = [1, 2.0, 9]
www.davidinlines.com
local <destino> = <expr> global Micaja = box( ) local Micaja = box ( ) Las persistent global hace que la variable se salve al cerrar una escena y sea restituida al abrirla de nuevo.
www.davidinlines.com
Segunda parte
2.1 Funciones
La funcin es un pequeo guin o parte de un guin que puede ser evaluada y ejecutada para obtener un resultado. Function o fn<nombre_de_la_funcion> <parmetros> = <expr> Para funciones recurrentes, colocamos mapped en lugar de function o fn, que son funciones dentro de otras funciones y dentro de otras funciones tantas veces como se precise. function miFuncion= ( ) miFuncion ( ) Por ejemplos, queremos crear una funcin que haga Teteras de radio 30 y 4 segmentos: function CreaTeteras = ( ! Tetera = teapot radius:30 segments: 4 ) CreaTetera () (Sin espacio en el parntesis anterior)
10
www.davidinlines.com
2.2.3 Comando ROTAR Para rotar las guras, se adaptan los parmetros a la forma de especicar los ngulos en el espacio tridimensional, bajo el mtodo de Euler. 1. Se dene como variable un comando de rotacin de objeto. nombre_rotacion = eulerangles Ax Ay Az miRotacionEsfera = eulerangles 0 30 0 2. Cuando tenemos la variable denida: rotate nombre_de_variable nombre-rotacion rotate miesfera miRotacionEsfera
Normalmente siempre se trabaja con el Sistema de Coordenadas Universales (SCU), si necesitamos cambiar este, haremos lo siguiente: in coordsys <sistema especico> <nombre_rotacion> = eulerangles Ax Ay Az in coordsys local mirotacion = eulerangles 0 30 0 ! ! ! ! ! ! Los sistemas especcos son: in coordsys world si estaba en otro sistema y quiere volver al SCU. in coordsys local pasa al Sistema de Coordenadas Local. in coordsys parent pasa al Sistema de Coordenadas Ascendiente. in coordsys grid pasa al Sistema de Coordenadas de la Cuadrcula. in coordsys screen pasa al Sistema de Coordenadas de la Pantalla. in coordsys <node> pasa al Sistema de Coordenadas de Designar
11
www.davidinlines.com
IMPORTANTE: En este ejemplo, hemos utilizado el modicador Bend y solo estamos modicando el valor del ngulo, si lo que necesitamos es cambiar el el eje de giro (en X Y Z) debemos cambiar "angle" por "Axis": MiTetera.bend.axis = 0 para seleccionar el eje X MiTetera.bend.axis = 1 para seleccionar el eje Y MiTetera.bend.axis = 2 para seleccionar el eje Z Para activar alguna parte del modicador, por ejemplo el Limits, escribiremos: MiTetera.bend.limit = true para activarlos MiTetera.bend.limit = false para desacrivarlo. La mayora de modicadores trabajan as.
12
www.davidinlines.com
13
www.davidinlines.com
De esta manera, la funcin quedara as: function creamiSatelite unradio unaposicion = ( ! miSatelite = sphere () ! ! /*declaramos la variable miSatelite*/ ! miSatelite.radius = unradio! /*declaramos la variable un radio para ! ! ! ! ! ! ! ! colocar el valor del radio*/ ! miSatelite.position = posicion! /*Declaramos la variable deposicin para ! ! ! ! ! ! ! colocar el valor posicin [x y z]*/ ! ) ! ! ! /*llamamos a la funcin colocando los valores*/ creamisatelite 20 [0,80,0]! ! creamisatelite 10 [0,100,0]!! ! ! /*radio 20 y posicin [0,80,0]*/ /*radio 10 y posicion [0,100,0]*/
$box001.width=100!!
$box002.height=50! !
14
www.davidinlines.com
/*A es mayor que B, por lo tanto la anchura de la box001 pasa a 100 y la box002 permanece igual*/ Conceptos bsicos de igualdades y desigualdades: < menor que. > mayor que. <= menor o igual que. >= mayor o igual que. = igual que, siempre como asignacin de valor. == igual que, como comparacin entre valores. != no igual a o desigual.
2.8 Bucles
Se utilizan para realizar acciones repetitivas de forma automtica. Para MAXScript existen dos: For y While
15
www.davidinlines.com
28 29 30 OK Donde cada nmero es n. Ejemplo 2: La siguiente lnea va a crear varias repeticiones de un objeto sin necesidad de repetir cada vez la operacin: miTetera = teapot ( ) for n=1 to 3 do ( ! copiTetera = copy miTetera ! copiTetera.position = [n* 60, 0, 0] ) Nos crea 4 teteras en la empezando desde la posicin [0,0,0]. 2. <expr> to <expr> by <expr> : al introducir by, la <expr> que le sigue indica el valor de incremento de repeticin. Si aadimos al primer ejemplo (print n) by 2, nos queda: for n = 20 to 30 by 2 do print n Nos devuelve: 20 22 24 26 28 30 OK 3. where <expr> : si aade este comando a alguna de las variantes anteriores, establece una condicin cierta (true) o falta (false). Se evala al principio del bucle y se ejecuta si se cumple el true. El comando do, da la orden de evaluacin y ejecucin de la expresin o funcin que sigue y que es el objeto de la creacin del bucle. Tambin se puede utilizar el comando collect en vez de do, este comando acta igual que el do, pero adems crea una lista con todos los elementos devueltos. Coloquemos collect en el ejemplo anterior: for n = 20 to 30 by 2 collect print n 16
www.davidinlines.com
Nos devuelve: 20 22 24 26 28 30 #(20,22,24,26,28,30) Si aplicamos collect al ejemplo de las teteras, nos crear las teteras y adems nos crear una lista de la posicin de cada una: miTetera = teapot () for n=1 to 4 by 1 collect ( ! copiTetera = copy miTetera ! copiTetera.position = [n*60, 0, 0] ) Nos devuelve: La creacin de las teteras en diferentes posiciones y una lista con su posicin: #([60, 0,0], [120, 0, 0], [180, 0, 0], [240, 0, 0])
17
www.davidinlines.com
De forma automtica e ininterrumpida, nunca para hasta que se nalice de alguna forma.
18
www.davidinlines.com
Tercera parte
3.1 Crear herramientas de entorno con MAXScript (utilidades y persianas)
Los Scripts son cdigos de programacin que hacen ciertas cosas automatizadas, podemos crear un "botn" para activar ese Script directamente, para crearlo haremos: Utility <Nombre_variable> <"Cadena_literal"> ( button Cadena_literal "nombre_para_boton" ) utility botnTetera "Crear Tetera" ( ! button creaBotn "Tetera" ) Devuelve: Rollout:botnTetera Esto signica que nos "ha aceptado" crear el botn, vamos a Utilities en Panel de comandos de 3ds Max y abrimos MAXScript, all veremos en la persiana Utilities, que se nos ha creado el botn Crear Tetera, si lo seleccionamos, se nos abrir un men con el nombre Tetera, si pulsamos encima, no har nada porque no tiene ningun cdigo programado pero as se crea un botn para crear, por ejemplo, una tetera. Se pueden utilizar los elementos opcionales: rolledUp: <true o false> , silentErrors:<true o false>, newRolloutFloater (), Rollout para crear persianas individuales otantes y addrollout(), las puede introducir en otras.
19
www.davidinlines.com
macroScript <nombre_variable> category: <cadena_literal_macro> buttonText: <cadena_literal_botn> toolTip: <cadena_literal_herramienta> icon: #(<cadena_literal_icono>, <nmero_icono_a_utilizar>) o icon: <cadena_literal_icono> ! silentErrors: <true o false> ! (<cuerpo_de_la_macro>) Es aconsejable no utilizar esta sintaxis si no se tiene un buen conocimiento de MAXScript. Existen otras funcionalidad que pueden ser generadas mediante comandos o funciones MAXScript: ! ! ! ! ! Herramientas para pintar en entorno Painter Interface Guiones para Plug-ins Persianas de control ActiveX Dilogos Generacin dinmica de persianas
20
www.davidinlines.com
toolTip: <cadena_indicacion_operacion>, este comando crea una etiqueta de texto complementario, cuando nos colocamos encima sale un texto con lo que hemos apuntado en cadena_indicacion_operacion.
21
www.davidinlines.com
utility botnTetera "Crear Tetera" ( ! button creaBotn "Tetera" ! slider CDradio "Radio" range: [0,100,30] ! on creaBotn pressed do ! ( ! ! bot = teapot() ! ) )
22
www.davidinlines.com
El Script nuestro, da error si se intenta modicar el radio antes de crear la tetera, vamos a aadir un mensaje de error a nuestro botn de crear la Tetera: utility botnTetera "Crear Tetera" ( ! button creaBotn "Tetera" ! slider CDradio "Radio" range: [0,100,30] ! on creaBotn pressed do ! ( ! ! global bot = teapot() ! ) ! ! on CDradio changed valor do ! ! (! ! ! ! try ! ! ! bot.radius = valor ! ! ! catch ! ! ! messageBox "Pulse el botn Tetera y luego modique el radio, ! ! ! ! ! ! ! ! sin tetera no hay radio" ! ! ) ) Existe otra forma para evitar mensajes de error, mediante el comando enabled: false o Cdradio enabled: true, con esta funcin, est indicando que para posibilitar la utilizacin del deslizante, primero debe crear la tetera, si no es as, el deslizante queda inutilizado a la espera de pulsar el botn Tetera: utility botnTetera "Crear Tetera" ( ! button creaBotn "Tetera" ! slider CDradio "Radio" range: [0,100,30] ! enabled: false ! on creaBotn pressed do ! ( ! ! global bot = teapot() ! ! CDradio.enabled = true ! ) ! ! on CDradio changed valor do ! ! (! ! ! ! bot.radius = valor ! ! ) )
23
www.davidinlines.com
24
www.davidinlines.com
25
www.davidinlines.com
Cuarta Parte
Comandos y cdigos ms importantes utilizados en este manual
(Sintaxis + ejemplo) Entrar comandos <nombre del comando> () ----------------------------------------------------------------------------------------------------------------------teapot()
26
www.davidinlines.com
Variables globales y locales global <destino> = <expr> ----------------------------------------------------------------------------------------------------------------------global MiTetera = teapot() global <destino> = <expr> ----------------------------------------------------------------------------------------------------------------------global MiTetera = teapot ()
Construccin de Listas o Arrays #(<expr>,<expr>) ----------------------------------------------------------------------------------------------------------------------#(caja = box width:150 position:[0,0,100], esfera= sphere radius:15 position:[100,0,0])
Crear funciones function miFuncion= ( ) miFuncion ( ) ----------------------------------------------------------------------------------------------------------------------function CreaTeteras = ( ! Tetera = teapot radius:30 segments: 4 ) CreaTetera () (Sin espacio en el parntesis anterior)
27
www.davidinlines.com
Rotar 1. Se dene como variable un comando de rotacin de objeto. nombre_rotacion = eulerangles Ax Ay Az ----------------------------------------------------------------------------------------------------------------------miRotacionEsfera = eulerangles 0 30 0 2. Cuando tenemos la variable denida: rotate nombre_de_variable nombre-rotacion ----------------------------------------------------------------------------------------------------------------------rotate miesfera miRotacionEsfera
Modicar el eje de coordenadas in coordsys <sistema especico> <nombre_rotacion> = eulerangles Ax Ay Az ----------------------------------------------------------------------------------------------------------------------in coordsys local mirotacion = eulerangles 0 30 0
Aadir modicadores addmodier <nombre variable> (<nombre_modicador> <parametros>) ----------------------------------------------------------------------------------------------------------------------MiTetera = teapot radius: 30 Modicar el valor del modicador addmodier MiTetera (bend angle: 45) Modicar otro valor del modicador MiTetera.bend.axis = 0 (0 para X, 1 para Y, 2 para Z)
28
www.davidinlines.com
Expresar animaciones animate on ( at time tiempo_fotograma_inicio (nombre_variable.parametros>) at time tiempo_fotograma_nal (nombre_variable.<parametros>) ) ----------------------------------------------------------------------------------------------------------------------tetera = teapot () animate on ( at time 0 (tetera.pos = [-80,0,0]; tetera.scale = [1,1,1.5]) at time 50 (tetera.pos = [80,50,0]; tetera.scale = [1,8,1.5]) at time 100 (tetera.pos = [-80,0,0]; tetera.scale = [1,1,1.5]) )
Argumentos. Simplicar las funciones function creamiSatelite unradio unaposicion = ( ) creamisatelite <valor radio> <valor posicion> unradio y unaposicion serian nombres de argumentos de una nica variable creamitetera: ----------------------------------------------------------------------------------------------------------------------miSatelite.radius = unradio miSatelite.position = unaposicion function creamiSatelite unradio unaposicion = ! ( ! ! miSatelite = sphere () ! ! ! ! miSatelite.radius = unradio ! ! ! ! ! ! ! ! ! ! miSatelite.position = posicion! ! ! ! ! ! ! ! ! ) ! ! !
/*declaramos la variable miSatelite*/ /*declaramos la variable un radio para ! ! colocar el valor del radio*/ /*Declaramos la variable de posicin para ! colocar el valor posicin [x y z]*/
/*llamamos a la funcin colocando los valores*/ creamisatelite 20 [0,80,0]! ! creamisatelite 10 [0,100,0]!! ! ! /*radio 20 y posicin [0,80,0]*/ /*radio 10 y posicion [0,100,0]*/
29
www.davidinlines.com
Bucle if if <condicin> then ( ! <accin true> ) else ( ! <accin false> ) ----------------------------------------------------------------------------------------------------------------------A= 60 B=50 micaja1 = box length : A micaja2= box length : B if A>B then ! ! ! ! ! ! ( ! ! $box001.width=100 !! ! ) else ! ( ! ! $box002.height=50 ! ! ! ) /*Verica si A es mayor que B*/ /*se ejecuta si A es mayor que B*/
Bucle for for <nombre_variable> in o = <secuencia> do o collet ! ( ! ! <expr> ! ) ----------------------------------------------------------------------------------------------------------------------Ejemplo 1: miTetera = teapot ( ) for n=1 to 3 do ( ! copiTetera = copy miTetera ! copiTetera.position = [n* 60, 0, 0] )
30
www.davidinlines.com
----------------------------------------------------------------------------------------------------------------------Ejemplo 2: Con by miTetera = teapot () for n=1 to 4 by 1 collect ( ! copiTetera = copy miTetera ! copiTetera.position = [n*60, 0, 0] ) ----------------------------------------------------------------------------------------------------------------------Ejemplo 3: Con collect miTetera = teapot () for n=1 to 4 by 1 collect ( ! copiTetera = copy miTetera ! copiTetera.position = [n*60, 0, 0] )
Bucle while do <expr> while <expr> ----------------------------------------------------------------------------------------------------------------------1. a=2 while a>0 do print "cierto" La funcin devuelve: cierto cierto cierto ... De forma automtica e ininterrumpida, nunca para hasta que se nalice de alguna forma. ----------------------------------------------------------------------------------------------------------------------Ejemplo 2 a=2 while a<0 do print "cierto" Devuelve: undened.
31
www.davidinlines.com
Crear un botn Utility <Nombre_variable> <"Cadena_literal"> ( button Cadena_literal "nombre_para_boton" ) ----------------------------------------------------------------------------------------------------------------------utility botnTetera "Crear Tetera" ( ! button creaBotn "Tetera" ) Devuelve: Rollout:botnTetera ! ! Hacerlo operativo on <nombre_variable> pressed do ( accin ) ----------------------------------------------------------------------------------------------------------------------utility botnTetera "Crear Tetera" ( ! button creaBotn "Tetera" ! on creaBotn pressed do ! ( ! ! bot = teapot() ! ) ) Crear un deslizador slider <nombre_variable> <"cadena_literal"> range [min,max,valor] ----------------------------------------------------------------------------------------------------------------------slider CDradio "radio" range: [0, 100, 30] Aplicado---------------------------------------------------------------------------------------------------------! utility botnTetera "Crear Tetera" ( ! button creaBotn "Tetera" ! slider CDradio "Radio" range: [0,100,30] ! on creaBotn pressed do ! ( ! ! bot = teapot() ! ) )
32
www.davidinlines.com
! !
Hacerlo operativo on <nombre_variable_slider> changed <argumento> do ( ! expresin propiedad ) ----------------------------------------------------------------------------------------------------------------------utility botnTetera "Crear Tetera" ( ! button creaBotn "Tetera" ! slider CDradio "Radio" range: [0,100,30] ! on creaBotn pressed do ! ( ! ! global bot = teapot() ! ) ! ! on CDradio changed valor do ! ! (! ! ! ! bot.radius = valor ! ! ) )
Crear mensajes de error try <expresin_referida> catch messageBox <cadena_de_error> ----------------------------------------------------------------------------------------------------------------------Ejemplo 1: ! ( ! ! ! ! ! ! ! ! ! ! ! ! ! ! ) utility botnTetera "Crear Tetera" button creaBotn "Tetera" slider CDradio "Radio" range: [0,100,30] on creaBotn pressed do ( ! global bot = teapot() ) ! on CDradio changed valor do ! (! ! ! try ! ! bot.radius = valor ! ! catch ! ! messageBox "Pulse el botn Tetera y luego modique el radio, ! ! ! ! ! ! ! sin tetera no hay radio" ! )
33
www.davidinlines.com
----------------------------------------------------------------------------------------------------------------------Ejemplo 2: utility botnTetera "Crear Tetera" ( ! button creaBotn "Tetera" ! slider CDradio "Radio" range: [0,100,30] ! enabled: false ! on creaBotn pressed do ! ( ! ! global bot = teapot() ! ! CDradio.enabled = true ! ) ! ! on CDradio changed valor do ! ! (! ! ! ! bot.radius = valor ! ! ) )
34
www.davidinlines.com
A la hora de programar, debe tener cuidado en cualquier tipo de error, ya que este, podra ocasionar un problema al Script y dejarlo sin funcionar por un simple error diminuto; estas precauciones no solo debe tomarlas para programar en MAXScript, sino, en todos los lenguajes de programacin, debemos tener en cuenta unas pautas: Utilizar encabezamientos denitorios del guin Ideas claras en las operaciones que ha de realizar el guin. Es bueno realizar un pseudocodigo en papel antes de llevarlo a MAXScript. No denir las variables con letras o palabras indenidas, elija palabras que sean signicativas de la funcin para una mejor comprensin del depurado. Es buena costumbre aadir comentarios en la mayora de lneas para saber que est haciendo. Reconocer perfectamente el mbito de las variables para saber claramente cundo han de usarse las variables globales. Sangrar las lneas de manera que los parntesis queden de forma ordenada en las columnas. Y horas, pase horas y horas para disfrutar de este lenguaje de programacin para 3ds Max y hacer cosas automticas con unas lneas de cdigo. La web www.scriptspot.com es una buena web para descargar scripts programados en MAXScript, ver como funcionan y como estn hechos.
35