Rotation constants and p-fields
This tutorial will show you how to use the glRotation instruction, and show you what score p-fields are and how they are used.
The program starts just the same as the previous tutorials, until instrument 1. Remember to type only the lines in italics.
<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
;Upto here you should recognize the code. Now we see a csound variable being defined.
;Csound works with several types of variables that have different uses and performance.
;The simplest ones are called i-rate (or instrument-rate) variables. They can be though of
;as constants within an instrument. An i-rate variable starts always with the character 'i'.
;Normally the characters following this 'i' give some short description about what the variable will be used for.
;In this case, we will be using the variable islant. Notice that we assign the value p4 to the variable.
;This means assign p-field 4 to the variable. P-fields are numbers that are entered in the score section
;when calling the instrument. See below in the score that apart from the 3 values we've used when calling
;instruments (instrument number, start time and end time) there are 2 more values or columns. ;
;These are p-fields number 4 and 5. All p-fields after 3 have no definite or fixed use.
;Their use is defined by the composer for every instrument. P-fields are useful because they permit
;instantiation of an instrument with variations intead of having to write a whole new instrument.
;P-fields must be separated by at least one space (can be more or a tab).
irotation = p5
;The above applies here as well. The fifth value accompanying the instrument call is written
;to variable irotation. Notice the values usedin the score: for irotation we have multiples of 45,
;and for islant we have either 0 or 45. Also notice that islant and irotation are local variables,
;i.e. they are different and independent for every instrument call. Each time the instrument is called
;it has its own independent islant and irotation.
glLoadIdentity
;Remember that glLoadIdentity resets all rotations and transformations.
glTranslate 0,0,-5
;First we translate our axis 5 units into the screen so we can see the objects drawn.
;If we didn't do this, the objects would be drawn at the same place the camera is, and wouldn't be seen.
glRotate irotation,0,0,1
;Now we will use the instruction glRotate. The values that must be entered are: first the angle
;and then a scaling factor the rotaion around each axis. In this first case we will rotate irotation degrees
;around the z axis. Rotation around the z axis is rotating like the hands of a clock or a propeller.
;Notice that each time instrument 1 is instantiated, it is rotated 45 degrees more than the previous instrument.
glRotate islant,0,1,0
;Now we will use the variable islant to make a rotation around the y axis. Notice that this rotation
;occurs after the previous rotation and applies to the already modified axis. In other words,
;we are not rotation around the original y axis, but upon a modified relative y axis. This might take a while
;to understand specially if you're not good at visualizing 3D geometry, but hopefully with a little practice
;it'll make sense. Rotation upon the y axis is like the rotation of an LP record. Just imagine that the turntable
;has first rotated like a propeller and then plays the record.... makes sense?
glBegin $GL_TRIANGLES
;Now that we have our axis positioned, we will draw a triangle. This is done just like drawing QUADS
;like in the previous tutorial, but require only 3 vertices. Notice the way glColor is used to make the centre
;white and the edges blue.
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
;Never forget to put GLinsert...
endin
;This is the only instrument... It will be called 8 times down in the score with different rotation values
;and start times.
</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>
That's tutorial 3. Rotation and the use of p-fields will be become clear with use, so don't worry if you can't quite grasp it at first.
The other values that can be used with glBegin are:
$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 |
For a complete definition of each, refer to the openGL programming guide at:
http://www.parallab.uib.no/SGI_bookshelves/SGI_Developer/books/OpenGL_PG/sgi_html/index.html