Close
Tutorial

(ESPAÑOL) INTRODUCCIÓN A ECUACIONES PARAMÉTRICAS : CÍRCULO (PARTE 3: PYTHON) For Beginners & Intermediate

En esta ultima parte introductoria abordaremos la manera de realizar curvas paramétricas utilizando código (Python).
Una de las ventajas de realizar nuestras curvas con código es que podemos ahorrar algo de CPU ya que utilizamos menos operadores en nuestro network así como (si eres principiante) comprender mejor el uso de Python y sus librerías dentro de TouchDesigner.
En este caso el operador con el que estaremos trabajando será Script CHOP, el cual nos sirve para realizar cálculos en nuestros canales al momento de que se cocina o se realiza otra acción en dicho CHOP.
Pueden obtener información importante y también de ayuda para comprender mejor lo que haremos en los siguientes pasos, en los siguientes links:

 

CICLOS

Paso 1

Crear operador Script CHOP y colocarlo en nuestro network:

 

Como podemos observar el operador script1 abre junto con un Text DAT que se llama script1_callbacks.  Y por default el operador script1 no muestra información.
 
Lo siguiente será realizar los siguientes pasos dentro de nuestro script para poder visualizar la curva:
  • Crear los parámetros de Muestras y Radio que en los tutoriales anteriores declaramos en un constant CHOP.
  • Asignar el valor de los parámetros a variables para radio y muestras(r,muestras) y posteriormente asignar el número de muestras de la variable al operador.
  • Calcular el paso o valor que tendrá cada muestra y asignarlo a una variable.
  • Crear nuestros canales de salida necesarios(tx,ty,tz) para visualizar la curva.
  • Crear el nuevo valor de acuerdo a la ecuación paramétrica y asignar individualmente a cada muestra de nuestros canales.
 
El DAT script1_callbacks por default nos muestra el siguiente código, el cual crea una página de parámetros y los parámetros A y B, en la función OnSeptupParameters
De aquí podemos inferir lo siguiente:
· La línea page = scriptOp.appendCustomPage('Custom') crea una nueva pagina de parámetros llamada “Custom”
· La línea p = page.appendFloat('Valuea', label='Value A') crea un nuevo parámetro de tipo flotante con nombre de acceso ‘Valuea’ y etiqueta Value A.
· La línea p = page.appendFloat('Valueb', label='Value B') crea un nuevo parámetro de tipo flotante con nombre de acceso ‘Valueb’ y etiqueta Value B.

 

Así que podemos modificar ese código para declarar nuestros parámetros:

 

Paso 2.1

 

Modificaremos el código que tenemos con lo siguiente:
def onSetupParameters(scriptOp):
	#Crear Pagina de Parametros
	page = scriptOp.appendCustomPage('Parametros')
	#Crear parametro para definir la cantidad de muestras en
	#el operador
	p = page.appendInt('Muestras', label='Muestras')
	#Crear parametro para definir el radio del circulo
	p = page.appendFloat('Radio', label='Radio')

              

En la primera línea lo único que realizamos fue cambiar el nombre de ‘Custom’ a ‘Parametros’.
En la segunda línea cambiamos el tipo de Float a Int(nuestras muestras deben de ser enteros), cambiamos el nombre del parámetro a ‘Muestras’ y su etiqueta a Muestras, en la última línea solo cambiamos el nombre del parámetro a ‘Radio’ y su etiqueta a Radio.

Para que los cambios se generen, debemos salvar los cambios hechos(ctrl-s), volver a la pestaña Script y dar clic en el botón Setup:

 Definiremos el valor de muestras a 40 y el valor de radio a 1 como en los ejemplos anteriores.

Paso 2.2

Primero crearemos una variable que almacenara el valor que introduzcamos en el parámetro Radio y Muestras, con el siguiente código:

	#Almacenar el numero de muestras en variable
	r = scriptOp.par.Radio
	muestras = scriptOp.par.Muestras

 Después asignaremos esta variable a al numero de muestras del operador con el siguiente código:

	#asignar el numero de muestras a las muestras del operador
	scriptOp.numSamples = muestras

Paso 2.3

 

Para calcular el paso o valor de cada muestra debemos dividir el valor de la unidad que estamos usando, en este caso ciclos (recordando los tutoriales anteriores un circulo es igual a 1 ciclo), entre el número de muestras que tenemos almacenado en la variable muestras y restar 1 a este valor para que nuestra curva este completamente cerrada, y nuestro código queda así:
paso = 1/(muestras-1)

 

Paso 2.4

Crear los canales que necesitamos y asignarlos a una variable para su posterior uso, con el siguiente código:
	#crear canales tx,ty,tz para visualizar nuestro circulo
	tx = scriptOp.appendChan('tx')
	ty = scriptOp.appendChan('ty')
	tz = scriptOp.appendChan('tz')
Veremos que los canales se han creado con un valor de 0 y que las muestras son las que definimos:

Paso 2.5

Por último, aplicaremos la ecuación paramétrica del circulo(r*cos(t),r*sin(t)) para calcular el valor de cada muestra y al mismo tiempo asignarlo a los canales necesarios y así poder visualizar el circulo. Esto lo haremos con la ayuda de la librería math de Python.
Crearemos un for loop el cual ira desde 0 hasta la cantidad de muestras que definimos, posteriormente asignaremos el calculo del valor en x en base a nuestra ecuación paramétrica (r*cos(t)) a la muestra de tx con el índice i, lo mismo será realizado para ty con su respectiva ecuación(r*sin(t)).
Para que el calculo sea correcto debemos convertir el valor de ciclos a radianes, para esto debemos multiplicar el valor calculado por 2pi, por lo tanto, nuestro for loop queda de la siguiente manera:
	#realizar las ecuciones parametricas y asignar los valores
	#a los canales necesarios(tx,ty)
	for i in range(muestras):
		tx[i] = r * math.cos((paso*i)*(math.pi*2))
		ty[i] = r * math.sin((paso*i)*(math.pi*2))	
Por último, conectaremos un null y convertiremos la información a SOP para verificar si nuestro circulo se creó correctamente:
 GRADOS
 Si queremos usar la unidad grados solo tendremos que cambiar algunas líneas en nuestro código anterior, así que el primer paso será copiar nuestros operadores anteriores:
Las líneas que debemos cambiar son las siguientes:
  • Paso. El paso o valor de cada sample lo calculamos con las unidades que estamos trabajando (1, ciclo,360 grados,2pi Radianes), como trabajamos con grados debemos cambiar el numero 1 a 360:
        paso = 360/(muestras-1)

 

  • For Loop. Aquí debemos cambiar la manera en que interpretamos nuestros valores de paso, como estamos trabajando con grados, debemos convertir su valor a radianes pues las funciones matemáticas necesitan valores en radianes, para esto debemos usar la función math.radians(grados), por lo que nuestras líneas quedaran de la siguiente manera:
	for i in range(muestras):
		tx[i] = r * math.cos(math.radians((paso*i)))
		ty[i] = r * math.sin(math.radians((paso*i)))

 Por lo que el nuevo script queda de la siguiente manera y automáticamente vemos de nuevo como se genera la forma del circulo:

Radianes
Por último, para convertir a radianes, copiamos nuevamente los operadores anteriores y volvemos a cambiar las mismas líneas:
  • Paso. Aquí debemos cambiar el valor que se esta dividiendo a 2*pi, que en código seria lo siguiente:
        paso = 2*math.pi/(muestras-1)

 

  • For Loop. Aquí como estamos trabajando en radianes, tenemos que introducir directamente el valor del paso de cada muestra(paso*i), y el código queda de la siguiente manera:
	for i in range(muestras):
		tx[i] = r * math.cos(paso*i)
		ty[i] = r * math.sin(paso*i)

Y de nuevo podemos confirmar que el código genera un circulo:

CONCLUSIóN

Es así como llegamos al final de esta serie de tutoriales introductorios a la graficación de curvas paramétricas usando ecuaciones paramétricas, espero sea de ayuda esta información para sus posteriores proyectos o investigaciones con TouchDesigner, el próximo tutorial empezaremos a trabajar con curvas diferentes al círculo, más interesantes, así como algunas maneras de utilizar esta información.

 

P.D: En el .toe file adjunto se encuentran dos contenedores en los cuales tenemos los operadores de los tutoriales pasados asi como los nuevos.

-Δ

RECURSOS
Experience level