empezar maxscript

35
Empezar con MAXScript David Inlines 3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s Tutorial de inicio de MAXScript www.davidinlines.com 3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 1

Upload: david-inlines

Post on 14-Feb-2015

1.981 views

Category:

Documents


18 download

TRANSCRIPT

Page 1: Empezar MAXScript

Empezar con MAXScriptDavid Inlines

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 1

Page 2: Empezar MAXScript

Empezar con MAXScript

A. El manualB. MAXScript

Primera parte

! 1.1 Diferentes componentes de un Script! ! 1.1.1 Signos! 1.2 Funciones en MAXScrpit.! 1.3 Construccion de Listas o Arrays.! 1.4 Entrar Comandos.! 1.5 Identificación de objetos y modificación de parámetros.! 1.6 Variables y métodos para asignarlas.! 1.7 Asignar Accesos! 1.8 Variables globales y locales.! 1.9 Listas o Arrays! ! 1.9.1 Lista o Array cerrada.! ! 1.9.2 Lista o Array abierta.! 1.10 Operaciones y operandos.

Segunda Parte

! 2.1 Funciones.! 2.2 Crear comandos de transformación.! ! 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 añadir modificadores.! 2.5 Expresar animaciones.! 2.6 Argumentos. Simplificar las funciones.! 2.7 if... then... else.! 2.8 Bucles.! ! 2.8.1 Bucle For! ! 2.8.2 Bucle While

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 2

Page 3: Empezar MAXScript

Tercera Parte!! 3.1 Crear herramientas de entorno con MAXScript.! 3.2 Menús contextuales de botón dercho.! 3.3 Definición de Macros.! 3.4 Cómo crear un botón.! ! 3.4.1 Cómo hacerlo operativo.! 3.5 Añadir un contador deslizante.! ! 3.5.1 Cómo hacerlo operativo.! 3.6 Crear mensajes de error.! 3.7 Crear cajas flotantes.! 3.8 Editor de visual MAXScript.! 3.9 Herramienta Macro Recorder.! 3.10 Comando Debugger Dialog.

Cuarta parte

! Comandos y funciones más importantes utilizados en este manual.

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 3

Page 4: Empezar MAXScript

A. El manualEste 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 más adelante:

· Cómo 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 función.· Conocer y aplicar condiciones o bucles.· Crear animaciones de geometrías y añadir modificadores.· Crear utilidades personales operativas con persianas, paneles, botones y cajas flotantes.

Para poder seguirlo bien, es preferible tener unos mínimos conocimientos de programación y conocer el funcionamiento del Autodesk 3ds Max, ya que el código que aprenderemos, modifica valores de objetos de dicho software.

Toda la información de este manual esta sacada del libro "3ds Max 2012. Curso Avanzado" , Josep Molero Vera, Inforbook's, S.L. con algunas pequeñas correciones.Si algo está mal desarrollado, por favor, envíenme un correo a [email protected] para corregirlo.

En mi blog personal www.davidinlines.wordpress.com he colgado algunos ejercicios y prácticas que salen en este manual.

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 4

Page 5: Empezar MAXScript

B. MaxScript

MAXScript es un lenguaje de programación orientado a objetos de 3ds Max y exclusivo de 3ds Max.El dominio de este lenguaje, se pueden conseguir grandes mejoras en al utilización de 3ds Max, las tareas de creación y animación pueden ser mucho más eficientes gracias a las operaciones programadas con MAXScript, construir modelos que, "a mano" sería muy costoso, en cambio, con unas líneas de código sencillo se pueden crear cosas complejas con geometrías y animaciones.

MAXSript Listener: Consta de un espacio mayor donde se escriben los "Scripts" de varias líneas, 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.

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 5

Page 6: Empezar MAXScript

Primera parte1.1 Diferentes componentes de un script

· Línea escrita o Script: Objeto fundamental y evaluable del programa. Generalmente construido por elementos que pueden ser destinos, valores, constantes u otras líneas.· Operador: Destino de operación matemática.· Operando: Componente de una operación.· Argumento: Cualquier variable de una función.· Factor: Elemento similar al operando, que forma parte de una expresión.· Variable: Valor que se almacena en la memoria para su utilización posterior.· Elemento de la línea: Cualquier componente de la línea.· Destino: Generalmente sus componentes indican nombres de variables, matrices o funciones definidas por el programador. · Expresión: Grupo de destinos que constituyen una operación matemática.· Números enteros: Valores numéricos exactos.· Números reales: Valores numéricos con coma flotante.· Cadenas: Son caracteres de texto entre comillas.· Lista o Array: Serie ordenada de elementos o expresiones.· Descriptores: Son ciertos caracteres que representan ficheros.· Comando: Es el destino cuyo nombre representa un comando del programa.· Función: Es un destino de una función o comando creada por el programador.

1.1.1 Signos\ : Se utiliza para que una línea ignore el final de una expresión.; : Separa expresiones dentro de una línea., : Separa expresiones en una Lista o Array, no es una coma flotante para número real.. : Es la coma flotante de un número real. También es un punto de notación entre un objeto con nombre y su parámetro.– : Para comentarios aclaratorios, no se evalúa la línea que lo contiene.

# : Indica Lista o Array.$ : Identifica el texto que sigue como el nombre de un objeto 3ds Max con nombre.Otros utilizados son: () . ´ "

1.2 Funciones en MAXScript

Como se ha nombrado más arriba, si en la parte rosada del Listener ponemos cualquier suma, en la parte inferior nos devolverá el resultado:

1+2 devuelve 31.1 + 2.2 devuelve 3.3 (ojo on el . y no la ,)1.1 + 2 devuelvr 3.1

Para escribir texto, lo deberemos poner entre comillas:"Hola" devuelve "Hola"

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 6

Page 7: Empezar MAXScript

1.3 Construccion de Listas o Arrays

#(<expr>,<expr>)

#(2.2 + 3 , 3.3 + 4) Devuelve #(5.2 , 7.3)

El valos <expr> puede estar construido por números enteros, reales, expresiones y cadenas sin limitación de elementos.

1.4 Entrar comandos<nombre del comando> ( )

torus ( ) + intro devuelve un toroide en el viewport llamado "Torus001"

1.5 Identificación de objetos y modificación de parámetros

$<nombre del objeto>.<parámetro del objeto> = valor$Torus001.segments = 60 - Aumenta el valor de segmentos a 60

$Torus001.sides = 40 - Aumenta el valor de sides a 40.$Torus001.Radius1 = 20 - Aumenta el valor del radio 1 a 20.

1.6 Variables y métodos para asignarlas

<destino> = <expr>Minombre = "este es mi nombre"

david = "inlines" - devuelve inlinesA = 2 - devuelve 2

B = 5C = #(A+B) devuelve #7

D = #(A + B, A * B) devuelve #(7,10)Micaja = box() - asigna un objeto a una variable

A partir de ahora, cada vez que escriba Minombre en el Listener, le devolverá "Este es mi nombre", esto significa que a la variable Minombre se le ha asignado "Este es mi nombre", así con todas las variables asignadas.

- A la hora de asignar variables, no existe diferencia entre mayúsculas y minúsculas. - También se pueden asignar otros correspondientes a objetos o parámetros de 3ds max, por ejemplo colores, nombres de objetos, parámetros de dimensión, etc.- No se pueden utilizar números enteros ni reales para representar nombres de variables.- Solo se utilizará el punto . para separar el nombre del objeto de su parámetro.

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 7

Page 8: Empezar MAXScript

1.7 Asignar accesos

Es una construcción que permite introducirse en los componentes de objetos y valores compuestos, mediante operandos de propiedades de un objeto o indexar una Lista o Array.

<nombre_variable> . <operando>

Micaja.length = 50Micaja.width = 10Micaja.height = 15

Cada vez que pulsamos intro, "Micaja"se actualiza.

Si hemos creado muchas variables, podemos ver las propiedades esribiendo showProperties <elemento> por ejemplo showProperties Micaja, nos devolverá:

showProperties ()! .height : float! .length ; foat! .lengthsegs : integer! .width : float! .widthsegs : integer! .mapcoords : boolean! .heightsegs : integer! .realWorldMapSize : boolean false

Esto es un listado de propiedades del objeto al que corresponde la variable y a su derecha el tipo de dato que precisa.

· Float: dato de coma flotante· Integer: dato de número entero· Booblean: True o False, también On/Off· String: cadena entre comillas " ".

Para definir las coordenadas se utiliza el operando position y el valor de la posición entre corchetes:

<Nombre_variable>.position = [valor 1, valor 2, valor 3]micaja.position = [1, 2.0, 9]

1.8 Variables globales y localesLas variables globales son variables que quedan memorizadas mientras no se cierre el programa.Las variables locales son aquellas son aquellas que se almacenan en la memora de forma temporal mientras el script esté en funcionamiento; las variables son locales si no se le indica ningún ámbito.

global <destino> = <expr>

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 8

Page 9: Empezar MAXScript

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.

1.9 Listas o ArraysEs una serie ordenada de variables almacenadas bajo un mismo nombre, es una gran variables dividida en partes denominada Elemento.

1.9.1 Lista o array cerrada: #(<expr> (, <expr>))

#(2, 5, 7, 25) devuelve #(2, 5, 7, 25)b = 12 devuelve 12x = 60 devuelve 60# (13, "array", cos x, #(b + 2*10.0)) devuelve #(13, <<array>>, 0.5, #(32.0))

1.9.2. Lista o array abierta: #( )Los elementos de la lista se añaden uno a uno entre corchetes.

MiLista = # () devuelve #( )MiLista [1] = "casa" devuelve "casa"MiLista [2] = 125 devuelve 125MiLista [3] = 2 devuelve 2MiLista [4] = 3 devuelve 3MiLista devuelve #("casa", 125, 2, 3)

1.10 Operaciones y operadores

Son operaciones matemáticas simples.+ - * / , ^ sin x, cos x, pi...Random x y devuelve un número que esté entre X e Y Random 10 20 puede devolver 19 o 15Los Contadores o Incrementales son incrementos determinados por i = i + 1 puediendo sustiruis el + por cualquier otro operador (+ - * / , ^ sin x, cos x, pi,...).

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 9

Page 10: Empezar MAXScript

Segunda parte

2.1 FuncionesLa función es un pequeño guión o parte de un guión que puede ser evaluada y ejecutada para obtener un resultado.Function o fn<nombre_de_la_funcion> <parámetros> = <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 función que haga Teteras de radio 30 y 4 segmentos:

function CreaTeteras = ( ! Tetera = teapot radius:30 segments: 4)

CreaTetera () (Sin espacio en el paréntesis anterior)

2.2 Crear comandos de transformación

2.2.1 Comando MOVERmove nombre_de_variable [<x,y,z>]

move miesfera [70,70,0]

Con este comando hemos desplazado la esfera 70 unidades en X y en Y, en Z 0.

2.2.2 Comando ESCALARscale nombre_variable [<Sx,Sy,Sz>]

Scale miesfera [2,2,1]

En el eje X e Y se ha escalado por dos en el Z se queda igual (1=igual)

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 10

Page 11: Empezar MAXScript

2.2.3 Comando ROTAR

Para rotar las figuras, se adaptan los parámetros a la forma de especificar los ángulos en el espacio tridimensional, bajo el método de Euler.

1. Se define como variable un comando de rotación de objeto.

nombre_rotacion = eulerangles Ax Ay Az

miRotacionEsfera = eulerangles 0 30 0

2. Cuando tenemos la variable definida: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 especifico> <nombre_rotacion> = eulerangles Ax Ay Az

in coordsys local mirotacion = eulerangles 0 30 0

Los sistemas específicos 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 Cuadrícula.! · in coordsys screen pasa al Sistema de Coordenadas de la Pantalla.! · in coordsys <node> pasa al Sistema de Coordenadas de Designar

2.3 Comandos para indicar propiedadesSe trata de activar (true) o desactivar (false) propiedades de la figura y cambiar valores, por ejemplo:miesfera.segments = 8miesfera.radius = 40miesfera.smooth = falsemiesfera.mapcoords = true

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 11

Page 12: Empezar MAXScript

2.4 Comandos para añadir modificadores

Un aspecto muy importante es la asignación de modificadores mediante código, se añaden mediante el comando addmodifier, bastante lógico:

addmodifier <nombre variable> (<nombre_modificador> <parametros>)

MiTetera = teapot radius: 30addmodifier MiTetera (bend angle: 45)

Si queremos añadirle otro modificador igual o diferente, solo debemos ponerlo debajo del otro:

MiTetera = teapot radius: 30addmodifier MiTetera (bend angle: 45)addmodifier MiTetera (bend angle: 90)

Para poder modificar el valor de algún parámetro, es igual que la forma anteriormente explicada:

nombre_variable.comando_modificador.propiedad = valorMiTetera.bend.angle=60

IMPORTANTE: En este ejemplo, hemos utilizado el modificador Bend y solo estamos modificando 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 XMiTetera.bend.axis = 1 para seleccionar el eje YMiTetera.bend.axis = 2 para seleccionar el eje ZPara activar alguna parte del modificador, por ejemplo el Limits, escribiremos:MiTetera.bend.limit = true para activarlosMiTetera.bend.limit = false para desacrivarlo.

La mayoría de modificadores trabajan así.

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 12

Page 13: Empezar MAXScript

2.5 Expresar animacionesTodo lo programado anteriormente, se puede animar con una serie de comandos:

animate on(at time tiempo_fotograma_inicio (nombre_variable.parametros>)at time tiempo_fotograma_final (nombre_variable.<parametros>))

Un ejemplo de una tetera en reposo y se va escalando hasta el fotograma 50 y vuelve a su posición y escala inicial:

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]))

MAXScript da por definido en tiempo_fotogramas el número de fotogramas, para cambiar esta unidad utilizaremos las siguientes formas:

· s para indicar la unidad de segundos.· f para indicar el número de fotogramas.· t para "tick" unidad de resolución de tiempo, equivalente a 1/4800 de segundo.· m para indicar la unidad de minutos.

2.6 Argumentos. Simplificar las funcionesSe utilizan para no hacer eterno el trabajo de crear una función por cada elemento, por ejemplo, si queremos hacer 20 elementos o más, deberemos utilizar los Argumentos para simplificar el tiempo y el trabajo, asignamos unos argumentos a una función y a las restantes solo habrá que modificar pocos valores:

La función es:function creamiSatelite unradio unaposicion = ()creamisatelite <valor radio> <valor posicion>

unradio y unaposicion serian nombres de argumentos de una única variable creamitetera:

miSatelite.radius = unradiomiSatelite.position = unaposicion

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 13

Page 14: Empezar MAXScript

De esta manera, la función quedaría 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 deposición para ! ! ! ! ! ! ! colocar el valor posición [x y z]*/! )

! /*llamamos a la función colocando los valores*/

! creamisatelite 20 [0,80,0]! ! ! /*radio 20 y posición [0,80,0]*/! creamisatelite 10 [0,100,0]!! ! /*radio 10 y posicion [0,100,0]*/

2.7 if... then... else

En programación, la secuencia if evalúa la expresión indicada como condición y si el resultado es cierto (true) pasa a evaluar la sieguiente función then.Por lo contrario, si el resultado es falso (false), pasaría a evaluar la otra función else:

if <condición> then(! <acción true>)else(! <acción false>)

Ejemplo:

A= 60B=50

micaja1 = box length : Amicaja2= box length : B

if A>B then! ! ! ! ! /*Verifica si A es mayor que B*/! (! ! $box001.width=100!! /*se ejecuta si A es mayor que B*/! )else! (! ! $box002.height=50! ! /*Si no, cambia la altura caja02*/! )

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 14

Page 15: Empezar MAXScript

/*A es mayor que B, por lo tanto la anchura de la box001 pasa a 100 y la box002 permanece igual*/

Conceptos básicos de igualdades y desigualdades:< menor que.> mayor que.<= menor o igual que.>= mayor o igual que.= igual que, siempre como asignación de valor.== igual que, como comparación entre valores.!= no igual a o desigual.

2.8 Bucles

Se utilizan para realizar acciones repetitivas de forma automática.Para MAXScript existen dos: For y While

2.8.1 Bucle ForEs un tipo de bucle muy representativo y utilizado en repeticiones de todo tipo:

for <nombre_variable> in o = <secuencia> do o collet! (! ! <expr>! )

La expresión <secuencia> se puede representar de varias formas:

1. <expr> to <expr> : esta estructura indica que las repeticiones se producen entre las dos <expr>, siendo el incremento de la repetición 1.

Ejemplo 1:Si escribimos la siguiente línea en el Listener:

for n=20 to 30 do print n

Nos devuelve:2021222324252627

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 15

Page 16: Empezar MAXScript

282930OK

Donde cada número es n.

Ejemplo 2:La siguiente línea va a crear varias repeticiones de un objeto sin necesidad de repetir cada vez la operación:

miTetera = teapot ( )

for n=1 to 3 do(! copiTetera = copy miTetera! copiTetera.position = [n* 60, 0, 0]) Nos crea 4 teteras en fila empezando desde la posición [0,0,0].

2. <expr> to <expr> by <expr> : al introducir by, la <expr> que le sigue indica el valor de incremento de repetición.

Si añadimos al primer ejemplo (print n) by 2, nos queda:

for n = 20 to 30 by 2 do print n

Nos devuelve:202224262830OK

3. where <expr> : si añade este comando a alguna de las variantes anteriores, establece una condición cierta (true) o falta (false). Se evalúa al principio del bucle y se ejecuta si se cumple el true.

El comando do, da la orden de evaluación y ejecución de la expresión o función que sigue y que es el objeto de la creación del bucle.

También se puede utilizar el comando collect en vez de do, este comando actúa igual que el do, pero además crea una lista con todos los elementos devueltos.

Coloquemos collect en el ejemplo anterior:for n = 20 to 30 by 2 collect print n

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 16

Page 17: Empezar MAXScript

Nos devuelve:202224262830#(20,22,24,26,28,30)

Si aplicamos collect al ejemplo de las teteras, nos creará las teteras y además nos creará una lista de la posición 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 creación de las teteras en diferentes posiciones y una lista con su posición:#([60, 0,0], [120, 0, 0], [180, 0, 0], [240, 0, 0])

2.8.2 Bucle whileEste bucle se utiliza para ejecutar una función mientras se cumpla la condición especificada en <expr>:while <expr> do <expr>

while es el comando, la primera variable <expr> establece el rango de la condición de certidumbre definida anteriormente, a continuación do para ejecutar la siguiente <expr> de acción.

La forma inversa sería:do <expr> while <expr>

Los comandos actúan de la misma forma.

Ejemplo 1:

a=2while a>0 do print "cierto"

La función devuelve:ciertociertocierto...

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 17

Page 18: Empezar MAXScript

De forma automática e ininterrumpida, nunca para hasta que se finalice de alguna forma.

Ejemplo 2:a=2while a<0 do print "cierto"

Devuelve:undefined.

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 18

Page 19: Empezar MAXScript

Tercera parte3.1 Crear herramientas de entorno con MAXScript (utilidades y persianas)

Los Scripts son códigos de programación que hacen ciertas cosas automatizadas, podemos crear un "botón" para activar ese Script directamente, para crearlo haremos:

Utility <Nombre_variable> <"Cadena_literal">(button Cadena_literal "nombre_para_boton")

utility botónTetera "Crear Tetera"(! button creaBotón "Tetera")Devuelve:

Rollout:botónTetera

Esto significa que nos "ha aceptado" crear el botón, 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 botón Crear Tetera, si lo seleccionamos, se nos abrirá un menú con el nombre Tetera, si pulsamos encima, no hará nada porque no tiene ningun código programado pero así se crea un botón 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 flotantes y addrollout(), las puede introducir en otras.

3.2 Menús contextuales de botón derecho.Como el título indica, son menús que se encuentran en el menú que se abre pulsando el botón derecho del ratón:rcmenu <nombre_variable> (<cuerpo_rcmenu>)

3.3 Definición de Macros

Los son guiones que ejecutan operaciones u ordenes especiales, a través de los iconos de las barras de heramientas y que son generadas mediante el comando macroScript:

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 19

Page 20: Empezar MAXScript

macroScript <nombre_variable> category: <cadena_literal_macro>buttonText: <cadena_literal_botón>toolTip: <cadena_literal_herramienta>

icon: #(<cadena_literal_icono>, <número_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! · Diálogos! · Generación dinámica de persianas

3.4 Cómo crear un botón

Más arriba explico como se crea el botón.La sintaxis es:

Utility <Nombre_variable> <"Cadena_literal">(button Cadena_literal "nombre_para_boton")

utility botónTetera "Crear Tetera"(! button creaBotón "Tetera")Devuelve:

Rollout:botónTetera

button es el comando para crear botones, con su nombre de variable asignada a continuación, le sigue entrecomillas la cadena de texto del literal que ha de aparecen en el botón (button creaBotón "Tetera").

Pueden utilizarse dos elementos opcionales:· images: <imagen o lista de imagenes>, si queremos utilizar una imagen o ! varias en vez de una cadena.

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 20

Page 21: Empezar MAXScript

· 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.

3.4.1 Cómo hacerlo operativoLos botones necesitan un código interno para que sean funcionales, por ejemplo, nuestro botón se llama Crear Tetera - Tetera, pero no hace nada; vamos a escribirle el código para que cree una tetera:Para ello, añadiremos una función de acción on, emparejada al comando respectivo:

on <nombre_variable> pressed do(acción)

utility botónTetera "Crear Tetera"(! button creaBotón "Tetera"! on creaBotón pressed do! (! ! bot = teapot()! ))

3.5 Añadir un Contador Deslizante

Normalmente, cuando no se impone ninguna medida, crea las figuras con valores predeterminados, con un Contador Deslizante podemos controlar esos valores:

slider <nombre_variable> <"cadena_literal"> range [min,max,valor]

slider CDradio "radio" range: [0, 100, 30]

Comando Slider, le sigue la cadena del literal del contador deslizante y seguidamente en parámetro que representa el rango, el contexto valor, es un argumento o variable interna que corresponde al valor predefinido.Otros parámetros opcionales pueden ser:· type:#flotante: indica la tipología del valor entre coma flotante y entero, el valor predefinido es flotante.· tick: indica las señales de división del rango que quiere que aparezcan.· orient: indica la orientación del deslizador, la forma predefinida es horizontal.

Vamos a añadir un contador deslizante al botón de crear la tetera:

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 21

Page 22: Empezar MAXScript

utility botónTetera "Crear Tetera"(! button creaBotón "Tetera"! slider CDradio "Radio" range: [0,100,30]! on creaBotón pressed do! (! ! bot = teapot()! ))

3.5.1 Cómo hacerlo operativo

El procedimiento es similar que con el botón:

on <nombre_variable_slider> changed <argumento> do(! expresión propiedad)

utility botónTetera "Crear Tetera"(! button creaBotón "Tetera"! slider CDradio "Radio" range: [0,100,30]! on creaBotón pressed do! (! ! global bot = teapot()! )! ! on CDradio changed valor do! ! (!! ! ! bot.radius = valor! ! )

)

3.6 Crear mensajes de error

MAXScript nos permite crear mensajes de error para nuestros Scripts:

try <expresión_referida> catch messageBox <cadena_de_error>

try nos permite abrir la expresión referida de una acción, que cuando se ejecuta incorrectamente, genera, mediante el comando catch, el mensaje indicado en la cadena. Si añade messageBox, el mensaje aparecerá en una caja de diálogo.

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 22

Page 23: Empezar MAXScript

El Script nuestro, da error si se intenta modificar el radio antes de crear la tetera, vamos a añadir un mensaje de error a nuestro botón de crear la Tetera:

utility botónTetera "Crear Tetera"(! button creaBotón "Tetera"! slider CDradio "Radio" range: [0,100,30]! on creaBotón pressed do! (! ! global bot = teapot()! )! ! on CDradio changed valor do! ! (!! ! ! try! ! ! bot.radius = valor! ! ! catch! ! ! messageBox "Pulse el botón Tetera y luego modifique 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 función, está indicando que para posibilitar la utilización del deslizante, primero debe crear la tetera, si no es así, el deslizante queda inutilizado a la espera de pulsar el botón Tetera:

utility botónTetera "Crear Tetera"(! button creaBotón "Tetera"! slider CDradio "Radio" range: [0,100,30]! enabled: false! on creaBotón pressed do! (! ! global bot = teapot()! ! CDradio.enabled = true! )! ! on CDradio changed valor do! ! (!! ! ! bot.radius = valor! ! )

)

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 23

Page 24: Empezar MAXScript

3.7 Crear cajas flotantes

Para poder colocar el botón creado en una ventana, debemos crear esa ventana:Nombre_Caja = newRolloutFloater <cadena_de_literal> <anchura_caja> <altura_caja>

miCajaFlotante = newRolloutFloater "Nueva Persiana" 150 150

newRolloutFloater es el comando, le sigue la cadena que corresponde al literal o etiqueta de la caja y a continuación las dimensiones de la caja.

Para que la ventana se abra en un punto en concreto, y no en el medio como forma predeterminada, debemos añadir:<situación_desde_arriba> <situación_desde_izquierda>

Quedaría:Nombre_Caja = newRolloutFloater <cadena_de_literal> <anchura_caja> <altura_caja> <situación_desde_arriba> <situación_desde_izquierda>

miCajaFlotante = newRolloutFloater "Nueva Persiana" 150 150 100 100

Una vez creada la caja flotante, vamos a añadir una persiana determinada utilizando addrollout al final del guión.Vamos a colocar en la ventana flotante nuestro botón de crear la Tetera:

miCajaFlotante = newRolloutFloater "Crea Tetera" 150 150 100 100rollout botónTetera "Crear Tetera"(! button creaBotón "Tetera"! slider CDradio "Radio" range: [0,100,30]! enabled: false! on creaBotón pressed do! (! ! global bot = teapot()! ! CDradio.enabled = true! )! ! on CDradio changed valor do! ! (!! ! ! bot.radius = valor! ! )

)addrollout botónTetera miCajaFlotante

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 24

Page 25: Empezar MAXScript

3.8 Editor de Visual MAXScript

Este editor basado en Visual Basic nos ayuda a realizar las ventanas de forma interactiva. Por este procedimiento, no hará falta crear los guiones en el editor convencional, ya que se puede utilizar un entorno sumamente intuitivo.Sus zonas son:· Barra de menús: operaciones típicas como Archivo, edición, etc...· Barra de herramientas estándar: las operaciones típicas en iconos.· Ventana de edición: es el lado izquierdo, donde se van colocando los elementos y los va transformando y adaptando...· Tablas de propiedades y valores: en el lado derecho, disponiendo de los campos adecuados de denominación y captación de funciones.· Barra de herramientas inferior: donde se despliegan los diferentes botones de funcionalidades, que se pueden arrastrar hacia la ventana editora.

El fichero se guarda en extensión propia de Visual MAXScript " .vms", pero conviene guardarlo en " .ms", de esta manra lo compila para ser ejecutado como guión e incluso es fusionado en otros guiones si es necesario.

3.9 Herramienta Macro Recorder

Esta herramienta nos permite realizar macros grabando todas las acciones que vamos haciendo. Si lo activamos (MAXScript - Macro Recorder), a partir de ese momento se van grabando todas las acciones que vamos haciendo (Crear esferas, teteras, modificar parámetros, etc.), se pueden ver en el Listener, si estamos satisfechos con lo que hemos hecho, podemos guardarlo con extensión .ms y abrirlo cuando lo necesitemos.

3.10 Comando Debugger Dialog

MAXScript Debugger es una función que facilita el depurado de los guiones evaluando variables globales, locales y otros aspectos bastante más avanzados.

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 25

Page 26: Empezar MAXScript

Cuarta Parte

Comandos y códigos más importantes utilizados en este manual

(Sintaxis + ejemplo)

Entrar comandos<nombre del comando> ()----------------------------------------------------------------------------------------------------------------------- teapot()

Declarar variables<destino> = <expr>-----------------------------------------------------------------------------------------------------------------------Tetera = teapot ()

Modificación de parámetros e identificación$<nombre_del_objeto>.<Parámetro_del_objeto> = valor-----------------------------------------------------------------------------------------------------------------------$Teapot.radius = 20

Asignar accesos<nombre_variable>.<operando>-----------------------------------------------------------------------------------------------------------------------MiTetera.radius = 50

Mostrar propiedades de un objetoshowProperties <elemento>-----------------------------------------------------------------------------------------------------------------------showProperties MiTetera

Definir coordenadas<nombre_variable>.position = [valor 1, valor 2, valor 3]-----------------------------------------------------------------------------------------------------------------------MiTetera.position = [1, 2.9, 8]

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 26

Page 27: Empezar MAXScript

Variables globales y localesglobal <destino> = <expr>-----------------------------------------------------------------------------------------------------------------------global MiTetera = teapot()

global <destino> = <expr>-----------------------------------------------------------------------------------------------------------------------global MiTetera = teapot ()

Construcción de Listas o Arrays#(<expr>,<expr>)-----------------------------------------------------------------------------------------------------------------------#(caja = box width:150 position:[0,0,100], esfera= sphere radius:15 position:[100,0,0])

Crear funcionesfunction miFuncion=()miFuncion ( )-----------------------------------------------------------------------------------------------------------------------function CreaTeteras = ( ! Tetera = teapot radius:30 segments: 4)

CreaTetera () (Sin espacio en el paréntesis anterior)

Movermove nombre_de_variable [<x,y,z>]-----------------------------------------------------------------------------------------------------------------------move miesfera [70,70,0]

Escalarscale nombre_variable [<Sx,Sy,Sz>]-----------------------------------------------------------------------------------------------------------------------Scale miesfera [2,2,1]

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 27

Page 28: Empezar MAXScript

Rotar1. Se define como variable un comando de rotación de objeto.nombre_rotacion = eulerangles Ax Ay Az-----------------------------------------------------------------------------------------------------------------------miRotacionEsfera = eulerangles 0 30 0

2. Cuando tenemos la variable definida:rotate nombre_de_variable nombre-rotacion-----------------------------------------------------------------------------------------------------------------------rotate miesfera miRotacionEsfera

Modificar el eje de coordenadasin coordsys <sistema especifico> <nombre_rotacion> = eulerangles Ax Ay Az-----------------------------------------------------------------------------------------------------------------------in coordsys local mirotacion = eulerangles 0 30 0

Activar o desactivar propiedades<elemento>.<propiedad> = true o false-----------------------------------------------------------------------------------------------------------------------MiTetera.smooth = true

Añadir modificadoresaddmodifier <nombre variable> (<nombre_modificador> <parametros>) -----------------------------------------------------------------------------------------------------------------------MiTetera = teapot radius: 30

Modificar el valor del modificadoraddmodifier MiTetera (bend angle: 45)

Modificar otro valor del modificadorMiTetera.bend.axis = 0 (0 para X, 1 para Y, 2 para Z)

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 28

Page 29: Empezar MAXScript

Expresar animacionesanimate on(at time tiempo_fotograma_inicio (nombre_variable.parametros>)at time tiempo_fotograma_final (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. Simplificar las funcionesfunction creamiSatelite unradio unaposicion = ()creamisatelite <valor radio> <valor posicion>

unradio y unaposicion serian nombres de argumentos de una única variable creamitetera:-----------------------------------------------------------------------------------------------------------------------miSatelite.radius = unradiomiSatelite.position = unaposicion

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 de posición para ! ! ! ! ! ! ! ! colocar el valor posición [x y z]*/! )

! /*llamamos a la función colocando los valores*/

! creamisatelite 20 [0,80,0]! ! ! /*radio 20 y posición [0,80,0]*/! creamisatelite 10 [0,100,0]!! ! /*radio 10 y posicion [0,100,0]*/

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 29

Page 30: Empezar MAXScript

Bucle ifif <condición> then(! <acción true>)else(! <acción false>)-----------------------------------------------------------------------------------------------------------------------A= 60B=50

micaja1 = box length : Amicaja2= box length : B

if A>B then! ! ! ! ! /*Verifica si A es mayor que B*/! (! ! $box001.width=100!! /*se ejecuta si A es mayor que B*/! )else! (! ! $box002.height=50! ! /*Si no, cambia la altura caja02*/! )

Bucle forfor <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])

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 30

Page 31: Empezar MAXScript

-----------------------------------------------------------------------------------------------------------------------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 whiledo <expr> while <expr>-----------------------------------------------------------------------------------------------------------------------1.a=2while a>0 do print "cierto"

La función devuelve:ciertociertocierto...De forma automática e ininterrumpida, nunca para hasta que se finalice de alguna forma.

-----------------------------------------------------------------------------------------------------------------------Ejemplo 2a=2while a<0 do print "cierto"

Devuelve:undefined.

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 31

Page 32: Empezar MAXScript

Crear un botónUtility <Nombre_variable> <"Cadena_literal">(button Cadena_literal "nombre_para_boton")-----------------------------------------------------------------------------------------------------------------------

utility botónTetera "Crear Tetera"(! button creaBotón "Tetera")Devuelve:Rollout:botónTetera

! Hacerlo operativo! on <nombre_variable> pressed do

(acción)

-----------------------------------------------------------------------------------------------------------------------

utility botónTetera "Crear Tetera"(! button creaBotón "Tetera"! on creaBotón pressed do! (! ! bot = teapot()! ))

Crear un deslizadorslider <nombre_variable> <"cadena_literal"> range [min,max,valor]-----------------------------------------------------------------------------------------------------------------------slider CDradio "radio" range: [0, 100, 30]

Aplicado----------------------------------------------------------------------------------------------------------! utility botónTetera "Crear Tetera"

(! button creaBotón "Tetera"! slider CDradio "Radio" range: [0,100,30]! on creaBotón pressed do! (! ! bot = teapot()! ))

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 32

Page 33: Empezar MAXScript

! Hacerlo operativo! on <nombre_variable_slider> changed <argumento> do

(! expresión propiedad)

-----------------------------------------------------------------------------------------------------------------------

utility botónTetera "Crear Tetera"(! button creaBotón "Tetera"! slider CDradio "Radio" range: [0,100,30]! on creaBotón pressed do! (! ! global bot = teapot()! )! ! on CDradio changed valor do! ! (!! ! ! bot.radius = valor! ! )

)

Crear mensajes de errortry <expresión_referida> catch messageBox <cadena_de_error>-----------------------------------------------------------------------------------------------------------------------Ejemplo 1:

! utility botónTetera "Crear Tetera"(! button creaBotón "Tetera"! slider CDradio "Radio" range: [0,100,30]! on creaBotón pressed do! (! ! global bot = teapot()! )! ! on CDradio changed valor do! ! (!! ! ! try! ! ! bot.radius = valor! ! ! catch! ! ! messageBox "Pulse el botón Tetera y luego modifique el radio, ! ! ! ! ! ! ! ! sin tetera no hay radio"! ! )

)

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 33

Page 34: Empezar MAXScript

-----------------------------------------------------------------------------------------------------------------------Ejemplo 2:

utility botónTetera "Crear Tetera"(! button creaBotón "Tetera"! slider CDradio "Radio" range: [0,100,30]! enabled: false! on creaBotón pressed do! (! ! global bot = teapot()! ! CDradio.enabled = true! )! ! on CDradio changed valor do! ! (!! ! ! bot.radius = valor! ! )

)

Practica final de la tercera parte:Crear una ventana con cuadro para introducir texto + mensaje de error.Este Script cambia el nombre al objeto seleccionado:

MiCajaFlot = newRolleroutFloater “Nuevo Nombre” 250 75 ! /*Crea la caja flotante*/

rollout persianaText “Editor de Texto” ! ! /*Crea la persiana*/(! edittext persianaText “Nombre:” text: “<Teclee el nuevo nombre aquí>” /*campo ! ! ! ! ! ! ! ! ! ! ! ! nombre*/! on cambioDeNombre entered nuevoTexto do! (! ! if $.text == undefined then messagebox “Seleccione un objeto”! ! else $.name = cambioDeNombre.text! /*Establece mensaje de error*/! ))addrollout persianaText micajaFlot ! /*añade persiana a la caja flotante*/

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 34

Page 35: Empezar MAXScript

A la hora de programar, debe tener cuidado en cualquier tipo de error, ya que este, podría 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 programación, debemos tener en cuenta unas pautas:

· Utilizar encabezamientos definitorios del guión· Ideas claras en las operaciones que ha de realizar el guión. Es bueno realizar un pseudocodigo en papel antes de llevarlo a MAXScript.· No definir las variables con letras o palabras indefinidas, elija palabras que sean significativas de la función para una mejor comprensión del depurado.· Es buena costumbre añadir comentarios en la mayoría de líneas para saber que está haciendo.· Reconocer perfectamente el ámbito de las variables para saber claramente cuándo han de usarse las variables globales.· Sangrar las líneas de manera que los paréntesis queden de forma ordenada en las columnas.· Y horas, pase horas y horas para disfrutar de este lenguaje de programación para 3ds Max y hacer cosas automáticas con unas líneas de código.

La web www.scriptspot.com es una buena web para descargar scripts programados en MAXScript, ver como funcionan y como están hechos.

Tutorial de inicio de MAXScript! www.davidinlines.com

3ds Max 2012. Curso Avanzado. Josep Molero Vera, Inforbook’s 35