You are on page 1of 17

THỰC HÀNH BUỔI 1:

glDisplayFunC chỉ gọi 1 lần


Vẽ ngược theo chiều kim đồng hồ

CÁC HÀM CƠ BẢN


Qui ước tên hàm
<Library prefix> <Root command> <Optional argument count> <Optional argument
type>

 Cấu trúc lệnh chung để vẽ đối tượng


Một đối tượng được xác định bởi một tập các đỉnh
Điểm: đối tượng 1 đỉnh
Đoạn thẳng: đối tượng có 2 đỉnh
Đỉnh được xác định bởi tọa độ (x,y,z)
Hàm xác định một đỉnh
glVertex3f(x,y,z)
Thiết lập trạng thái của OpenGL
Kích thước điểm
Kiểu đường
Màu sắc…
Cấu trúc lệnh để vẽ
glBegin(GLmode);
glVertex3f(x1,y1,z1);
glVertex3f(x2,y2,z2);

glEnd();

 Vẽ điểm
Vẽ điểm
Vẽ một điểm
glBegin(GL_POINTS);
glVertex3f(x1,y1,z1);
glEnd();
Vẽ nhiều điểm
glBegin(GL_POINTS);
glVertex3f(x1,y1,z1);
glVertex3f(x2,y2,z2);
glVertex3f(x3,y3,z3);
glEnd();
Vẽ các điểm tạo thành Spring-Shaped Path
- Kết quả
- Công thức đường tròn
- Code
Đặt kích thước điểm

 Vẽ đường
Vẽ đường
Các kiểu vẽ đường thẳng
GL_LINES
Vẽ một đoạn thẳng
glBegin(GL_LINES)
glVertex3f(x1,y1,z1);
glVertex3f(x2,y2,z2);
glEnd();
GL_LINE_STRIP: đường gấp khúc
GL_LINE_LOOP:
Thực hành buổi 2: Thiết kế font chữ

Bảng chuyển đổi:

Để chuyển từ số nhị phân(Binary) về thập lục phân(Hexadecimal) và ngược lại thì chúng
ta sẽ xem hình minh họa sau:

Thiết kế font chữ raster:

Cú pháp lệnh glBitmap:


glBitmap(GLsizei width, GLsizei height, GLfloat xbo, GLfloat ybo, GLfloat xbi, GLfloat
ybi, const GLubyte *bitmap);
glBitmap(w, h, xbo, ybo, xbi, ybi, *bitmap);
Hiển thị theo ma trận các bit,
 đối số bitmap là con trỏ chứa các giá trị hecxa,
 w và h cho biết chiều rộng và chiều cao (đơn vị pixel)
 xbo và ybo chỉ ra vị trí tọa độ của ảnh
 xbi và ybi chỉ ra vị trí tọa độ của ảnh bitmap kế tiếp
glBitmap(10,12,0.0,0.0,11.0,0.0,rasters);

glRasterPos2i(,): định nghĩa lại gốc tọa độ

3 4
1 2
GLubyte rasters[24] = {0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00,
0xc0, 0x00, 0xc0, 0x00,0xff, 0x00, 0xff, 0x00, 0xc0, 0x00,
0xc0, 0x00, 0xc0, 0x00, 0xff, 0xc0, 0xff, 0xc0};

Code:
#include <stdio.h>
#include <stdlib.h>
#include <glut.h>
#include <gl/GL.h>
#include <gl/GLU.h>
GLubyte rasters[24] = {
0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00,
0xc0, 0x00,
0xff, 0x00, 0xff, 0x00, 0xc0, 0x00, 0xc0, 0x00,
0xc0, 0x00,
0xff, 0xc0, 0xff, 0xc0 };
void init(void)
{
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glClearColor(0.0, 0.0, 0.0, 0.0);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glRasterPos2i(20, 20);
glBitmap(10, 12, 0.0, 0.0, 11.0, 0.0, rasters);
glBitmap(10, 12, 0.0, 0.0, 11.0, 0.0, rasters);
glBitmap(10, 12, 0.0, 0.0, 11.0, 0.0, rasters);
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, w, 0, h, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27:
exit(0);
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(100, 100);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
Thiết kế chữ I:
0 0 0 0 0 0 0 0 0x00
0 0 1 1 1 1 0 0 0x3c
0 0 0 1 1 0 0 0 0x18
0 0 0 1 1 0 0 0 0x18
0 0 0 1 1 0 0 0 0x18
0 0 0 1 1 0 0 0 0x18
0 0 0 1 1 0 0 0 0x18
0 0 0 1 1 0 0 0 0x18
0 0 0 1 1 0 0 0 0x18
0 0 0 1 1 0 0 0 0x18
0 0 1 1 1 1 0 0 0x3c
0 0 0 0 0 0 0 0 0x00
Thiết kế font chữ viết tay kích thước 16x12
0 0 0 0 0 0 0 0
0 0 1 1 1 1 0 0
0 0 0 1 1 0 0 0
0 0 0 1 1 0 0 0
0 0 0 1 1 0 0 0
0 0 0 1 1 0 0 0
0 0 1 1 1 1 0 0
0 0 0 0 0 0 0 0
THỰC HÀNH BUỔI 3: CÁC PHÉP BIẾN ĐỔI 3D VÀ HOẠT CẢNH TRONG
OPENGL

(CHƯƠNG 03 – OPENGL)
I. Một số câu lệnh vẽ đối tượng 3d của glut.h
glutSolidSphere (bán kính, slide, stack); vẽ khối cầu đặc
stack: đường nằm ngang
slide: đường dọc
glutWireSphere (bán kính, slide, stack); vẽ khối cầu dạng lưới
glutSolidCube(size): vẽ khối lập phương đặc
glutWireCube(size): vẽ khối lập phương dạng lưới
glutSolidTeapot(size): vẽ ấm trà đặc
glutWireTeapot(size): vẽ ấm trà dạng lưới
Ngoài ra còn có các lệnh vẽ đối tượng 3D khác, tham khảo mục lục D của OpenGL_RB.
Thực hành
Chương trình cube.c

Copy chương trình cube.c vào thay đổi thông số:


//glScalef(1.0, 2.0, 1.0); /* modeling transformation */
glRotatef(30, 1, 1, 1);
Thay đổi hình dạng thành ấm trà
glutWireTeapot(1.0);

II. Tìm hiểu chương trình cube.c


1. Biến đổi điểm nhìn: Định nghĩa các thông số của người quan sát đối tượng
gluLookAt(x1,y1,z1,x2,y2,z2,x3,y3,z3)
x1,y1,z1: vị trí của người quan sát
x2,y2,z2: điểm ngắm của người quan sát
x3,y3,z3: hướng đỉnh đầu của người quan sát
Thực hành
Thay đổi điểm ngắm của người quan sát
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, -100.0, 0.0, 1.0, 0.0);

gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 100.0, 0.0, 1.0, 0.0); //không nhìn thấy???

2. Biến đổi mô hình: Nêu các phép biến đổi đối tượng 3D
Phép tịnh tiến: glTranslatef(Tx,Ty,Tz): tịnh tiến đối tượng đến vị trí mới theo trục x,y,z
Phép quay: glRotatef(angle,x,y,z): quay đối tượng một góc angle quanh một trục nối
(0,0,0) đến (x,y,z)
Phép co giãn: glScale(Sx,Sy,Sz): co dãn đối tượng 3D theo tỉ lệ Sx,Sy,Sz.
3. Bổ sung các câu lệnh để có hoạt cảnh
Hoạt cảnh = Vẽ lại + đổi chỗ
glutSwapBuffers(): đổi chỗ hai khung hình
glutPostRedisplay(): vẽ lại ảnh theo một giá trị biến đổi nào đó (tịnh tiến/co dãn/quay)
Tương tác với sự kiện nhấn chuột:
Lời gọi trong hàm main(): glutMouseFunc(mouse);
Bổ sung: làm cho ấm trà quay liên tục quanh trục Ox khi nhấn chuột trái.

https://phattrienphanmem123az.com/lap-trinh-opengl-cpp/opengl-cpp-bai-11-su-kien-
ban-phim.html
THỰC HÀNH BUỔI 4:
Biến đổi hình học trong OpenGL
 OpenGL quản lý các ma trận sau
 Modelview (GL_MODELVIEW): Dùng để biến đổi hình học đối tượng và
thay đổi hệ trục tọa độ
 Projection (GL_PROJECTION): Dùng vào việc chiếu trực giao và chiếu
phối cảnh mô hình đối tượng
 Texture (GL_TEXTURE): Dùng để phủ hoa văn lên đối tượng
 Hàm quản lý:
 glMatrixMode(mode);
 glLoadIdentity();
 glPushMatrix(); …
 Các hàm biến đổi mô hình
 glTranslate*(Tx, Ty, Tz);
* có thể là d (double) hay f (float),
 glRotate*(angle, x, y, z);
angle - tính bằng độ
(x, y, z) - tọa độ véctơ xoay, thí dụ: (0, 0, 1) xoay theo trục z
 glScale*(Sx, Sy, Sz);
Ví dụ biến đổi 2D:
glMatrixMode(GL_ MODELVIEW);
glColor3f(1.0f, 0.0f, 0.0f); // chọn màu đỏ
glRecti(50, 100, 200, 150);// vẽ chữ nhật
glPushMatrix();
glColor3f(0.0f, 0.0f, 1.0f); // chọn màu xanh
glTranslatef(-200., -50., 0.);// dịch chuyển
glRecti(50, 100, 200, 150);
glPopMatrix();
glPushMatrix();
glRotatef(90., 0., 0., 1.); // xoay 90 độ quanh z
glRecti(50, 100, 200, 150);
glPopMatrix();
glScalef(-0.5, 1., 1.); // co dãn không đều
glRecti(50, 100, 200, 150); // Trên trái, dưới phải
Để tính toán cường tại 1 điểm dựa vào 2 yếu tố:
Nguồn sáng
Đối tượng
Lệnh kích hoạt việc chiếu sáng:
glEnable(GL_LIGHTING);
Khử mặt khuất:
Các câu lệnh để khử mặt khuất trong OPENGL
+Kích hoạt thao tác khử mặt khuất
glEnable(GL_DEPTH_TEST);
+Gọi bộ đệm chiều sâu:
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ Chế độ hiển thị khử mặt khuất:
glutInitDisplayMode(GLUT_DEPTH|…);
Ánh sáng với OPENGL
Nguồn sáng: chia thành 4 loại nguồn sáng
Ánh sáng bao quanh: bản thân là nguồn sáng gián tiếp (VD: bức tường, mặt trăng,
…)
Ánh sáng khuếch tán: có vị trí và có hướng xác định (đèn pin, đèn xe, bóng đèn…)
Ánh sáng phản chiếu: hightlight, nơi phản xạ cường xạ cường xạ lớn nhất
Ánh sáng phát ra: (Emissive)
Chương trình:
Có 2 yếu tố quyết định việc chiếu sáng
Nguồn sáng: glLight{if}v(light,pname,param);
Đối tượng 3D: glMaterial{if}v{mặt, pname,param);

Vai trò của chiếu sáng: làm cho đối tượng có chiều sâu không gian.
Màu sắc của đối tượng: thể hiện thông qua việc chiếu sáng
Đối tượng 3D Nguồn sáng Kết quả
Đỏ Xanh lục Đen
(1,0,0) (0,1,0) (0,0,0)
(1,0,0) Vàng(1,1,0) (1,0,0)
Các giá trị ngầm định:
Table 5-1 : Default Values for pname Parameter of glLight*()
Parameter Name Default Value Meaning
GL_AMBIENT (0.0, 0.0, 0.0, 1.0) ambient RGBA intensity of
light
GL_DIFFUSE GL_DIFFUSE diffuse RGBA intensity of
light
Các lệnh nguồn sáng:
glLight{if}(light, pname,param);
light:tên nguồn sáng, có 8 nguồn sáng, tên lần lượt: GL_LIGHT0, GL_LIGHT1,…
GL_LIGHT7
pname: thuộc tính của nguồn sáng: GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR,
GL_POSITION.
Param: giá trị cụ thể của thuộc tính pname
Những giá trị ngầm định của tham số:
Ambient: đen(0,0,0,1)
Diffuse: trắng(1,1,1,1)
Specular: trắng(1,1,1,1)
Position: vị trí nằm trên trục Oz(0,0,1)
Câu lệnh thuộc tính chất liệu đối tượng 3D
glMaterial{if}v{mặt,pname,TYPE*param};
mặt:GL_FRONT, GL_BACK, GL_FRONT_AND_BACK
pname:GL_AMBIENT,GL_DIFFUSE, GL_SPECULAR, GL_SHININESS
param: những giá trị cụ thể cua pname
giá trị mặc định của thuộc tính
Ambient: xám(0.2,0.2,0.2,1)
Diffuse: trắng(0.8,0.8,0.8,1)
Specular: trắng(0,0,0,1)
Shinesss:0.0 (độ nhẵn bóng: 0 ->100)

Đối tượng 3D Nguồn sáng Kết quả (Lấy nhỏ


nhất
Ambient 0.2,0.2,0.2,1 1,0,1,0 0.2,0,0.2,0
Diffuse 0.8,0.8,0.8,1 1,1,1,1 0.8,0.8,0.8,1
Specular 1.0, 1.0, 1.0, 1.0 1,1,1,1 1,1,1,1
Position 1,1,1,0 1,1,1,0
Shininess 50.0 50.0
Nếu chỉ định nghĩa khai báo LIGHT0, những đèn khác không khai báo thì mặc định
là (0,0,0,0)

Ngăn xếp ma trận:


Là cấu trúc mảng, trong đó mỗi phần tử của mảng là một ma trận 4x4, có 2 thao tác đặc
trưng là chèn và xóa phần tử được thực hiện ở một đầu ngăn xếp.
Thao tác chèn: glPushMatrix();
Thao tác xóa: glPopMatrix();
Thực hiện biến đổi áp dụng cho từng phần của đối tượng trong cảnh.

You might also like