Rotación y campos-p (p-fields)
En este tutorial veremos cómo tuilizar la instrucción glRotation, y veremos qué son campos-p y para cómo se usan.
El programa comienza igual que los tutoriales anteriores, hasta la definición del instrumento 1.
<CsoundSynthesizer>
<CsOptions>
-+Y
</CsOptions>
<CsInstruments>
#include "OpenGL.h"
sr=100
kr =100
ksmps=1
nchnls=1
GLfps 30
GLpanel "OpenGL panel", 512, 512
GLpanel_end
FLrun
glMatrixMode $GL_PROJECTION
glLoadIdentity
gluPerspective 60,0.1,100
glMatrixMode $GL_MODELVIEW
GLinsert_i $GL_NOT_VALID
glClear $GL_COLOR_BUFFER_BIT + $GL_DEPTH_BUFFER_BIT
GLinsert_i 1.1
instr 1
islant = p4
;Hasta aquí he reciclado el código de los tutoriales pasados. Aquí vemos una variable
;de csound siendo definida. Csound trabaja con diferentes tipos de variables, que tienen
;diferentes usos y comportamiento. Las variables más simples se llaman de “actualización-i”
;o mejor el término en inglés: i-rate. Estas variables pueden considerarse constantes (ya que
;solo se pueden modificar al inicio de una nota, es decir permanecen constantes durante toda la nota).
;Una variable i-rate siempre empieza con el carater 'i'. Normalmente los caracteres que le
;siguen a esta 'i' dan alguna indicación del uso de la variable, aunque esto es sólo por conveniencia
;En este caso usaremos la variable islant. Note que a la variable islant le asignamos el valor p4.
;Esto significa que asignamos el campo-p numero 4 a la variable. Campos-p son valores entrados
;en el score en el momento de crear la nota. Se puede ver abajo en el score que aparte de los tres
;valores que hemos usado anteriormente (que son obligatorios), hay otros dos valores o columnas.
;Estos son los campos-p número 4 y 5. Todos los campos-p luego del tercero no tienen un uso definido,
;ya que es el instrumento el que define su uso. Los campos-p son útiles porque permiten la instaciación
;de un instrumento con diferentes parámetros, en vez de tener que crear un instrumento nuevo.
;Los campos-p deben estar separados de al menos u espacio en blanco ( pueden ser más o tab)
irotation = p5
;Lo anterior aplica aquí también. El quinto valor colocado al llamar el instrumento se escribe en la
;variable irotation. Note los valores usados en el score: para irotation tenemos multiplos de 45,
;y para islant tenemos 0 o 45. Note también que islant e irotation son variables locales, o sea que cada nota,
;así sea del mismo instrumento, tiene un valor propio e independiente de islant e irotation.
glLoadIdentity
;Recuerde que glLoadIdentity revierte todas las rotaciones y transformaciones anteriores (pero no lo
;que ya se ha dibujado)
glTranslate 0,0,-5
;Primero trasladamos nuestros ejes 5 unidades hacia la pantalla para poder ver los objetos
;que se dibujarán. Si no hicieramos esto, los objetos se dibujarían en el mismo punto en el que está
;la cámara y no los veríamos.
glRotate irotation,0,0,1
;Ahora usamos la instrucción glRotate. Los valores que se deben entrar son: el ángulo a rotar
;(siguiendo siempre la regla de la mano derecha), y luego los valores de escala en cada eje.
; En este primer caso rotamos irotation grados alrededor del eje z. Rotación en el eje z es rotar como
;rotan las manecillas de un reloj, o como se mueve la hélice de un avión visto de frente. Note que
;en el score cada nueva instanciación tiene 45 grados más de rotación que la anterior.
glRotate islant,0,1,0
;Ahora usaremos la variable islant para hacer una rotacion alrededor del eje y. Note que
;esta rotación ocurre después de la primera rotación y se aplica a los ejes de referencia que ya
;han sido rotados. En otras palabras no estamos rotando alrededor del eje y original sino alrededor
;del nuevo eje y producto de la primera rotación. Esto puede ser complejo al principio pero luego
;tiene mucha lógica. Se puede pensar que la rotación alrededor del eje y es como la rotación de un
;LP en el tornamesa. Imagine entonces que el tornamesa esta pegado a la hélice de un avión, que primero
;gira un poco u luego rotamos el disco.... tiene sentido lo que digo??
glBegin $GL_TRIANGLES
;Ahora que hemos colocado los ejes donde los queremos, dibujamos un triángulo. Esto se hace
;Igual que con QUADS en el tutorial anterior, pero require tres vértices. Note como glColor se usa para hacer el centro blanco y los extremos azules.
glColor 1,1,1,1
glVertex3 0,0,0
glColor 0,0,1,1
glVertex3 1,2,0
glVertex3 -1,2,0
glEnd
GLinsert 1.5
;Nunca se olvide de GLinsert.
endin
;Este es el único instrumento. Será llamado 8 veces en el score con diferentes parámetros de rotación,
;y diferentes tiempos de inicio
</CsInstruments>
<CsScore>
i 1 1 12 45 45
i 1 2 12 0 90
i 1 3 12 45 135
i 1 4 12 0 180
i 1 5 12 45 225
i 1 6 12 0 270
i 1 7 12 45 315
i 1 8 12 0 0
</CsScore>
</CsoundSynthesizer>
</CsoundSynthesizer>
Listo! Esto fue el tutorial 3. La rotación y el uso de campos-p se irá haciendo cada vez más clara con el uso.
Otros valores que se pueden usar con glBegin son:
$GL_POINTS |
$GL_LINES |
$GL_LINE_STRIP |
$GL_LINE_LOOP |
$GL_TRIANGLES |
$GL_TRIANGLE_STRIP |
$GL_TRIANGLE_FAN |
$GL_QUADS |
$GL_QUAD_STRIP |
$GL_POLYGON |
Para una definición completa de cada uno puede visitar (en inglés):
http://www.parallab.uib.no/SGI_bookshelves/SGI_Developer/books/OpenGL_PG/sgi_html/index.html