Professional Documents
Culture Documents
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ữ
Để 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:
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
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)