LabDHMT XayDungMaTranOpenGL Lab6

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 3

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:


Mã Sinh viên: 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 Pw(xw, yw, zw, 1) 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
c. Phép quay quanh một trục PQ có P(xp, yp, zp), Q(xq, yq, zq)
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)]
3) Trình bày ma trận biến đổi và xác định điểm Pproj(xproj, yproj, zproj, wproj) 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

You might also like