kisi uas.docx

15
Kisi-kisi UAS GRAFIKA KOMPUTER 1. Tulisan dan Font (bmp dan outline) Karakter Bitmap OpenGL tidak menyediakan dukungan untuk font dan demikian pula untuk teks. OpenGL menyediakan fungsi untuk bitmap dan fungsi ini dapat dipakai untuk teks. GLUT (dan sistem window yang lain) menyediakan fungsi untuk teks. Fungsi GLUT Bitmap berikut untuk menampilkan teks dengan model *font dan indek karakter ascii (char) : void glutBitMapCharacter( void *font, int char) Model font yang dapat dipilih, salah satu dari tabel berikut : Tabel Konstanta Font Bitmap No Konstanta Font Bitmap Arti Output 1 GLUT_BITMAP_8_BY_13 Setiap font berukuran 8x13 2 GLUT_BITMAP_9_BY_15 Setiap font berukuran 9x15 3 GLUT_BITMAP_TIMES_ROMAN_10 Setiap font Times Roman, berukuran 10 point 4 GLUT_BITMAP_TIMES_ROMAN_24 Setiap font Times Roman,berukuran 24 point 5 GLUT_BITMAP_HELVETICA_10 Setiap font Helvetica berukuran 10 point 6 GLUT_BITMAP_HELVETICA_12 Setiap font Times Roman, berukuran 12 point 7 GLUT_BITMAP_HELVETICA_18 Setiap font Times Roman, berukuran 18 point B. Stroke Teks Karakter Karakter Stoke yang dihasilkan dengan menggunakan primitif OpenGL standar, misalkan garis, poligon, dan kurva. Karakter ini dapat dimodifikasi oleh himpunan transformasi yang dapat diterapkan pada objek geometris. Membuat stroke characters menggunakan fungsi : void glutStrokeCharacter(void *font, int character); Parameter font sebagai simbolik karakter menyatakan stroke font yang dipakai (GLUT_STROKE_ROMAN atau GLUT_STROKE_MONO_ROMAN). Sedangkan character adalah karakter yang dibuat. C. Menempatkan Teks Untuk menempatkan teks yang telah dibuat dengan glut bitmap atau dengan stroke charakter, digunakan fungsi openGL berikut: void glRasterPos{234}{sifd}( Type x, Type y, Type z, Type w) void glRasterPos{234}{sifd}v(TYPE *array) Penjelasan {234} merujuk pada jumlah parameter fungsi salah satu dari 2,3 atau 4,begitu pula dengan {sifd} berarti tipe parameter single,integer,float,atau double. Use a tool called GLFont under ortho view you can output text like 1. glFontBegin(&font); 2. glScalef(8.0, 8.0, 8.0); 3. glTranslatef(30, 30, 0); 4. glFontTextOut("Test", 5, 5, 0);

Upload: rejanuis-sepondria

Post on 12-Dec-2015

236 views

Category:

Documents


11 download

TRANSCRIPT

Page 1: Kisi UAS.docx

Kisi-kisi UAS GRAFIKA KOMPUTER

1. Tulisan dan Font (bmp dan outline)

Karakter BitmapOpenGL tidak menyediakan dukungan untuk font dan demikian pula untuk teks. OpenGL menyediakan fungsi untuk bitmap dan fungsi ini dapat dipakai untuk teks. GLUT (dan sistem window yang lain) menyediakan fungsi untuk teks. Fungsi GLUT Bitmap berikut untuk menampilkan teks dengan model *font dan indek karakter ascii (char) :void glutBitMapCharacter( void *font, int char)Model font yang dapat dipilih, salah satu dari tabel berikut :Tabel Konstanta Font Bitmap

No Konstanta Font Bitmap Arti Output

1 GLUT_BITMAP_8_BY_13 Setiap font berukuran 8x13

2 GLUT_BITMAP_9_BY_15 Setiap font berukuran 9x15

3 GLUT_BITMAP_TIMES_ROMAN_10 Setiap font Times Roman, berukuran 10 point

4 GLUT_BITMAP_TIMES_ROMAN_24 Setiap font Times Roman,berukuran 24 point

5 GLUT_BITMAP_HELVETICA_10 Setiap font Helvetica berukuran 10 point

6 GLUT_BITMAP_HELVETICA_12 Setiap font Times Roman, berukuran 12 point

7 GLUT_BITMAP_HELVETICA_18 Setiap font Times Roman, berukuran 18 point

B. Stroke Teks KarakterKarakter Stoke yang dihasilkan dengan menggunakan primitif OpenGL standar, misalkan garis, poligon, dan kurva. Karakter ini dapat dimodifikasi oleh himpunan transformasi yang dapat diterapkan pada objek geometris. Membuat stroke characters menggunakan fungsi :void glutStrokeCharacter(void *font, int character);Parameter font sebagai simbolik karakter menyatakan stroke font yang dipakai (GLUT_STROKE_ROMAN atau GLUT_STROKE_MONO_ROMAN). Sedangkan character adalah karakter yang dibuat.C. Menempatkan TeksUntuk menempatkan teks yang telah dibuat dengan glut bitmap atau dengan stroke charakter, digunakan fungsi openGL berikut:void glRasterPos{234}{sifd}( Type x, Type y, Type z, Type w)void glRasterPos{234}{sifd}v(TYPE *array)Penjelasan {234} merujuk pada jumlah parameter fungsi salah satu dari 2,3 atau 4,begitu pula dengan {sifd} berarti tipe parameter single,integer,float,atau double.

Use a tool called GLFont under ortho view you can output text like

1. glFontBegin(&font);2. glScalef(8.0, 8.0, 8.0);3. glTranslatef(30, 30, 0);4. glFontTextOut("Test", 5, 5, 0);5. glFontEnd();6. glFlush();

Bitmap:wglUseFontBitmaps(hDC, 32, 96, base);           // Builds 96 Characters Starting At Character 32

Outline :wglUseFontOutlines( hDC,                // Select The Current DC            0,              // Starting Character            255,                // Number Of Display Lists To Build            base,               // Starting Display Lists

Page 2: Kisi UAS.docx

2. Load texture

  Inisialisasi yang menghubungkan antara source code untuk texture mapping dengan program utama. Source code dan header yang digunakan ‘imageloader.h’  dan ‘imageloader.cpp’.

2.      File ‘imageloader.h’  dan ‘imageloader.cpp’ harus disimpan dalam folder project yang sedang digunakan.3.      Dalam konfigurasi project, tambahkan Header file dengan4.      Inisialisasi mengenai aktivasi texture mapping di program utama meliputi.

 Header#include "imageloader.h"

VariabelGLuint _textureId; //The id of the textur 

Fungsi

Berikut ini merupakan contoh progam OpenGl dengan menggunakan mapping.Scrip:

Imageloader.h

#ifndef IMAGE_LOADER_H_INCLUDED#define IMAGE_LOADER_H_INCLUDED//Represents an image

class Image {       public:              Image(char* ps, int w, int h);              ~Image();                         /* An array of the form (R1, G1, B1, R2, G2, B2, ...) indicating the               * color of each pixel in image.  Color components range from 0 to 255.               * The array starts the bottom-left pixel, then moves right to the end               * of the row, then moves up to the next column, and so on.  This is the               * format in which OpenGL likes images.               */              char* pixels;              int width;              int height;};//Reads a bitmap image from file.Image* loadBMP(const char* filename);#endif

Imageloader.cpp

#include <assert.h>#include <fstream>#include <glut.h>#include "imageloader.h"

int w=480, h=480; //lebar, tinggiint s=0, p=-10; // sudut, sumbu zint rx=0, ry=0, rz=0; //sumbu simetri

GLuint _textureId;GLuint loadTexture(Image* image){       GLuint textureId;       glGenTextures(1, &textureId); //allocate texture name       glBindTexture(GL_TEXTURE_2D, textureId); //select our current texture       glTexImage2D(GL_TEXTURE_2D, //select GL_TEXTURE_2D              0, //0 for default 2D texture              GL_RGB, //RGB format for image              image->width, image->height,              0, //border image must be 0              GL_RGB, //format image for the stored pixels              GL_UNSIGNED_BYTE, //pixels stored as unsigned numbers              image->pixels);       return textureId;

Page 3: Kisi UAS.docx

}

using namespace std;

Image::Image(char* ps, int w, int h) : pixels(ps), width(w), height(h) {}

Image::~Image() {       delete[] pixels;}

namespace {       int toInt(const char* bytes) {              return (int)(((unsigned char)bytes[3] << 24) |                                   ((unsigned char)bytes[2] << 16) |                                   ((unsigned char)bytes[1] << 8) |                                   (unsigned char)bytes[0]);       }             short toShort(const char* bytes) {              return (short)(((unsigned char)bytes[1] << 8) |                                     (unsigned char)bytes[0]);       }

      

       int readInt(ifstream &input) {              char buffer[4];              input.read(buffer, 4);              return toInt(buffer);       }

       short readShort(ifstream &input) {              char buffer[2];              input.read(buffer, 2);              return toShort(buffer);       }

       template<class T>       class auto_array {              private:                     T* array;                     mutable bool isReleased;              public:                     explicit auto_array(T* array_ = NULL) :                           array(array_), isReleased(false) {                     }

                     auto_array(const auto_array<T> &aarray) {                          array = aarray.array;                           isReleased = aarray.isReleased;                           array.isReleased = true;

                     }

                     ~auto_array() {                           if (!isReleased && array != NULL) {                                  delete[] array;                           }                     }                                         T* get() const {                           return array;                    }                     T &operator*() const {

                           return *array;                     }

                     void operator=(const auto_array<T> &aarray) {

Page 4: Kisi UAS.docx

                           if (!isReleased && array != NULL)                                   delete[] array;                           }                           array = aarray.array;                           isReleased = aarray.isReleased;                           aarray.isReleased = true;                     }                                         T* operator->() const {                           return array;                     }

                     T* release() {                           isReleased = true;                           return array;                     }

                     void reset(T* array_ = NULL) {                           if (!isReleased && array != NULL) {                                  delete[] array;                           }                           array = array_;                     }

                     T* operator+(int i) {                           return array + i;                     }

                     T &operator[](int i) {                           return array[i];                      }       };

}

Image* loadBMP(const char* filename) {       ifstream input;       input.open(filename, ifstream::binary);       assert(!input.fail() || !"Could not find file");       char buffer[2];       input.read(buffer, 2);       assert(buffer[0] == 'B' && buffer[1] == 'M' || !"Not a bitmap file");       input.ignore(8);       int dataOffset = readInt(input);

       //Read the header       int headerSize = readInt(input);       int width;       int height;       switch(headerSize) {              case 40:                     //V3                     width = readInt(input);                     height = readInt(input);                     input.ignore(2);                     assert(readShort(input) == 24 || !"Image is not 24 bits per pixel");                     assert(readShort(input) == 0 || !"Image is compressed");                     break;              case 12:                     //OS/2 V1                     width = readInt(input);                     height = readInt(input);                     input.ignore(2);                     assert(readShort(input) == 24 || !"Image is not 24 bits per pixel");                     break;

              case 64:

Page 5: Kisi UAS.docx

                     //OS/2 V2

                     assert(!"Can't load OS/2 V2 bitmaps");

                     break;

              case 108:

                     //Windows V4

                     assert(!"Can't load Windows V4 bitmaps");

                     break;

              case 124:

                     //Windows V5

                     assert(!"Can't load Windows V5 bitmaps");

                     break;

              default:

                     assert(!"Unknown bitmap format");

       }

      

       //Read the data

       int bytesPerRow = ((width * 3 + 3) / 4) * 4 - (width * 3 % 4);

       int size = bytesPerRow * height;

       auto_array<char> pixels(new char[size]);

       input.seekg(dataOffset, ios_base::beg);

       input.read(pixels.get(), size);

      

       //Get the data into the right format

       auto_array<char> pixels2(new char[width * height * 3]);

       for(int y = 0; y < height; y++) {

              for(int x = 0; x < width; x++) {

                     for(int c = 0; c < 3; c++) {

                           pixels2[3 * (width * y + x) + c] =

                                  pixels[bytesPerRow * y + 3 * x + (2 - c)];

                     }

              }

       }

      

       input.close();

Page 6: Kisi UAS.docx

       return new Image(pixels2.release(), width, height);}

void init(){       GLfloat LightPosition[]={-10.0f, 20.0f, 20.0f, 0.0f};       glShadeModel(GL_SMOOTH);       glClearColor(0.0f,0.0f,0.0f,0.5f);       glClearDepth(1.0f);       glEnable(GL_DEPTH_TEST);       glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

       glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);       glEnable(GL_LIGHTING);       glEnable(GL_LIGHT0);       glEnable(GL_COLOR_MATERIAL);       glBlendFunc(GL_SRC_ALPHA,GL_ONE);       glColorMaterial(GL_BACK, GL_DIFFUSE);       Image* image = loadBMP("11.BMP");       _textureId = loadTexture(image);       return;}

void mydisplay(){       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);       glMatrixMode(GL_MODELVIEW);       glLoadIdentity();       glEnable(GL_TEXTURE_2D);       glBindTexture(GL_TEXTURE_2D, _textureId);       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);       glTranslatef(0,0,p);       glRotatef(s,rx,ry,rz);       glPushMatrix();       glRotatef(180,0,1,0);       glBegin(GL_QUADS);              glTexCoord2f(0.0f, 0.0f);                     glVertex2f(-2.0f, -2.0f);              glTexCoord2f(1.0f, 0.0f);                     glVertex2f(2.0f, -2.0f);              glTexCoord2f(1.0f, 1.0f);                     glVertex2f(2.0f, 2.0f);              glTexCoord2f(0.0f, 1.0f);                     glVertex2f(-2.0f, 2.0f);       glEnd();       glPopMatrix();       glPushMatrix();       glTranslatef(2,0,2);       glRotatef(90,0,1,0);       glBegin(GL_QUADS);              glTexCoord2f(0.0f, 0.0f);                     glVertex2f(-2.0f, -2.0f);              glTexCoord2f(1.0f, 0.0f);                     glVertex2f(2.0f, -2.0f);              glTexCoord2f(1.0f, 1.0f);                     glVertex2f(2.0f, 2.0f);              glTexCoord2f(0.0f, 1.0f);                     glVertex2f(-2.0f, 2.0f);       glEnd();       glTranslatef(-2,0,-2);       glRotatef(-90,0,1,0);       glBegin(GL_QUADS);              glTexCoord2f(0.0f, 0.0f);                     glVertex2f(-2.0f, -2.0f);              glTexCoord2f(1.0f, 0.0f);                     glVertex2f(2.0f, -2.0f);              glTexCoord2f(1.0f, 1.0f);                     glVertex2f(2.0f, 2.0f);

              glTexCoord2f(0.0f, 1.0f);

Page 7: Kisi UAS.docx

                     glVertex2f(-2.0f, 2.0f);

       glEnd();

       glTranslatef(-2,0,-2);

       glRotatef(-90,0,1,0);

       glBegin(GL_QUADS);

              glTexCoord2f(0.0f, 0.0f);

                     glVertex2f(-2.0f, -2.0f);

              glTexCoord2f(1.0f, 0.0f);

                     glVertex2f(2.0f, -2.0f);

              glTexCoord2f(1.0f, 1.0f);

                     glVertex2f(2.0f, 2.0f);

              glTexCoord2f(0.0f, 1.0f);

                     glVertex2f(-2.0f, 2.0f);

       glEnd();

       glPopMatrix();

       glPushMatrix();

              glTranslatef(0,2,2);

              glRotatef(-90,1,0,0);

              glBegin(GL_QUADS);

              glTexCoord2f(0.0f, 0.0f);

                     glVertex2f(-2.0f, -2.0f);

              glTexCoord2f(1.0f, 0.0f);

                     glVertex2f(2.0f, -2.0f);

              glTexCoord2f(1.0f, 1.0f);

                     glVertex2f(2.0f, 2.0f);

              glTexCoord2f(0.0f, 1.0f);

                     glVertex2f(-2.0f, 2.0f);

       glEnd();

       glPopMatrix();

       glPushMatrix();

              glTranslatef(0,-2,2);

              glRotatef(90,1,0,0);

              glBegin(GL_QUADS);

              glTexCoord2f(0.0f, 0.0f);

Page 8: Kisi UAS.docx

                     glVertex2f(-2.0f, -2.0f);

              glTexCoord2f(1.0f, 0.0f);

                     glVertex2f(2.0f, -2.0f);

              glTexCoord2f(1.0f, 1.0f);

                     glVertex2f(2.0f, 2.0f);

              glTexCoord2f(0.0f, 1.0f);

                     glVertex2f(-2.0f, 2.0f);

       glEnd();

       glPopMatrix();

       glDisable(GL_TEXTURE);

       glutSwapBuffers();

}

void resize(int w1, int h1){       glViewport(0,0,w1,h1);       glMatrixMode(GL_PROJECTION);       glLoadIdentity();       gluPerspective(45.0, (float) w1/(float) h1, 1.0,300.0);       glMatrixMode(GL_MODELVIEW);       glLoadIdentity();}

void myKeyboard(unsigned char key, int x, int y){       if (key == 'x'){              rx=1;              ry=0;              rz=0;              s +=5;       }

       else if (key == 'c'){              rx=1;              ry=0;              rz=0;              s -=5;       }

       else if (key == 'z'){              rx=0;              ry=0;              rz=1;              s +=5;

       }else if (key == 'a'){              rx=0;              ry=0;              rz=1;              s -=5;       }}

Page 9: Kisi UAS.docx

void mySpecialKeyboard(int key, int x, int y) {       switch(key){       case GLUT_KEY_UP :              p += 5;              break;       case GLUT_KEY_DOWN :              p -= 5;              break;       case GLUT_KEY_LEFT:              rx=0;              ry=1;              rz=0;              s -=5;              break;       case GLUT_KEY_RIGHT:              rx=0;              ry=1;              rz=0;              s +=5;              break;       }}

void timer(int value){       glutPostRedisplay();       glutTimerFunc(50,timer,0);}

void main(int argc, char **argv){       glutInit(&argc, argv);       glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);       glutInitWindowPosition(100,100);       glutInitWindowSize(w,h);       glutCreateWindow("kelompok 20");       glutDisplayFunc(mydisplay);       glutReshapeFunc(resize);

       init();       glutTimerFunc(50,timer,0);       glutKeyboardFunc(myKeyboard);       glutSpecialFunc(mySpecialKeyboard);       glClearColor(1,1,1,1);       glutMainLoop();}

[code]GLuint load_texture_raw(const char * filename, int width, int height){GLuint texture;BYTE *data;FILE *file;

file = fopen(filename, "rb");if (file == NULL) return 0;

data = malloc(width * height * 4);

fread(data, width * height * 4, 1, file);fclose(file);

glGenTextures(1, &texture;);glBindTexture(GL_TEXTURE_2D, texture);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

Page 10: Kisi UAS.docx

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, GL_RGB, GL_UNSIGNED_BYTE, data);

free(data);

return texture;}[/code]

selebihnya, pada saat inisialisasi OpenGL, kamu tinggal load RAW file dengan fungsi tsb[code]GLuint texture;

void init() {// .... inisialisasi window, dll seperti biasatexture = load_texture_raw("texture.raw", 64, 64);}[/code]

Dan misalkan kita bikin quad di coordinate system kita dan map texture yang sudah kita load tsb[code]void display(){glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, texture);

glBegin(GL_QUADS);glTexCoord2d(0.0,0.0); glVertex2d(-1.0,-1.0);glTexCoord2d(1.0,0.0); glVertex2d(1.0,-1.0);glTexCoord2d(1.0,1.0); glVertex2d(1.0,1.0);glTexCoord2d(0.0,1.0); glVertex2d(-1.0,1.0);glEnd();}[/code]

3. Load object

code dibawah adalah contoh mengatur kamera

void setCamera(){//set the cameraglMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(3.3,3.3,3.0,0,0.25,0,0.0,1.0,0.0);}

Suatu kamera mempunyai prinsip dengan mata. Pada dunia 3d sebuah kamera mempunyai titik posisi dan titik arah pandang dalam koordinat 3d x,y,z. posisi kamera sama dengan posisi “dari”mana kita melihat objek. titik arah pandang adalah arah “ke”mana mata kita memandang.

Pada OpenGL pengaturan suatu proyeksi diatur dengan mengatur matrix modelview. bisa dilihat pada code diatas bahwa ddibawah matrix model view di load suatu matriks identitas.

void cube(){//menggambar kubus dan transformasi tarnslasi ke titik 0.5 0.5 0.5 dan skala 1 1 1glPushMatrix();glTranslated(0.5,0.5,0.5);//cubeglScaled(1.0,1.0,1.0);glutSolidCube(1.0);glPopMatrix();}

Page 11: Kisi UAS.docx

fungsi diatas adalah fungsi untuk menggambar model kubus solid. GLUT menyediakan objek sederhana yang langsung bisa dipanggil dengan mudah kerangka kubus dgn memanggil fungsi glutWireCube(x). Pada code diatas sebelum fungsi pemanggil obejk kubus dipanggil terjadi 2 buah transformasi yaitu skala dan rotasi. Tanpa ada push dan pop serta transformasi secara default objek akan dirender pada skala default dan posisi default yaitu x,y,z = 0 0 0.

Operasi push dan pop matriks adalah operasi penambahan stack matriks pada modelview matriks untuk transformasi. tanpa push berarti menambahkan matriks, pada code diatas ditambahkan transalasi atau pergeseran dx,dy,dz = 0,5 0,5 0,5. operasi pop . Matriks tarnsformasi dirubah dengan menambahkan translate dan scale pada stack matriks model view sehingga objek kubus yang dipanggil melalui perhitungan tarnsformasi. glPop mengeluarkan matriks tarnsformasi keluar dari tumpukan sehingga mengambalikan matriks modelview menjadi matriks identitas.

 objload(char *name,OBJECT *k)                      // Loads Object From File (name){    int ver;                                    // Will Hold Vertice Count    float   rx,ry,rz;                               // Hold Vertex X, Y & Z Position    FILE    *filein;                                // Filename To Open    char    oneline[255];                   // Holds One Line Of Text (255 Chars Max) filein = fopen(name, "rt");// Opens The File For Reading Text In Translated Mode                                            // CTRL Z Symbolizes End Of File In Translated Mode    readstr(filein,oneline);                            // Jumps To Code That Reads One Line Of Text From The File    sscanf(oneline, "Vertices: %d\n", &ver);                    // Scans Text For "Vertices: ".  Number After Is Stored In ver    k->verts=ver;                                    // Sets Objects verts Variable To Equal The Value Of ver    objallocate(k,ver);                             // Jumps To Code That Allocates Ram To Hold The Objectfor (int i=0;i<ver;i++)                              // Loops Through The Vertices{    readstr(filein,oneline);                        // Reads In The Next Line Of Text    sscanf(oneline, "%f %f %f", &rx, &ry, &rz);             // Searches For 3 Floating Point Numbers, Store In rx,ry & rz       k->points[i].x = rx;                         // Sets Objects (k) points.x Value To rx        k->points[i].y = ry;                         // Sets Objects (k) points.y Value To ry        k->points[i].z = rz;                         // Sets Objects (k) points.z Value To rz    }    fclose(filein);                                 // Close The File     if(ver>maxver) maxver=ver;                           // If ver Is Greater Than maxver Set maxver Equal To ver}             

4. Sound (bgm dan fx)bgm:PlaySound("starwars.wav", NULL, SND_ASYNC|SND_FILENAME|SND_LOOP);

fx:

5. Collision//Puts potential ball-ball collisions in potentialCollisions. It must return

//all actual collisions, but it need not return only actual collisions.void potentialBallBallCollisions(vector<BallPair> &potentialCollisions, vector<Ball*> &balls, Octree* octree) { //Fast method octree->potentialBallBallCollisions(potentialCollisions); /* //Slow method

Page 12: Kisi UAS.docx

for(unsigned int i = 0; i < balls.size(); i++) { for(unsigned int j = i + 1; j < balls.size(); j++) { BallPair bp; bp.ball1 = balls[i]; bp.ball2 = balls[j]; potentialCollisions.push_back(bp); } } */}

//Puts potential ball-wall collisions in potentialCollisions. It must return//all actual collisions, but it need not return only actual collisions.void potentialBallWallCollisions(vector<BallWallPair> &potentialCollisions, vector<Ball*> &balls, Octree* octree) { //Fast method octree->potentialBallWallCollisions(potentialCollisions); /* //Slow method Wall walls[] = {WALL_LEFT, WALL_RIGHT, WALL_FAR, WALL_NEAR, WALL_TOP, WALL_BOTTOM}; for(unsigned int i = 0; i < balls.size(); i++) { for(int j = 0; j < 6; j++) { BallWallPair bwp; bwp.ball = balls[i]; bwp.wall = walls[j]; potentialCollisions.push_back(bwp); } } */}

6. Lightning and camera

The light is changing position when the camera moves.Here is some code to give you an idea of what I'm doing.

glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0,0,0, cameraDirection[0],cameraDirection[1],cameraDirection[2], 0,1,0);glLightfv(GL_LIGHT1, GL_POSITION, lightPosition - cameraPosition);render()

glLightfv(GL_LIGHT1, GL_POSITION, lightPosition - cameraPosition);To enable a light, just call:glEnable(GL_LIGHT0);There is also:glEnable(GL_LIGHT0);glEnable(GL_LIGHT1);glEnable(GL_LIGHT2);glEnable(GL_LIGHT3);glEnable(GL_LIGHT4);