Maxscript Lección 2
Maxscript hecho fácil ( empieza a complicarse )

Para seguir esta lección es ideal haber terminado y entendido la anterior, ya que tomaremos de base la Variación 2 del script y lo volveremos a modificar para crear algo interesante.

1 - Antes de avanzar, y si ya estuvieron haciendo pruebas, habrán visto que esta Variación del script crea 100 cajas en diferentes posiciones de la escena y también habrán descubierto que función cumplía cada parte del script , igualmente vamos a hecharle un vistazo mas detallado al asunto:

Script

 Explicación

For i = 1 to 100 do Las condiciones de nuestro loop dicen que:  i cambiará su valor de a uno por vez desde 1 hasta 100 Esto producirá entonces que nuestro loop se repita cien veces
( Este paréntesis indica que aquí empiezan las instrucciones de nuestro loop
caja = Box() La variable caja será igual al comando Box() , por lo que creará una caja, con sus valores de tamaño y cantidad de segmentos por defecto. 
A pesar de que aquí le podríamos especificar esos parámetros, lo dejaremos para luego.
a = random 1 300
b = random 1 300
c = random 1 300
Las variables a , b , c , tendrán un valor al azar de entre 1 y 300 
( a , b , c son letras que se me ocurrieron, lo mismo la variable a ,se podría llamar posicion1 por ejemplo ,solo se deben respetar ciertas reglas en cuanto a la sintaxis , entre ellas, no se deben dejar lugares vacíos en los nombres de Variables , por ejemplo no podemos escribir posicion 1 , pero si posicion_1si lo quisiéramos )
caja.position = [a,b,c] La propiedad position ubicará nuestra caja recién creada en las coordenadas a , b , c
) Este paréntesis indica que aquí terminan las instrucciones de nuestro loop

 

Ahora ya sabemos que se crean 100 cajas porque el loop se repite cien veces. Si cambiamos este ultimo numero 100 por otro, entonces se repetirá el loop tantas veces hasta llegar a el.
También sabemos que cada vez que se crea una nueva caja la propiedad
position la cambia de lugar a las coordenadas  a , b , c ; que han sido a su vez generadas al azar por el comando random

No es tan terrible verdad ?

2 - Bien , para comenzar nuestro nuevo ejercicio debemos crear de la manera usual , en una nueva escena de Max, un plano con 5 x 5 segmentos, no es importante el tamaño, su nombre será Plane01, si no es así, nombrémoslo de esa manera pues nos referiremos a él dentro del script, este nos servirá de base para lo que queremos lograr.


3 - Trabajaremos sobre el script que acabábamos de repasar, escribamos las siguientes líneas antes de nuestro loop armado, ya que la acción siguiente solo queremos realizarla una vez:

converttomesh $Plane01

cantidad = getnumverts $Plane01

Aquí el comando converttomesh transformará nuestro plano en una malla, este paso es necesario ya que la función siguiente solo puede ser aplicada en mallas, getnumverts nos devolverá un valor igual a la cantidad de vértices que tenga la malla en cuestión, en este caso nuestro plano: $Plane01 
Entonces, si nuestro plano tiene cincuenta vértices , la Variable cantidad será igual a 50 , si tuviese sesenta vértices cantidad seria igual a 60 , etc..

Nota: Utilizamos el signo $ antes del nombre del plano, esto le indica al script que se trata del nombre del elemento que utilizamos en la escena de Max , en este caso el plano que habíamos creado y que se llama: Plane01 

4 - Ahora reemplazaremos el valor 100 del inicio del loop, por nuestra nueva Variable cantidad ,que recordemos, será igual a la cantidad de vértices de nuestra malla $Plane01. El incio de nuestro loop deberia verse asi:

For  i = 1 to cantidad do

De esta manera el loop se repetirá tantas veces como vértices tenga la malla


4 -
En las siguiente línea le buscaremos una nueva ubicación a las cajas que creara el script. Así que nos desharemos de las tres variables a , b , c , borremos esas tres líneas completas ,con todo y sus valores random , conseguiremos la información de posición de otra forma


Escribamos lo siguiente dentro de nuestro loop debajo de la linea que crea la caja

lugar = getvert $Plane01 i


La funcion
getvert nos devolverá la información de posición del numero de vértice i de nuestro plano.
Como
i es una Variable cuyo valor cambiará de a uno por vez desde 1 hasta que la Variable cantidad  llegue al total de vértices, cada vez que se realice el loop esta línea nos proveerá de la posición de un nuevo vértice.

5 - Finalmente debemos decirle al script que cada nueva caja, se ubique en esa posición que acabamos de obtener, por lo que ahora borramos  [a,b,c] de la línea correspondiente y le asignamos nuestra nueva Variable lugar de la siguiente manera

caja.position = lugar

6 - Y listo!! El script completo será el siguiente:



Para correr el script y ver si funciona debemos ir al Menu "File" / "Evaluate All" de la misma ventana. O presionar "Ctrl + E".
Si todo esta correcto se creará una caja en cada vértice del plano, llamado Plane01
Podemos ahora salvar el script con el nombre que nos guste para editarlo luego o correrlo directamente desde el Menú de la ventana de 3dsMax "Maxscript " / "Run Script" 

Variaciones sobre el mismo script:

Variación 1:

Para esta variación, primero debemos crear un plano y llamémoslo como en el ejemplo Plane01, luego corramos este script:

converttomesh $Plane01

cantidad = getnumverts $Plane01

For i = 1 to cantidad do
(

caja = Box()

a = random 1 60
b = random 1 60
c = random 1 60

lugar = getvert $Plane01 i

caja.position = lugar

caja.height = a

caja.width = b

caja.length = c

)

Aquí volvemos a incorporar  Variables  utilizando el comando random que genera un numero al azar entre dos valores dados, en este ejemplo 1 , y  60.
Lo usamos para conseguir un alto , ancho y largo  diferente para cada una de las cajas que creará el script, modificando su propiedades height ,  width y  length 
La información de posición y cantidad de cajas aun la obtendrá de los vértices del plano.
Con esta variación y según la cantidad de segmentos que tenga nuestro plano obtendremos un efecto de superficie de "Estrella de la muerte"

Variación 2:

Otra opción para utilizar un Loop sería, previa creación de una esfera llamada Sphere01, lo ideal es no darle muchos segmentos, entre 8 y 12 estará bien:



converttomesh $Sphere01

cantidad = getnumverts $Sphere01

lugar = getvert $Sphere01 1

luz = omnilight pos:lugar

For i = 2 to cantidad - 1 do
(

lugar  = getvert $Sphere01 i

luz_clonada = instance luz

luz_clonada.position = lugar

)

 

En esta variación reemplazamos el plano por una esfera y las cajas por luces Omni, el objeto que pongamos dentro de la esfera será iluminado por todas estas luces. Creando una suerte de Fake radiosity.
Para controlar las luces fácilmente, el script crea una sola luz antes de que comience al loop y  todas las demás serán Instancias de la primera.
Por lo que podemos seleccionar nuestra primer luz Omni de la manera habitual en Max, ir al panel modificar y cambiar sus parámetros y el resto de las luces se comportaran de igual manera. 

Espero que les resulte interesante y útil
Saludos
Pablo Forsolloza

Home

Scripts

Lección 01

Lección 02