Sintaxis de efectos
Desde la versión 5.0 en adelante puedes usar efectos para controlar muchos de los parámetros de Forest Packs usando expresiones matemáticas. Los efectos son fáciles de usar siempre que tenga algunos conocimientos básicos de programación y matemáticas y utilice las reglas de sintaxis que se describen a continuación.
Referencia de sintaxis
Las expresiones de efectos utilizan una sintaxis matemática sencilla que comprende operadores ., +, -, *, /
, etc. matemático Funciones que toman uno o más argumentos y devuelven un resultado, las variables integradas de FP (que hemos llamado Atributos para mayor claridad), declarable por el usuario variables y personalizable Parámetros que son editables desde el Rollout de Efectos.
Hay muchas funciones integradas y atributos ya disponibles y todos están documentados en el Lista de comandos en el lado izquierdo del Editor de efectos. Para ver una explicación de cada entrada, haga clic una vez en ella y se mostrará una descripción y un ejemplo de sintaxis en el panel de Ayuda en la parte inferior de la interfaz. Las reglas generales de sintaxis se describen a continuación.
Funciones
Las funciones proporcionan comandos prediseñados que se pueden utilizar para realizar expresiones matemáticas comunes. Para utilizar una función, utilice el nombre seguido de los argumentos necesarios entre paréntesis. Por ejemplo, para convertir 90 grados a radianes se utiliza la función degToRad de la siguiente manera:
degToRad(90);
Cuando una función requiere varios argumentos, estos deben separarse mediante comas. Por ejemplo, para generar un número entero aleatorio entre 0 y 350, usaría la función randomInt como se muestra a continuación:
randomInt(0,359);
Las funciones también se pueden anidar incluyéndolas como argumentos, por ejemplo:
degToRad(randomInt(0,359));
Puede encontrar una lista completa de funciones admitidas, incluida información sobre los argumentos que requieren aquí .
Atributos
Los atributos son variables predefinidas de Forest Pack. La sintaxis de puntos se utiliza para acceder a los valores de un atributo. Esto significa que cuando se utiliza un atributo, la declaración siempre debe comenzar con una referencia a algún objeto, seguida de un punto (. o punto) y luego el nombre de la propiedad a la que desea acceder. Cada punto representa un paso desde un acceso más general al objeto a niveles más específicos de detalle de parámetros. Por ejemplo fpArtículo se refiere a la totalidad del Objeto Forest, mientras que "fpItem.posición" accede a las coordenadas locales de cada elemento disperso. Continuando hacia abajo en la jerarquía, fpItem.posición.z Se refiere únicamente a la posición de los elementos en el eje Z. La sintaxis de puntos también se utiliza para acceder a las coordenadas de posición de los parámetros del objeto y los componentes de las variables vectoriales.
Para asignar un valor a un atributo se utiliza igual (=). Por ejemplo, para establecer la rotación Z de todos los objetos dispersos en 45 grados, ingresaría lo siguiente:
fpItem.rotation.z = degToRad(45);
Tenga en cuenta que no todos los atributos de la Lista de comandos se pueden editar mediante expresiones, pero todos se pueden leer. Estudiar la lista de atributos editables es un primer paso útil para ver qué es posible con los efectos porque representan los aspectos de Forest Pack que se pueden programar con esta herramienta. Puede encontrar una lista completa de atributos divididos en categorías editables y no editables aquí .
Variables
Además de los atributos integrados, se pueden crear y editar variables en el script de expresión. Se declaran como uno de tres tipos, ya sea real para valores flotantes o unidades de escena, En t para números enteros, o vectores . No distinguen entre mayúsculas y minúsculas, pero existen algunas restricciones a la hora de nombrar:
- No puede ser el mismo que un atributo, función, variable o parámetro existente.
- Sólo debe constar de símbolos alfanuméricos y guiones bajos (
_
). - No se puede empezar con un número.
- No puede contener espacios.
- Las variables son locales para el Objeto Forest, esto significa que puedes usar el mismo nombre de variable en diferentes objetos sin problemas.
A continuación se muestran ejemplos que ilustran cómo crear cada uno de los tres tipos de variables, así como algunas formas aceptables de construir nombres de variables según las reglas descritas anteriormente.
int objectCount = 1
real object_rotate_z = 10.5
vector objectPosition1 = [10,10,0]
También puedes crear variables sin asignar un valor de la siguiente manera:
int objectCount
real object_rotate_z
vector objectPosition1
Una vez que se ha declarado una variable, asigna un nuevo valor usando igual (=). Por ejemplo
objectCount = 5;
object_rotate_z = 22.5;
objectPosition1 =[20,20,20];
Los tipos de variables no se pueden cambiar una vez creados y, aunque puede asignar un valor entero a una variable real, no puede asignar un valor real a un número entero. En este caso necesitarás usar las funciones de redondeo ceil(), floor(), trunc() o round() para convertir el valor real a un número entero, por ejemplo:
int integer;
real float = 12.3;
integer = floor(float);
print integer;
Si evalúa este código, se mostrará 12 en la ventana de salida. Esto se debe a que la función suelo redondea 12,3 al número entero adyacente más bajo que luego se puede asignar a la variable entera sin errores.
Parámetros
Los parámetros son un tipo especial de variable cuyos valores se asignan en el Rollout de Efectos, esto permite al usuario controlar los efectos sin necesidad de comprender el código. En lugar de declararse en el script como una variable normal, se crean en la pestaña de parámetros del editor de efectos.
Hay 5 tipos disponibles que creas haciendo clic en el botón correspondiente:
Parámetros numéricos. Agrega una ruleta numérica al Rollout de los efectos. El formato numérico se puede configurar en unidades reales, enteras, porcentuales (reales) o de escena (reales).
Parámetros del objeto. Agrega un selector de objetos al Rollout de efectos y le permite acceder al vector de posición del objeto seleccionado.
Parámetros del controlador . Le permite acceder a la salida desde cualquier controlador en 3ds Max, seleccionado del Rollout de efectos.
Parámetros de textura. Le permite utilizar los valores RGB de un mapa, seleccionados del Rollout de efectos.
Parámetros de curva. Le permite utilizar una curva para controlar los valores. La curva se puede editar desde el Rollout de efectos.
Utilice la sección de propiedades para ajustar el parámetro, incluido el tipo de número, los límites mínimo y máximo, un valor predeterminado y el nombre. Independientemente del tipo, se hace referencia a un parámetro en la expresión utilizando su nombre y, debido a esto, los parámetros tienen las mismas restricciones de nomenclatura que las variables normales, como se describe anteriormente.
Para ilustrar, aquí se explica cómo asignaría parámetros con nombres como se muestra en la captura de pantalla anterior a una nueva variable:
int Variable1 = numericParameter;
si el tipo está configurado como enteroreal Variable2 = numericParameter;
si el tipo está configurado en unidades reales, porcentuales o de escenavector Variable3 = objectParameter.position;
para asignar un atributo (en este caso la posición, que es un vector)real Variable4 = objectParameter.position.z;
para asignar solo un componente de la posición de un objeto (en este caso z)real Variable5 = controllerParameter;
si el controlador genera un número flotantevector Variable7 = controllerParameter;
para asignar un controlador vectorialvector Variable8 = controllerParameter.z;
para asignar solo un componente de un controlador vectorial (en este caso z)
Los valores de un parámetro no se pueden editar en la expresión, solo cambiando el valor del control giratorio en el Rollout de efectos o editando el objeto o controlador al que está vinculado.
Para leer más sobre los parámetros y cómo crearlos y editarlos, consulte la página de parámetros.
Separación de instrucciones
Cada comando debe terminar con un punto y coma ( ; )
Comentarios
Los comentarios se agregan comenzando la línea con un símbolo #. Todo lo que esté después del # en la misma línea se ignorará:
# este es un comentario
# este es otro comentario
Tenga en cuenta que no es necesario que las líneas de comentarios terminen con un punto y coma, aunque no afectará nada si lo hace.
Depuración
Para ayudar a depurar los efectos, proporcionamos un comando de impresión que muestra los resultados de una expresión o el contenido de una variable, parámetro o atributo en la ventana Salida. Por ejemplo
real exampleVariable = 5.0;
print exampleVariable;
imprimirá 5.0 en la ventana de salida.
Debido a que a menudo se crean scripts diseñados para manipular los valores de miles de elementos dispersos, no es posible, ni deseable, ver los resultados de cada instancia. Por lo tanto, el comando de impresión muestra valores solo para el primer objeto disperso
Sensibilidad a mayúsculas y minúsculas
Funciones, variables, propiedades y atributos son no distingue entre mayúsculas y minúsculas, por ejemplo, "fpItem.position", "FPITEM.POSITION", "fpitem.position" y fp.ITEM.position hacen referencia al mismo atributo.
Primeros pasos: un ejemplo sencillo
Para ilustrar la sintaxis descrita anteriormente, es útil seguir los pasos necesarios para crear un nuevo efecto. En este ejemplo, se agregará la capacidad de especificar un incremento de paso cuando se utiliza la propiedad existente Transformar > Rotación > Z. Para hacer esto:
-
Cree un nuevo objeto Forest Pack y asígnelo a un área Spline simple.
-
Como este script controlará la Rotación Z, podemos cambiar el modo de visualización a flechas para ver claramente los efectos. Para hacer esto, vaya al Rollout de Pantalla y cambie el Ventana gráfica modo a Proxy > Flecha .
-
Ve al Rollout Transformar y encender Rotación . Selecciona el Mínimo Z valor a 0 y el Máximo Z valor a 270 .
En este punto, el Objeto Forest aleatorizará la rotación dentro del rango especificado por estos dos valores.
Queremos controlarlo para que sea aleatorio dentro de este rango, pero solo en incrementos de un valor específico.
-
Ve al Rollout Efectos y haga clic
para abrir el Editor de efectos.
-
Comentarios Primero, agreguemos un comentario a los efectos para que cualquiera que mire el código sepa lo que hace. Los comentarios se agregan comenzando la línea con un # símbolo. En la línea 1 escriba lo siguiente:
# Rotación Z aleatoria escalonada
Debido al #, esta línea se ignorará cuando el intérprete analice el script.
-
variables A continuación crearemos un nuevo Variable llamado
rotateRange
y asignarle el rango especificado por el Transformar > Rotación > Mínimo Z y Máximo valores que ingresamos en el paso 2 anterior. Para crear una variable primero debe especificar el tipo de variable seguido del nombre. Los números en el editor de efectos pueden ser de tres tipos: reales (real), enteros (int) o vectores (vector). En nuestro ejemplo queremos crear una variable Real llamadarotateRange
entonces, debajo del comentario existente, ingrese:real rotateRange =
Queremos asignar el rango de aleatorización de rotación existente especificado en el Rollout de Transformación a
rotateRange
. Para hacer esto necesitas usar un Atributo . Estas son las variables predefinidas de Forest Pack y se puede encontrar una lista completa en la pestaña Atributos en el lado izquierdo del Editor de efectos.Para encontrar el rango, necesitamos restar el Transformar > Rotación > Mínimo Z valor de la Máximo. para hacer este hallazgo
randRotMax
en la lista de atributos y haga doble clic en él. Esto agregará el atributo en la ubicación actual del cursor.real rotateRange = fpItem.randRotMax
Notarás que el texto completo dice
fpItem.randRotMax
esto se debe a que randRotMax es un atributo del objeto fpItem. Los efectos usan sintaxis de puntos para acceder a las propiedades o métodos relacionados con un objeto, por ejemplo en este caso solo queremos acceder a la propiedad de rotación Z del vector randRotMax, por lo que agregamos un z hasta el final de fpItem.randRotMax para darnos:real rotateRange = fpItem.randRotMax.z
Para deducir el valor mínimo, agregue un signo de resta y use el atributo randRotMin. No es necesario utilizar la lista de Atributos para agregar texto; Si usted también lo prefiere y está familiarizado con los comandos, puede ingresar el script manualmente. Tipo
fpItem.randRotMin.z
a eso la línea ahora dice:real rotateRange = fpItem.randRotMax.z - fpItem.randRotMin.z
Finalmente, para separar instrucciones, cada línea (excepto los comentarios) debe terminar con un punto y coma
;
. Entonces la línea final dirá:real rotateRange = fpItem.randRotMax.z - fpItem.randRotMin.z;
-
Parámetros son variables cuyos valores se asignan y editan desde el Rollout de Efectos. Estos pueden ser valores numéricos, la posición de otro objeto en la escena o la salida del controlador de otro objeto. En este ejemplo necesitamos un parámetro de valor de paso al que el usuario pueda acceder fácilmente.
Para agregar un nuevo parámetro, use la pestaña Parámetros a la izquierda del Editor de efectos. Clickea en el
para agregar un nuevo parámetro numérico. Luego puede ingresar un nombre para el parámetro, que se mostrará en el Rollout Efectos y también es el nombre de la variable que usará en el script para acceder al valor del parámetro. En este ejemplo nombraremos el parámetro
Z_Rotate_Step
(tenga en cuenta que no se permiten espacios). También debe configurar el tipo de variable de la lista desplegable, las opciones son Entero, Real, Unidades de escena y Porcentaje; en este caso necesitamos un Real número.En el Rollout de Efectos, ahora verá el parámetro Z_Rotate_Step. Selecciónelo e ingrese un valor de 90 grados para fines de prueba. Por supuesto, se puede utilizar cualquier valor, pero esto dejará muy claro cuándo está funcionando el efecto que estamos creando.
En el siguiente paso usaremos este parámetro para calcular el número máximo de valores aleatorios que pueden generarse con un tamaño de paso determinado dentro del rango de rotación. Este valor luego se asigna a una nueva variable llamada
stepsInRange
. Por ejemplo, con un rango de 270 grados y un tamaño de paso de 90, hay 4 ángulos de rotación posibles si incluye cero: 0, 90, 180 y 270. 8. Para calcular este valor, al final del script y en En una nueva línea ingresa el siguiente código:real stepsInRange = rotateRange/Z_Rotate_Step;
Esto divide la variable que creamos en el paso 6 por el parámetro creado en el paso anterior.
Para ver el valor de
stepsInRange
, puedes usar el Imprimir función:print stepsInRange;
Haga clic en evaluar y con la configuración actual la ventana de salida mostrará 3 (porque 90 se divide en 270 tres veces). Sin embargo, si cambiamos el Aleatorio > Rotar Z > Máx. valoramos a 300 grados y evaluamos nuevamente obtenemos 3.33333 . Para que esta ecuación funcione necesitamos saber el número de veces
Z_Rotate_Step
se divide enrotateRange
y devolver los resultados como un entero número "." Para hacer esto podemos usar una función para redondear un número fraccionario al valor entero más cercano. 9. Funciones es con atributos, las funciones se pueden agregar haciendo doble clic en ellas desde la lista de funciones o ingresándolas manualmente. Si selecciona una función, encontrará ayuda en la parte inferior del editor de efectos que describe su aplicación, enumera los argumentos y le permite saber el tipo de número que devuelve.Para utilizar una función, ingresa su nombre seguido de los argumentos necesarios entre paréntesis. Por ejemplo para redondear 3.33333 Abajo a 3 usarías la función
floor(3.333)
. En nuestro ejemplo agregaremos una función de piso a la existenterotateRange/Z_Rotate_Step
ecuación, por lo que la línea ahora leerá:real stepsInRange = floor(rotateRange/Z_Rotate_Step);
-
Ahora que sabemos cuántas veces el valor del paso se divide en el rango de rotación, podemos usar este valor para crear ángulos aleatorios y asignarlos a los objetos dispersos. Para hacer esto, crearemos un número aleatorio entre 0 y StepsInRange y lo multiplicaremos por Z_Rotate_Step. Para hacerlo, agregue esto a la última línea de las expresiones:
real ZRotation = randomInt(0,stepsInRange)*Z_Rotate_Step;
Veamos cada pieza de esta línea.
real ZRotation
crea una nueva variable del tipo Real.randomInt(0,stepsInRange)
genera un número entero aleatorio entre 0 y el valor almacenado en la variable stepInRange- El número aleatorio resultante se multiplica por el valor de rotación original Z_Rotate_Steps para generar los valores de rotación finales.
-
Finalmente, necesitamos asignar los nuevos valores de rotación a los objetos de Forest Pack. Para hacer esto usas otro atributo
fpItem.rotation
. Debido a que solo necesitamos cambiar el eje z, agrega un.z
hasta el final para darnosfpItem.rotation.z
. Si tú escribesfpItem.rotation.z = ZRotation
en realidad no obtendrás los resultados correctos porque hemos estado calculando el ángulo aleatorio en grados, perofpItem.rotation
utiliza radianes. Afortunadamente, es fácil convertir entre los dos usando eldegToRad()
expresión. Entonces la línea final dirá:fpItem.rotation.z = degtorad(ZRotation);
-
Recuerde, si quiere ver más claramente qué hacen las variables, agregue un comando Imprimir para cada una. El guión final debería verse así:
steppedZRotate.eff
# Rotación Z aleatoria escalonada
real rotateRange = fpItem.randRotMax.z - fpItem.randRotMin.z;
real stepsInRange = floor(rotateRange/Z_Rotate_Step);
real ZRotation = randomInt(0,stepsInRange)*Z_Rotate_Step;
fpItem.rotation.z = degtorad(ZRotation);
# Imprimir variables para depuración: muestra los resultados del primer elemento de Forest.
print rotateRange;
print stepsInRange;
print ZRotation;
- Hacer clic OK para guardar la expresión. Felicitaciones, acaba de crear su primer efecto y ahora tendrá una nueva rueda giratoria en el Rollout de efectos que puede usar para avanzar en la propiedad Transformar Z Aleatorización del elemento Forest Pack. Recuerde que si desea guardar este efecto para usarlo en otros objetos de Forest Pack en el futuro, puede Exportarlo desde el editor de efectos .
Haga clic para descargar el .eff archivo para este ejemplo. Para cargarlo en Forest Pack siga el procedimiento descrito aquí .