You are on page 1of 7

BÀI THỰC HÀNH ĐỒ HỌA MÁY TÍNH

XÂY DỰNG HÀM THAY THẾ TRONG CHƯƠNG TRÌNH


OPENGL

Họ và tên Sinh viên: Nguyễn Đức Hoài Vũ


Mã Sinh viên: 102220048 Nhóm:

1. Giới thiệu.................................................................................................................1
2. labMyOpenGLFunction.cpp..................................................................................1
3. BÀI TẬP..................................................................................................................3

1. Giới thiệu
Nội dung bài Lab nhằn xây dựng hàm myFrustum() nhằm thay thế hàm glFrustum() của
OpenGL

2. labMyOpenGLFunction.cpp

#include <stdio.h>
#include <cstring>
#include <cmath>
#include <GL/glut.h>

void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
}

void myDrawModel()
{
glColor3f( 0.0f, 1.0f, 0.0f );
glBegin(GL_LINE_LOOP);
glVertex3f(-2, 0, 0); //P0
glVertex3f(0, 0, 1.5); //P1
glVertex3f(0, 2.5, 0); //P2
glEnd();
}//myDrawModel

void printOPENGL_MATRIX(int model, char str[]) {


// Get the modelview matrix
GLfloat M[16];
int row, col, index;
/* retrieve the current modelview matrix. this is after you ve applied all of the
transforms */

if (model == 1)
{
glGetFloatv(GL_MODELVIEW_MATRIX, M); // (MODELVIEW= MODEL+ VIEWING)

KhoaCNTT – Trường ĐHBK


printf("\n[%s] GL_MODELVIEW_MATRIX\n", str);
}
if (model == 2)
{
glGetFloatv(GL_PROJECTION_MATRIX, M); // (MODELVIEW= MODEL+ VIEWING)
printf("\n[%s] GL_PROJECTION_MATRIX\n", str);
}

for (row = 0; row < 4; row++) {


for (col = 0, index = row; col < 4; col++, index+=4) { printf("%3.3f ",
M[index]); }
printf("\n");
}
}

// Xay dung ham myFrustum theo ma tran cua OpenGL


void myFrustum(double l, double r, double b, double t, double n, double f)
{
double M[4][4];
M[0][0] = 2.f*n/(r-l);
M[0][1] = M[0][2] = M[0][3] = 0.f;

M[1][1] = 2.*n/(t-b);
M[1][0] = M[1][2] = M[1][3] = 0.f;

M[2][0] = (r+l)/(r-l);
M[2][1] = (t+b)/(t-b);
M[2][2] = -(f+n)/(f-n);
M[2][3] = -1.f;

M[3][2] = -2.f*(f*n)/(f-n);
M[3][0] = M[3][1] = M[3][3] = 0.f;
glMultMatrixd(&M[0][0]);

void display(void)
{
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 1.0);

glLoadIdentity (); /* clear the matrix */


printOPENGL_MATRIX(1, "1. Identity matrix initiation");

glTranslatef(1.0f, 2.0f, 3.0f); /* modeling transformation */


printOPENGL_MATRIX(1, "3. Model matrix");

gluLookAt(10, 0, 0, 0, 0, 0, 0, 0, 1);
printOPENGL_MATRIX(1, "2. Camera matrix");
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

myDrawModel();
glFlush ();
}

void reshape (int w, int h)


{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();

myFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);


//glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
printOPENGL_MATRIX(2, "4. Projection matrice");

glMatrixMode (GL_MODELVIEW);
}

KhoaCNTT – Trường ĐHBK


int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (600, 800);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}

3. BÀI TẬP
Cho điểm P(x, y, z) trong hệ tọa độ thế giới thực (world space)
1) Trình bày ma trận biến đổi và xác định điểm Pw(xw, yw, zw, 1) khi thực hiện các
phép biến đổi sau:
a. Phép tịnh tiến với dx, dy, dz

b. Phép quay quanh trục Ox, Oy, Oz

KhoaCNTT – Trường ĐHBK


c. Phép quay quanh một trục PQ có P(xp, yp, zp), Q(xq, yq, zq)

KhoaCNTT – Trường ĐHBK


2) Trình bày ma trận biến đổi và xác định điểm Pc(xc, yc, zc, 1) trong hệ tọa độ
camera space khi thực hiện:
a) Phép biến đổi camera đặt tại t = (x1, y1, z1), nhìn vào c = (x2, y2, z2), hướng
lên k = (0, 1, 0)]

KhoaCNTT – Trường ĐHBK


3) Trình bày ma trận biến đổi và xác định điểm Pclip(xclip, yclip, zclip, wclip) trong
clipping/projection space khi thực hiện:
a) Phép chiếu song song

b) Phép chiếu xiên

c) Phép chiếu trực giao

d) Phép chiếu phối cảnh

KhoaCNTT – Trường ĐHBK


-----------------------------------------------

KhoaCNTT – Trường ĐHBK

You might also like