Polígonos básicos
En este tutorial se mostrará cómo crear polígonos coloreados simples y cómo manejar varios instrumentos de Csound desde el score. También mostrará como trasladar el sistema de coordenadas para posicionar objetos, así como definir la perspectiva de la escena.
Escriba lo siguiente en el editor, o use copy-paste:
<CsoundSynthesizer>
<CsOptions>
-+Y
</CsOptions>
<CsInstruments>
#include "OpenGL.h"
sr=100
kr =100
ksmps=1
nchnls=1
GLfps 30
GLpanel "Coloured polygons", 512, 512
GLpanel_end
Flrun
;Hasta este punto debe reconocer las lineas que aparecieron en el tutorial anterior. La única diferencia
;es que la instrucción FLrun aparece al comienzo por fuera de un instrumento. Lo que esto significa
;es que la ventana será creada cuando la compilación inicia, antes de que se llamen los instrumentos,
;y es independiente de los instrumentos.
;La siguiente sección define como se renderiza la imagen. Definiremos que tipo de 'lente'
;usa nuestra 'cámara'. Primero necesitamos decirle a CsoundAV que vamos a definir las propiedades
;de la 'proyección' (las propiedades de la 'cámara') en vez de las propiedades de los objetos (a los que
;se les llama 'modelos'. Esto se hace seleccionando el modo de matriz (matrix mode).
;Recuerde que en las instrucciones openGL es importante observar las mayúsculas y minúsculas. Note
;también que todas las instrucciones openGL comienzan con 'gl'. Muchas de ellas (en especial las que son
;'verdaderas' instrucciones openGL) comienzan con gl en minúsculas, y luego el tipo de instrucción
;con mayúsculas (por ejemplo: glMatrixMode, glClear)
glMatrixMode $GL_PROJECTION
;La siguiente instrucción puede ser un poco confusa porque en realidad parece no tener ningún efecto.
;Puede decirse que deshace todas las transformaciones anteriores. Esto significa que
;cualquier desplazamiento, rotación y cambio de tamaño regresa a su valor inicial. Aquí es necesario
;explicar que openGL funciona desplazando los ejes de referencia, y todas las acciones se hacen
;con respecto a estos ejes modificados. Trataré de explicar esto en más detalle más abajo.
;Por ahora sólo recuerde que glLoadIdentity anula todas las transformaciones (rotaciones, desplazamiento, etc.)
glLoadIdentity
;Aquí definimos la perspectiva con la que nuestra escena será mostrada. El primer valor se refiere al ángulo
;mostrado. Este ángulo está conformado por dos lineas que parten desde el 'ojo' , y define que tan ancho
;es el campo de visión. El segundo número define el punto más cercano que se mostrará
;(cualquier objeto que esté más cerca no será mostrado). El último número define el punto más lejano
;que se mostrará, todo la que esté más lejos será descartado. 60,0.1,100 son valores comunes,
;aunque es frecuente variarlos también.
gluPerspective 60,0.1,100
;Luego de que transformamos la perspectiva, debemos decirle a CsoundAV que queremos alterar
;los objetos, no la 'camara'. Esto se hace cambiando el modo de matriz de nuevo a los modelos, así:
glMatrixMode $GL_MODELVIEW
;Cómo vimos en el tutorial anterior, GLinsert pone las instrucciones anteriores en la cadena
;de procesamiento. GLinsert_i es un caso especial de GLinsert, porque coloca las instrucciones
;en la fase de inicio. El valor $GL_NOT_VALID es cero, así que las instrucciones se colocan
;en la parte más alta de la cadena.
GLinsert_i $GL_NOT_VALID
;Borramos la pantalla como en el tutorial anterior, pero esta vez, en cada fase de inicio, en la posición
;1.1 de esta fase.
glClear $GL_COLOR_BUFFER_BIT + $GL_DEPTH_BUFFER_BIT
GLinsert_i 1.1
;Las instrucciones previas estaban por fuera de instrumentos, así que actúan durante toda la compilación
;Ahora viene el instrumento 1.
instr 1
glLoadIdentity
;De nuevo glLoadIdentity, para asegurarnos que el objeto se dibuje donde queremos con respecto al centro.
;glLoadIdentity borra todos los movimientos de los ejes, llevándolos de nuevo al centro de la pantalla (el origen)
glColor 1,1,1,1
;Al igual que glClearColor, glColor tiene 4 valores que se refieren al los componentes rojo, verde, azul
;y alpha. Esta instrucción define el color para todos los objetos a dibujarse, hasta que aparezca
;otra instrucción glColor. En este caso estamos seleccionando blanco.
glTranslate -1,1,-5
;glTranslate es una instrucción para trasladar el sistema de coordenadas (los ejes). Le dice a CsoundAV
;dónde colocar un nuevo origen o centro. En este caso desplazamos el centro una unidad a la izquierda,
;(negativo en el eje x), una unidad hacia arriba en el eje y, y 5 unidades hacia adentro de la pantalla
;(negativo en el eje z). Como se puede ver el sistema es cartesiano tal como se dibuja en el papel, con x
;positivo hacia la derecha, y positivo hacia arriba y z positivo hacia uno. Si no desplazáramos los ejes
;5 unidades hacia adentro no veríamos el objeto porque estaría en la misma posición que el 'ojo',
;que se encuentra por defecto en (0,0,0)
;
;Ahora crearemos un objetos. La forma más fácil de definir una forma en openGL es colocando los vértices.
;Todas las instrucciones para colocar vertices deben estar colocadas dentro de un bloque glBegin-glEnd,
;como se ve acá abajo. Con la instrucción glBegin se debe elegir el tipo de objeto que se va a crear. En este
;caso vamos a crear cuadrados, así que usamos $GL_QUADS.
glBegin $GL_QUADS
;Ahora definimos los cuatro vertices del cuadrado cada uno con el comando glVertex. Note que cuando el cuadrado
;aparece el origen (0,0,0) está colocado en realidad en (-1,1,-5) debido al comando de desplazamiento que
;dimos anteriormente.
glVertex3 0,0,0
glVertex3 1,0,0
glVertex3 1,1,0
glVertex3 0,1,0
;Ahora finalizamos el cuadrado con el comando glEnd.
glEnd
GLinsert 1.5
;Insertamos estas instrucciones en la cadena de procesamiento, y cerramos el instrumento con
;endin. Note que GLinsert tiene GL en mayúsculas.
endin
instr 2
;Este instrumento es muy similar al anterior, pero coloca el origen en un lugar diferente (-1,0,-5), e insterta una
;instrucción glColor al comienzo y luego antes de los dos últimos vertices. Note que al renderizar la escena, en el
;cuadrado se crea un 'degradé' del color.
glLoadIdentity
glColor 0,0,1,1
;El color azul es 0,0,1,1
glTranslate -1,0,-5
glBegin $GL_QUADS
glVertex3 0,0,0
glVertex3 1,0,0
glColor 1,1,1,1
glVertex3 1,1,0
glVertex3 0,1,0
glEnd
GLinsert 1.5
endin
;Los instrumentos 3 y 4 son idénticos al 2 excepto que colocan el cuadrado en otra posición, y utilizan
;diferentes colores. Como se ve, QUADS crea cuadrados rellenos.
instr 3
glLoadIdentity
glColor 1,0,1,1
;El morado es el color 1,0,1,1
glTranslate -1,-1,-5
glBegin $GL_QUADS
glVertex3 0,0,0
glVertex3 1,0,0
glColor 0,0,1,1
glVertex3 1,1,0
glVertex3 0,1,0
glEnd
GLinsert 1.5
endin
instr 4
glLoadIdentity
glColor 1,1,1,1
glTranslate -1,-2,-5
glBegin $GL_QUADS
glVertex3 0,0,0
glVertex3 1,0,0
glColor 1,0,1,1
glVertex3 1,1,0
glVertex3 0,1,0
glEnd
GLinsert 1.5
endin
;Este es el final de la sección de instrumentos. Hemos creado 4 instrumentos que ahora serán usados
;en el score más abajo.
</CsInstruments>
<CsScore>
;Estos instrumentos serán llamados uno por uno, comenzando y terminando a diferente momento
i 1 0 6
i 2 2 8
i 3 3 9
i 4 4 10
</CsScore>
</CsoundSynthesizer>
Aquí termina el tutorial 2. Puede experimentar con diferentes valores de traslación y de color. Intente darle a cada vértice un color diferente, y trate de cambiar la duración y el comienzo de cada instrumento. En la guía de programación openGL se encuentra una explicación más completa de la perspectiva (en inglés):
http://www.parallab.uib.no/SGI_bookshelves/SGI_Developer/books/OpenGL_PG/sgi_html/index.html