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