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

BỘ GIÁO DỤC VÀ ĐÀO TẠO

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐÔNG Á


KHOA CÔNG NGHỆ THÔNG TIN

BÀI TẬP LỚN


HỌC PHẦN: KĨ THUẬT ĐỒ HỌA MÁY TÍNH

Đề tài 19: Thiết kế góc học tập

Sinh viên thực hiện Lớp Khóa


Đỗ Thị Mai DCCNTT12.10.9 12
Lê Bá Long DCCNTT12.10.9 12
Lê Xuân Thịnh DCCNTT12.10.9 12
Lưu Mạnh Chiến DCCNTT12.10.9 12

Bắc Ninh, năm 2024


BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐÔNG Á
KHOA: CÔNG NGHỆ THÔNG TIN

BÀI TẬP LỚN


HỌC PHẦN: KĨ THUẬT ĐỒ HỌA MÁY TÍNH

Đề tài 19: Thiết kế góc học tập

Mã sinh
STT Sinh viên thực hiện Điểm bằng số Điểm bằng chữ
viên
1 Đỗ Thị Mai 20212416
2 Lê Bá Long 20212455
3 Lê Xuân Thịnh 20212383

5 Lưu Mạnh Chiến 20212704

CÁN BỘ CHẤM 1 CÁN BỘ CHẤM 2


(Ký và ghi rõ họ tên) (Ký và ghi rõ họ tên)

Bắc Ninh, năm 2024


MỤC LỤC
Lời mở đầu................................................................................................................1
Chương 1. Cơ sở lý thuyết về đồ họa máy tính.........................................................2
1.1. Các khái niệm cơ bản về đồ họa máy tính....................................................2
1.2. Các giải thuật đồ họa cơ bản.........................................................................7
1.3. Ứng dụng của đồ họa máy tính...................................................................12
Chương 2: Thiết kế sản phẩm đồ họa 3D với openGL............................................18
2.1. Xây dựng ý tưởng thiết kế.............................................................................18
2.2. Vẽ các đối tượng 3D với openGL.................................................................19
2.3. Kết quả:.........................................................................................................32
Chương 3 : Kết luận................................................................................................33
3.1 Các nội dung đã đạt được...............................................................................33
3.2. Bài học kinh nghiệm:...................................................................................33
Lời mở đầu
Như chúng ta đã thấy trong những năm gần đây sự phát triển vượt bậc về công nghệ
đồ họa đã mang lại cho con người chúng ta vô vàn sự tiện nghi, những trải nghiệm mới
mẻ, chân thực.
Vậy Đồ họa máy tính là gì?
Đồ hoạ máy tính là một lĩnh vực của khoa học máy tính nghiên cứu về cơ sở toán học,
các thuật toán cũng như các kĩ thuật để cho phép tạo, hiển thị và điều khiển hình ảnh trên
màn hình máy tính. Đồ hoạ máy tính có liên quan ít nhiều đến một số lĩnh vực như đại số,
hình học giải tích, hình học đồ hình, quang học… và kĩ thuật máy tính, đặc biệt là chế tạo
phần cứng( các loại màn hình,các thiết bị nhập xuất, các vì mạch đồ hoạ…)

Theo nghĩa rộng hơn, đồ hoạ máy tính là phương pháp và công nghệ dùng trong việc
chuyển đổi qua lại giữa dữ liệu và hình ảnh trên màn hình bằng máy tính. Đồ hoạ máy
tính hay kĩ thuật đồ hoạ máy tính còn được hiểu dưới dạng phương pháp kĩ thuật tạo hình
ảnh từ các mô hình toán học mô tả các đối tượng hay dữ liệu lấy được từ các đối tượng
trong thực tế. Thuật ngữ ” đồ hoạ máy tính “ ( computer graphics) được đề xuất bởi một
chuyên gia người Mĩ tên là William Fetter vào năm 1960. Khi đó ông đang nghiên cứu
xây dựng mô hình buồng lái máy bay cho hãnh Boeing. William Fetter đã dựa trên các
hình ảnh 3 chiều của mô hình người phi công trong buồng lái để xây dựng nên mô hình
buồng lái tối ưu nhất cho máy bay Boeing. Đây là phương pháp nghiên cứu rất mới vào
thời kì đó. Phương pháp này cho phép các nhà thiết kế quan sát 1 cách trực quan vị trí của
người lái trong khoang buồng lái. William Fetter đã đặt tên cho phương pháp của mình là
computer graphics( đồ họa máy tính).

Là sinh viên khoa Công nghệ thông tin trường Đại học Công nghệ Đông Á. Chúng
em cũng được tiếp xúc với môn học đồ họa máy tính. Với những kiến thức em đã được
học và được sự hướng dẫn của cô Ngô Thùy Giang, chúng em đã thực hiện đề tài “ Thiết
kế góc phòng học”. Trong quá trình thực hiện nghiên cứu chúng em đã sử dụng thư viện
đồ họa openGL đang được sử dụng rộng rãi hiện nay.
1.
Chương 1. Cơ sở lý thuyết về đồ họa máy tính
1.1. Các khái niệm cơ bản về đồ họa máy tính
Khái niệm
Đồ họa máy tính là một lĩnh vực quan trọng và đa dạng, nó liên quan đến việc tạo
ra và xử lý hình ảnh, đồ họa và đối tượng trực quan bằng sự hỗ trợ của máy tính. Điều
này bao gồm sự tạo ra, biểu diễn và thao tác với hình ảnh dưới nhiều dạng khác nhau.
Thành phần cơ bản: Bao gồm phần cứng và phần mềm
 Phần cứng đồ họa: Bao gồm các thành phần vật lý như màn hình máy tính, bộ xử
lý đồ họa (GPU - Graphics Processing Unit), và các thiết bị ngoại vi như bảng vẽ
đồ họa và máy in màu. GPU đóng vai trò quan trọng trong việc xử lý hình ảnh và
hiển thị chúng trên màn hình.
 Phần mềm đồ họa: Đây là các ứng dụng và công cụ phần mềm được sử dụng để
tạo, chỉnh sửa và biểu diễn đồ họa. Các ví dụ bao gồm Photoshop, Illustrator,
CorelDRAW và Blender.
Các kĩ thuật đồ họa máy tính thường gặp:

 Kỹ thuật đồ họa Bitmap(Raster).


Trong đồ hoạ máy tính, một hình ảnh đồ hoạ raster hay bitmap là cấu trúc dữ liệu
ma trận điểm đại diện cho lưới pixel hình chữ nhật nói chung (các điểm màu), có thể thấy
được thông qua màn hình, giấy hoặc phương tiện hiển thị khác. Các hình ảnh raster được
lưu trữ trong các tệp hình ảnh với các định dạng khác nhau.
Một bitmap là một lưới các pixel hình chữ nhật, với mỗi màu của pixel được chỉ
định bởi một số bit. Một bitmap có thể được tạo để lưu trữ trong bộ nhớ video của màn
hình hoặc dưới dạng tệp bitmap độc lập với thiết bị. Một raster được đặc trưng về mặt kỹ
thuật bởi chiều rộng và chiều cao của hình ảnh tính bằng pixel và theo số bit trên mỗi
pixel (hoặc độ sâu màu, xác định số lượng màu sắc mà nó đại diện).

Hình1. Kỹ thuật đồ họa Raster(Bitmap)

 Kỹ thuật đồ họa Vector:


Đồ họa vector trong đồ họa máy tính sử dụng các tọa độ trong mặt phẳng 2 chiều để biểu
diễn hình ảnh. Các tọa độ này sẽ góp phần tạo nên các path và các path này còn có thể có
các thuộc tính như màu nét, hình dạng, độ dày,… Ảnh được tạo thành bằng kỹ thuật này
được gọi là ảnh vector. Các định dạng ảnh vector phổ biến hiện nay bao gồm: SVG, EPS,
PDF…

Hình 2. Kỹ thuật đồ họa Vector


 Kỹ thuật đồ họa 3D:
Đồ họa 3 chiều trong đồ họa máy tính là kĩ thuật đồ họa sử dụng các dữ liệu hình
học có tọa độ 3 chiều rồi thực hiện tính toán để kết xuất hình ảnh 2 chiều. Các hình ảnh
đó có thể được lưu trữ hoặc hiển thị theo thời gian thực. Đồ họa máy tính 3D dựa trên
nhiều thuật toán giống như máy tính 2D đồ họa vector trong mô hình khung dây và máy
tính 2D đồ họa raster trong màn hình hiển thị cuối cùng. Đồ họa máy tính 3D thường
được gọi là mô hình 3D. Ngoài đồ họa được hiển thị, mô hình được chứa trong tệp dữ
liệu đồ họa. Tuy nhiên, có sự khác biệt: mô hình 3D là biểu diễn toán học của bất kỳ đối
tượng ba chiều nào. Một mô hình không phải là một đồ họa kỹ thuật cho đến khi nó được
hiển thị. Một mô hình có thể được hiển thị trực quan dưới dạng hình ảnh hai chiều thông
qua một quá trình được gọi là dựng hình 3D hoặc được sử dụng trong các phép tính và
tính toán mô phỏng máy tính phi đồ họa. Với in 3D, các mô hình 3D tương tự được hiển
thị thành mô hình vật lý 3D của mô hình, với những giới hạn về độ chính xác của kết
xuất có thể phù hợp với mô hình ảo.

Hình 3. Kỹ thuật đồ họa 3D


 Kỹ thuật Texture Mapping:
Khái niệm về Texture là một khái niệm quan trọng trong thiết kế đồ họa. Texture
đề cập đến cấu trúc bề mặt của một đối tượng hoặc vật liệu, bao gồm các đặc điểm
như sự mịn màng, sần sùi, gồ ghề, hoặc mờ mờ.
Texture có vai trò quan trọng trong việc tạo ra cảm giác thị giác và trải nghiệm
haptics cho người dùng. Bằng cách sử dụng texture, chúng ta có thể tạo ra các hiệu
ứng trực quan và cảm nhận được sự thay đổi về cảm giác khi tiếp xúc với các đối
tượng trong môi trường ảo.
Trong thiết kế đồ họa, texture được sử dụng để làm cho các đối tượng trở nên thực
tế hơn. Bằng cách áp dụng texture phù hợp, chúng ta có thể tạo ra các hiệu ứng
như da thú, gỗ, kim loại, vải, và nhiều hơn nữa. Texture cũng có thể được sử dụng
để tạo ra các hiệu ứng ánh sáng và bóng, giúp tăng cường sự chuyển động và chi
tiết của các đối tượng.

Hình 4. Kỹ thuật đồ họa Texture Mapping


 Kỹ thuật Render:
Trong thiết kế đồ họa, Render (hay Kết xuất đồ họa) là quá trình tạo ra hình ảnh
trực quan cuối cùng ở dạng ba chiều để chúng ta có thể hình dung được hoặc nhìn
thấy được hình ảnh, chuyển động, phối cảnh, mô hình sẽ như thế nào trong thực tế.
Những hình ảnh này mô phỏng môi trường thực tế của dự án hoặc mô hình 3D, vật
liệu, ánh sáng và vật thể. Mô hình hình học được tạo ra với hình ảnh (kết cấu) và
màu sắc, giống với vật liệu thực và có thể được chiếu sáng bằng các nguồn sáng tự
nhiên hoặc nhân tạo. Nếu các thông số render được đặt chính xác để khớp với
những thông số trong tự nhiên, thì chất lượng của kết cấu và các phối cảnh khác
nhau của render cuối cùng có thể được coi là giống như thật.

Hình 5. Kỹ thuật đồ họa Render


Các lĩnh vực đồ họa máy tính:
- Kỹ thuật xử lý ảnh (Computer Imaging): sau quá trình xử lý ảnh cho ta ảnh số
của đối tượng. Trong quá trình xử lý ảnh sử dụng rất nhiều các kỹ thuật phức tạp:
kỹ thuật khôi phục ảnh, kỹ thuật làm nổi ảnh, kỹ thuật xác định biên ảnh.
- Kỹ thuật nhận dạng (Pattern Recognition): từ những ảnh mẫu có sẵn ta phân loại
theo cấu trúc, hoặc theo các tiêu trí được xác định từ trước và bằng các thuật toán
chọn lọc để có thể phân tích hay tổng hợp ảnh đã cho thành một tập hợp các ảnh
gốc, các ảnh gốc này được lưu trong một thư viện và căn cứ vào thư viện này ta
xây dựng được các thuật giải phân tích và tổ hợp ảnh.
- Kỹ thuật tổng hợp ảnh (Image Synthesis): là lĩnh vực xây dựng mô hình và hình
ảnh của các vật thể dựa trên các đối tượng và mối quan hệ giữa chúng.
- Các hệ CAD/CAM (Computer Aided Design/Computer Aided Manufacture
System): kỹ thuật đồ hoạ tập hợp các công cụ, các kỹ thuật trợ giúp cho thiết kế
các chi tiết và các hệ thống khác nhau: hệ thống cơ, hệ thống điện, hệ thống điện
tử….
- Đồ hoạ minh hoạ (Presentation Graphics): gồm các công cụ giúp hiển thị các số
liệu thí nghiệm một cách trực quan, dựa trên các mẫu đồ thị hoặc các thuật toán có
sẵn.
- Đồ hoạ hoạt hình và nghệ thuật: bao gồm các công cụ giúp cho các hoạ sĩ, các
nhà thiết kế phim hoạt hình chuyên nghiệp làm các kỹ xảo hoạt hình, vẽ tranh... Ví
dụ: phần mềm 3D Studio, 3D Animation, 3D Studio Max

1.2. Các giải thuật đồ họa cơ bản


 Thuật toán DDA (Digital Differential Analysis): Đây là một thuật toán đơn giản
và hiệu quả để vẽ đường thẳng, hoạt động bằng cách tính toán từng điểm pixel trên
đường thẳng dựa trên độ dốc của đường thẳng.
+ Ý tưởng :
Cho PT đoạn thẳng đi qua 2 điểm (x1,y1), (x2,y2) như sau: y=kx+m
Trong đó: 𝑘=(𝑦2−𝑦1)/(𝑥2−𝑥1) ; 𝑚=𝑦1−𝑘𝑥1
Hình 1 Ví dụ thuật toán DDA

 Thuật toán Bresenham vẽ đường thẳng:


Chức năng: Tạo đường thẳng trên màn hình từ điểm đầu đến điểm cuối.
Ý tưởng: Sử dụng thuật toán tối ưu để quyết định xem pixel nào nên được sơn để xấp xỉ
đường thẳng trên màn hình. Thuật toán này sử dụng tính chất toán học của đường thẳng
để chỉ định các điểm sơn tiếp theo trên đường.
Tăng x1, xác định điểm ảnh tiếp theo bằng cách so sánh d1 và d2
Nếu d1<d2 thì điểm tiếp theo là S
Nếu d1>d2 thì điểm tiếp theo là P

Hình 2. Ví dụ giải thuật Bresenham


 Các thuật toán vẽ hình tròn:
Chức năng: Vẽ hình tròn hoặc hình tròn tương đối trên màn hình.
Ý tưởng: Sử dụng thuật toán đơn giản như Midpoint Circle để tính toán và chọn các điểm
trên đường tròn để vẽ. Thuật toán này tận dụng tính chất đối xứng của hình tròn để chỉ
cần tính toán 1/8 một phần của đường.
Cung 1/8 được mô tả như sau:
{(0≤x≤R √2/2
R √2/2≤y≤R
Nếu có (x, y) ∈ (C1/8) thì các điểm: (y, x), (y, x), (x,-y), (-x,-y), (-y,-x), (-y,x), (-x,y) sẽ
thuộc (C).

+ Ý tưởng
Phương trình đường tròn
F(x,y)=x2 + y2 – R
Cơ sở toán học
F(x,y): <0 nếu (x,y) nằm trong đường tròn
=0 nếu (x,y) thuộc đường tròn
>0 nếu (x,y)nằm ngoài đường tròn)
Đặt Pold=F(M)
Pold=(xp+1)2 + (yp-1/2)2 – R2
Nếu chọn E, MnewE(xp+2,yp-1/2)
PnewE=(xp+2)2 + (yp-1/2)2 – R2
PnewE= Pold + 2xp + 3
Nếu chọn SE, MnewSE(xp+2,yp-3/2)
PnewE=(xp+2)2 + (yp-3/2)2 – R2
PnewE= Pold + 2(xp - yp) + 5

Hình 3. Ví dụ thuật toán midpoint


 Thuật toán tô màu theo dòng quét (Scanline Fill Algorithm):
Chức năng: Tô màu các đa giác hoặc hình đa giác bằng cách quét từng dòng của hình
ảnh.
Ý tưởng: Xác định các cạnh của đa giác và sau đó quét từng dòng của hình ảnh. Khi quét
qua mỗi dòng, thuật toán tô màu các vùng liên tục bị giới hạn bởi các cạnh của đa giác.

Hình 2 Ví dụ giải thuật tô màu các đối tượng

 Giải thuật cắt xén vùng


Duyệt lần lượt (theo chiều kim đồng hồ) các cạnh đa giác
Nếu đỉnh duyệt xuất phát từ trong cửa sổ theo cạnh đa giác đi ra ngoài cửa sổ: lưu
trữ giao của cạnh đa giác với biên cửa sổ
Nếu đường đi từ ngoài vào trong cửa sổ: lưu trữ đỉnh đa giác và giao điểm
Thí dụ xét hai đỉnh đa giác S và P:

Hình 3 Ví dụ giải thuật cắt xén vùng


 Thuật toán tô màu lan truyền (Flood Fill Algorithm):
Chức năng: Tô màu một vùng liên tục trong hình ảnh bắt đầu từ một điểm xuất phát.
Ý tưởng: Sử dụng phép lan truyền để mở rộng việc tô màu từ điểm bắt đầu sang các điểm
lân cận. Thuật toán này duyệt qua các điểm kề nhau và tô màu chúng nếu chúng thuộc
vùng cần tô màu và chưa được tô.
 Các thuật toán biến đổi hình học (Transformation Algorithms):
Chức năng: Thay đổi kích thước, hình dạng và vị trí của các đối tượng đồ họa.
Ý tưởng: Áp dụng các phép biến đổi toán học để di chuyển, xoay, co giãn hoặc đối xứng
các đối tượng trên màn hình. Các phép biến đổi này được áp dụng trên tọa độ của các
điểm của đối tượng.
1.3. Ứng dụng của đồ họa máy tính
Đồ họa máy tính đã có sự ảnh hưởng mạnh mẽ và đa dạng trong nhiều khía cạnh của
cuộc sống và ngành công nghiệp. Dưới đây là một số ứng dụng quan trọng:
 Đồ họa 2D
Công nghệ:
Đồ họa raster: Sử dụng mạng lưới các điểm ảnh (pixel) để tạo hình ảnh. Ưu điểm:
dễ chỉnh sửa, phù hợp cho ảnh chụp và ảnh vẽ. Nhược điểm: hình ảnh bị vỡ khi phóng to.
Đồ họa vector: Sử dụng các đường thẳng, đường cong và hình dạng toán học để tạo
hình ảnh. Ưu điểm: có thể phóng to thu nhỏ mà không bị vỡ ảnh, tệp tin nhỏ gọn. Nhược
điểm: phức tạp hơn trong việc chỉnh sửa so với đồ họa raster.
Công cụ:
Adobe Photoshop: Chỉnh sửa ảnh raster phổ biến, cung cấp nhiều công cụ để chỉnh
sửa, tô vẽ, và tạo hiệu ứng
Adobe Illustrator: Chỉnh sửa ảnh vector mạnh mẽ, cho phép tạo logo, biểu tượng,
minh họa và đồ họa thông.

GIMP: Phần mềm chỉnh sửa ảnh miễn phí và mã nguồn mở, có chức năng tương tự
như Photoshop.
Inkscape: Phần mềm chỉnh sửa ảnh vector miễn phí và mã nguồn mở, có chức năng
tương tự như Illustrator.

Ứng dụng:
1. Thiết kế đồ họa: logo, banner, poster, infographic, v.v.
2. Chỉnh sửa ảnh: chỉnh sửa ảnh chụp, ghép ảnh, xóa phông nền, v.v.
3. Vẽ tranh kỹ thuật số: sáng tạo tranh vẽ, minh họa, truyện tranh, v.v.
4. Thiết kế giao diện người dùng: giao diện web, ứng dụng di động, phần mềm, v.v.
 Đồ họa 3D:
Công nghệ:
Mô hình 3D: Biểu diễn các đối tượng 3D bằng các điểm, đường thẳng, mặt và kết
cấu.
Phân cảnh 3D: Sắp xếp các đối tượng 3D trong không gian ảo, bao gồm ánh sáng,
camera và hiệu ứng.
Kết xuất 3D: Chuyển đổi mô hình 3D và phân cảnh 3D thành hình ảnh hoặc video
2D.
Công cụ:
Autodesk Maya: Phần mềm mô hình, hoạt hình và render 3D chuyên nghiệp, được
sử dụng trong phim ảnh, trò chơi điện tử và hiệu ứng hình ảnh.

Blender: Phần mềm mô hình, hoạt hình và render 3D miễn phí và mã nguồn mở, có
chức năng tương tự như Maya.
Cinema 4D: Phần mềm mô hình, hoạt hình và render 3D dễ sử dụng, phù hợp cho
người mới bắt đầu.

Unreal Engine: Công cụ phát triển trò chơi 3D mạnh mẽ, cung cấp môi trường
hoàn chỉnh để tạo ra các trò chơi, trải nghiệm thực tế ảo và ứng dụng tương tác.

Ứng dụng:
 Phim ảnh: Tạo hiệu ứng hình ảnh, mô phỏng môi trường, nhân vật 3D cho
phim ảnh.
 Trò chơi điện tử: Thiết kế thế giới trò chơi, nhân vật, vật phẩm và hiệu ứng.
 Kiến trúc: Thiết kế mô hình 3D cho tòa nhà, nội thất và cảnh quan.
 Kỹ thuật: Mô phỏng sản phẩm, quy trình sản xuất và đào tạo kỹ thuật.
 Y tế: Hình ảnh y tế 3D, mô phỏng phẫu thuật và lập kế hoạch điều trị.

Ngoài ra
 Hỗ trợ thiết kế
(CAD - Computer-Aided Design) - Đồ họa máy tính đã tạo ra một sự cách mạng trong
việc thiết kế và mô phỏng sản phẩm. Nó cho phép các kỹ sư và nhà thiết kế tạo ra mô
hình 3D chính xác, giúp cải thiện hiệu suất và chất lượng sản phẩm.
 Giáo dục và đào tạo
Trong lĩnh vực giáo dục, đồ họa máy tính cung cấp một công cụ mạnh mẽ để giảng dạy
và học tập. Nó tạo ra các hình ảnh và video trực quan để giúp học sinh và sinh viên hiểu
các khái niệm phức tạp dễ dàng hơn.
 Hỗ trợ biểu diễn thông tin
Đồ họa máy tính giúp biểu diễn thông tin một cách sinh động và hấp dẫn. Chúng giúp
người trình bày truyền đạt thông tin một cách rõ ràng và hiệu quả hơn thông qua các biểu
đồ, sơ đồ và infographics.
 Lĩnh vực giải trí và nghệ thuật
Trong lĩnh vực giải trí, đồ họa máy tính được sử dụng rộng rãi trong trò chơi điện tử để
tạo ra môi trường sống động và hấp dẫn. Nó cũng được áp dụng trong sản xuất phim hoạt
hình và video đồ họa quảng cáo.

 Giao diện đồ họa


Đồ họa máy tính thường được sử dụng để thiết kế giao diện người dùng (UI) và giao diện
trải nghiệm người dùng (UX). Chúng tạo ra các hiệu ứng động và trải nghiệm tương tác
hấp dẫn trên các ứng dụng, trang web và sản phẩm số.

Một số ví dụ của ứng dụng kỹ thuật đồ hoạ:


Chương 2: Thiết kế sản phẩm đồ họa 3D với openGL
2.1. Xây dựng ý tưởng thiết kế
Trong thế giới ngày nay, góc học tập không chỉ là nơi để nghỉ ngơi mà còn là nơi
thể hiện phong cách và cá nhân hóa không gian riêng của mỗi người. Với sự phát
triển của công nghệ và sự sáng tạo trong thiết kế, chúng ta có cơ hội biến những ý
tưởng tưởng chừng không thể thành hiện thực. Nhóm chọn đề tài thiết kế góc học tập
với mục tiêu tạo ra một không gian học tập và làm việc lý tưởng, phản ánh cá nhân và
thúc đẩy sự thoải mái và hạnh phúc của người sử dụng.

Trong đề tài này bao gồm:


 Tủ sách
 Lọ đựng bút
 Cửa sổ
 Bàn phím
 Ghế
 Cốc nước
 Cây PC
 Đèn học
 Bàn học
 Màn máy tính
2.2. Vẽ các đối tượng 3D với openGL
#include"glut.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

void initialize(void);
void display(void);
void reshape(int w, int h);
void keyboard(unsigned char key, int x, int y);
void idle(void);

void setLight0(bool flag);


void setLight1(bool flag);
void setLight2(bool flag);

GLfloat light_pos0[] = { 0, 25, -10, 1 };


GLfloat light_dir0[] = { 0, -1, 0 };
GLfloat light_cutoff0 = 45;
GLfloat light_amb0[] = { 0.2, 0.2, 0.2, 1.0 };
GLfloat light_dif0[] = { 0.4, 0.4, 0.4, 1.0 };
GLfloat light_spc0[] = { 1.0, 1.0, 1.0, 1.0 };

GLfloat light_pos1[] = { 10, 10, 10, 1 };


GLfloat light_dir1[] = { 0, -1, -1 };
GLfloat light_cutoff1 = 20;
GLfloat light_amb1[] = { 0.1, 0.3, 0.1, 1.0 };
GLfloat light_dif1[] = { 0.1, 0.7, 0.1, 1.0 };
GLfloat light_spc1[] = { 1.0, 1.0, 1.0, 1.0 };

GLfloat light_pos2[] = { 0, 10, -10, 1 };


GLfloat light_dir2[] = { 0, -1, 0 };
GLfloat light_cutoff2 = 50;
GLfloat light_amb2[] = { 0.2, 0.15, 0, 1.0 };
GLfloat light_dif2[] = { 0.8, 0.75, 0, 1.0 };
GLfloat light_spc2[] = { 1.0, 1.0, 0, 1.0 };
bool RoomLight = true;
bool Computer = false;

bool ChristmasTree = false;


int ChristmasTreeAng = 0;
bool ChristmasTreeLight = false;
bool ChristmasTreeJumpUp = true;
float ChristmasTreeJumpDis = 0;

bool CeilingLight = false;

bool Mouse = false;


bool MouseEyeBigger = true;
float MouseEyeScale = 1.0;
float MouseTrace[] = { 0,0,0 };

void setLight0(bool flag)


{

glLightfv(GL_LIGHT0, GL_POSITION, light_pos0);


glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light_dir0);
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, light_cutoff0);

glLightfv(GL_LIGHT0, GL_AMBIENT, light_amb0);


glLightfv(GL_LIGHT0, GL_DIFFUSE, light_dif0);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_spc0);

if (flag)
glEnable(GL_LIGHT0);
else
glDisable(GL_LIGHT0);
}

void setLight1(bool flag)


{
glLightfv(GL_LIGHT1, GL_POSITION, light_pos1);
glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, light_dir1);
glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, light_cutoff1);

glLightfv(GL_LIGHT1, GL_AMBIENT, light_amb1);


glLightfv(GL_LIGHT1, GL_DIFFUSE, light_dif1);
glLightfv(GL_LIGHT1, GL_SPECULAR, light_spc1);
if (flag)
glEnable(GL_LIGHT1);
else
glDisable(GL_LIGHT1);
}

void setLight2(bool flag)


{
glLightfv(GL_LIGHT2, GL_POSITION, light_pos2);
glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, light_dir2);
glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, light_cutoff2);

glLightfv(GL_LIGHT2, GL_AMBIENT, light_amb2);


glLightfv(GL_LIGHT2, GL_DIFFUSE, light_dif2);
glLightfv(GL_LIGHT2, GL_SPECULAR, light_spc2);

if (flag)
glEnable(GL_LIGHT2);
else
glDisable(GL_LIGHT2);
}

void initialize(void)
{
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

glEnable(GL_NORMALIZE);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
}

void display(void) // Here's Where We Do All The Drawing


{

setLight0(RoomLight);
setLight1(ChristmasTreeLight);
setLight2(CeilingLight);

glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
GLfloat matBlack[] = { 0, 0, 0, 1 };
GLfloat matWhite[] = { 1, 1, 1, 1 };
GLfloat matPink[] = { 1, 0.8, 0.2, 1 };
GLfloat matBrown[] = { 1, 0.6, 0.3, 1 };
GLfloat matYellowGreen[] = { 0.5, 1, 0.5, 1 };
GLfloat matRed[] = { 1, 0, 0, 1 };
GLfloat matGreen[] = { 0, 1, 0, 1 };
GLfloat matBlue[] = { 0, 0, 1, 1 };
GLfloat matSkyBlue[] = { 0.5, 1, 1, 1 };
GLfloat matYellow[] = { 1, 1, 0, 1 };
GLfloat matGold[] = { 0.4, 0.3, 0.1, 1 };
GLfloat matShininess[] = { 50 };

//back wall
glColor3f(0.6, 1, 1);
glMaterialfv(GL_FRONT, GL_AMBIENT, matSkyBlue);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matSkyBlue);
glMaterialfv(GL_FRONT, GL_SPECULAR, matSkyBlue);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
glBegin(GL_QUADS);
glVertex3f(10, 10, -20);
glVertex3f(-10, 10, -20);
glVertex3f(-10, -10, -20);
glVertex3f(10, -10, -20);
glEnd();

//top wall
glColor3f(0.9, 0.8, 0.7);
glMaterialfv(GL_FRONT, GL_AMBIENT, matWhite);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matWhite);
glMaterialfv(GL_FRONT, GL_SPECULAR, matWhite);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
glBegin(GL_QUADS);
glVertex3f(10, 10, -20);
glVertex3f(10, 10, 0);
glVertex3f(-10, 10, 0);
glVertex3f(-10, 10, -20);
glEnd();
//left wall
glColor3f(0.6, 1, 1);
glMaterialfv(GL_FRONT, GL_AMBIENT, matSkyBlue);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matSkyBlue);
glMaterialfv(GL_FRONT, GL_SPECULAR, matSkyBlue);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
glBegin(GL_QUADS);
glVertex3f(-10, 10, -20);
glVertex3f(-10, 10, 0);
glVertex3f(-10, -10, 0);
glVertex3f(-10, -10, -20);
glEnd();

//bottom wall
glColor3f(0.5, 0.45, 0.33);
glMaterialfv(GL_FRONT, GL_AMBIENT, matBlue);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matBlue);
glMaterialfv(GL_FRONT, GL_SPECULAR, matBlack);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
glBegin(GL_QUADS);
glVertex3f(-10, -10, -20);
glVertex3f(-10, -10, 0);
glVertex3f(10, -10, 0);
glVertex3f(10, -10, -20);
glEnd();

//right wall
glColor3f(0.6, 1, 1);
glMaterialfv(GL_FRONT, GL_AMBIENT, matSkyBlue);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matSkyBlue);
glMaterialfv(GL_FRONT, GL_SPECULAR, matSkyBlue);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
glBegin(GL_QUADS);
glVertex3f(10, -10, -20);
glVertex3f(10, -10, 0);
glVertex3f(10, 10, 0);
glVertex3f(10, 10, -20);
glEnd();

//Bed
glColor3f(1, 0.8, 0.2);
glMaterialfv(GL_FRONT, GL_AMBIENT, matBrown);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matBrown);
glMaterialfv(GL_FRONT, GL_SPECULAR, matWhite);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);

glPushMatrix();
glTranslatef(-6, -6, -19.5);
glScalef(8, 8, 1);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(-6, -7, -11.5);
glScalef(8, 1, 16);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(-6, -8.5, -4);
glScalef(8, 3, 1);
glutSolidCube(1);
glPopMatrix();

//Bed mattress
glPushMatrix();
glColor3f(1, 0.7, 0.7);
glMaterialfv(GL_FRONT, GL_AMBIENT, matPink);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matPink);
glMaterialfv(GL_FRONT, GL_SPECULAR, matWhite);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
glTranslatef(-6, -6, -11.5);
glScalef(8, 2, 16);
glutSolidCube(1);
glPopMatrix();

//cabin
glColor3f(1, 0.8, 0.1);
glMaterialfv(GL_FRONT, GL_AMBIENT, matBrown);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matBrown);
glMaterialfv(GL_FRONT, GL_SPECULAR, matBrown);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matGold);

glPushMatrix();
glTranslatef(6, -10, -18);
glScalef(8, 10, 4);
glutSolidCube(1);
glPopMatrix();
//computer
//bottom
glColor3f(0, 0, 0);
glPushMatrix();
glTranslatef(6, -5, -18);
glRotatef(0, 0, 1, 0);
glScalef(1, 0.1, 0.8);
glutSolidCube(1);
glPopMatrix();

//neck
glPushMatrix();
glTranslatef(6, -4.9, -18);
glRotatef(0, 0, 1, 0);
glScalef(0.1, 0.8, 0.1);
glutSolidCube(1);
glPopMatrix();
//screen
glPushMatrix();
glMaterialfv(GL_FRONT, GL_AMBIENT, matYellow);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matYellow);
glMaterialfv(GL_FRONT, GL_SPECULAR, matWhite);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
if (Computer) glMaterialfv(GL_FRONT, GL_EMISSION, matBlue);
glTranslatef(6, -3.6, -18);
glRotatef(0, 0, 1, 0);
glScalef(3, 1.8, 0.1);
glutSolidCube(1);
glPopMatrix();

//Brown desk
glColor3f(1, 0.6, 0.3);
glMaterialfv(GL_FRONT, GL_AMBIENT, matBrown);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matBrown);
glMaterialfv(GL_FRONT, GL_SPECULAR, matWhite);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);

glPushMatrix();
glTranslatef(8, -4.5, -6);
glScalef(4, 1, 12);
glutSolidCube(1);
glPopMatrix();
glPushMatrix();
glTranslatef(9.5, -7, -6);
glScalef(1, 6, 12);
glutSolidCube(1);
glPopMatrix();

//Teapot
glPushMatrix();
glColor3f(1, 1, 1);
glMaterialfv(GL_FRONT, GL_AMBIENT, matWhite);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matWhite);
glMaterialfv(GL_FRONT, GL_SPECULAR, matWhite);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
glTranslatef(7.5, -3.2, -10);
glRotatef(-135, 0, 1, 0);
glutWireTeapot(1);
glPopMatrix();

//ChristmasTree
GLUquadricObj* quadratic;
quadratic = gluNewQuadric();
gluQuadricNormals(quadratic, GLU_SMOOTH);
gluQuadricTexture(quadratic, GL_TRUE);

glPushMatrix();
glColor3f(0.5, 1, 0.5);
glMaterialfv(GL_FRONT, GL_AMBIENT, matYellowGreen);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matYellowGreen);
glMaterialfv(GL_FRONT, GL_SPECULAR, matWhite);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
glTranslatef(8, -2, -2);
glTranslatef(0, ChristmasTreeJumpDis, 0); //Jump animation
glRotatef(ChristmasTreeAng, 0, 1, 0); //Rotate animation

glPushMatrix();
glTranslatef(0, 1.5, 0);
glRotatef(270, 1, 0, 0);
glutSolidCone(0.8, 1, 20, 20); //layer1
glPopMatrix();

glPushMatrix();
glTranslatef(0, 0.5, 0);
glRotatef(270, 1, 0, 0);
glutSolidCone(1.2, 1.5, 16, 16); //layer2
glPopMatrix();

glPushMatrix();
glTranslatef(0, -0.8, 0);
glRotatef(270, 1, 0, 0);
glutSolidCone(1.5, 2, 16, 16); //layer3
glPopMatrix();

glColor3f(205 / 255, 200 / 255, 200 / 255);


glPushMatrix(); //trunk
glTranslatef(0, -0.8, 0);
glRotatef(90, 1, 0, 0);
gluCylinder(quadratic, 0.3, 0.5, 1, 20, 20);
glPopMatrix();

glColor3f(1, 1, 1);
glPushMatrix(); //branch
glTranslatef(1.3, -0.5, 0);
glRotatef(90, 1, 0, 0);
gluCylinder(quadratic, 0.2, 0.2, 0.3, 20, 20);
glPopMatrix();

glPopMatrix();

glPushMatrix();
glTranslatef(0, -10, -19.99);
glPushMatrix(); //Mice hole
glColor3f(0, 0, 0);
glMaterialfv(GL_FRONT, GL_AMBIENT, matBlack);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matBlack);
glMaterialfv(GL_FRONT, GL_SPECULAR, matBlack);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
glScalef(1, 1.5, 1);
gluDisk(quadratic, 0, 1, 16, 5);
glPopMatrix();
glPushMatrix(); //Mice eye
glColor3f(1, 1, 0);
glMaterialfv(GL_FRONT, GL_AMBIENT, matYellow);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matYellow);
glMaterialfv(GL_FRONT, GL_SPECULAR, matYellow);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matYellow);
glTranslatef(0.5, 0.5, 0.01);
glTranslatef(MouseTrace[0], MouseTrace[1], MouseTrace[2]);
glScalef(MouseEyeScale, MouseEyeScale, 1); //control the size of mouse eyes
gluDisk(quadratic, 0, 0.1, 8, 1);
glPopMatrix();
glPushMatrix(); //Mice eye
glTranslatef(-0.5, 0.5, 0.01);
glTranslatef(MouseTrace[0], MouseTrace[1], MouseTrace[2]); //control the size of
mouse eyes
glScalef(MouseEyeScale, MouseEyeScale, 1);
gluDisk(quadratic, 0, 0.1, 8, 1);
glPopMatrix();
if (Mouse) {
glPushMatrix(); //Mice Body
glColor3f(0, 0, 0);
glMaterialfv(GL_FRONT, GL_AMBIENT, matBlack);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matBlack);
glMaterialfv(GL_FRONT, GL_SPECULAR, matBlack);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
glTranslatef(0, 0, -1);
glTranslatef(MouseTrace[0], MouseTrace[1], MouseTrace[2]);
glScalef(1, 1, 1.7);
glutSolidSphere(0.8, 16, 16);
glPopMatrix();
}
glPopMatrix();

glPushMatrix(); //Celling Light


glColor3f(1, 1, 0);
glMaterialfv(GL_FRONT, GL_AMBIENT, matYellow);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matYellow);
glMaterialfv(GL_FRONT, GL_SPECULAR, matWhite);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matBlack);
if (CeilingLight) glMaterialfv(GL_FRONT, GL_EMISSION, matYellow);
glTranslatef(0, 9.0, -10);
glRotatef(270, 1, 0, 0);
glutSolidCone(1, 1, 16, 16);
glPopMatrix();

// TODO:
// Add animation here

glFlush();
glutSwapBuffers();
}

void reshape(int w, int h)


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

gluPerspective(65, (GLfloat)w / (GLfloat)h, 1.0, 100.0);

gluLookAt(0.0, 0.0, 15, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);


}

void keyboard(unsigned char key, int x, int y)


{
switch (key)
{

case'\033'://press 'esc' to quit


exit(0);
break;

case'1':
RoomLight = !RoomLight;
printf("Press key '1'.\n");
break;
case'2':
CeilingLight = !CeilingLight;
printf("Press key '2'.\n");
break;
case'3':
ChristmasTreeLight = !ChristmasTreeLight;
if (!ChristmasTreeLight) ChristmasTreeJumpDis = 0;
printf("Press key '3'.\n");
break;
case'4':
ChristmasTree = !ChristmasTree;
if (!ChristmasTree) ChristmasTreeJumpDis = 0;
printf("Press key '4'.\n");
break;
case'5':
if (!RoomLight && !CeilingLight && !ChristmasTreeLight)
Mouse = !Mouse;
printf("Press key '5'.\n");
break;
case'6':
Computer = !Computer;
printf("Press key '6'.\n");
break;
}

if (RoomLight || CeilingLight || ChristmasTreeLight)


Mouse = false;
}

void idle(void)
{
if (ChristmasTree) {
if (!ChristmasTreeLight)
ChristmasTreeAng = ++ChristmasTreeAng % 360;
else {
if (ChristmasTreeJumpUp) {
ChristmasTreeJumpDis += 0.1;
if (ChristmasTreeJumpDis >= 1) ChristmasTreeJumpUp = false;
}
else {
ChristmasTreeJumpDis -= 0.1;
if (ChristmasTreeJumpDis <= 0) ChristmasTreeJumpUp = true;
}
}
}
if (!Mouse) { //control the size of mouse eyes
if (MouseEyeBigger) {
MouseEyeScale += 0.2;
if (MouseEyeScale >= 3) MouseEyeBigger = false;
}
else {
MouseEyeScale -= 0.2;
if (MouseEyeScale <= 0) MouseEyeBigger = true;
}
MouseTrace[0] = MouseTrace[1] = MouseTrace[2] = 0;
}
else {
MouseEyeScale = 1;
MouseTrace[2] += 0.5;
if (MouseTrace[2] < 10)
MouseTrace[0] += 0.3;
else
MouseTrace[0] -= 0.3;
if (MouseTrace[2] > 25)
MouseTrace[0] = MouseTrace[1] = MouseTrace[2] = 0;
}
Sleep(10);
glutPostRedisplay();
}

int main(int argc, char** argv)


{

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);

glutInitWindowSize(600, 600);
glutInitWindowPosition(100, 100);
glutCreateWindow("3D ROOM");

initialize();

glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutIdleFunc(idle);

glutMainLoop();
2.3. Kết quả:
Chương 3 : Kết luận
3.1 Các nội dung đã đạt được
 Khung cảnh góc học tập 3D:
 Hoàn thành mô hình 3D cơ bản của các vật dụng nội thất trong góc học tập như
bàn học, ghế, đèn, cây thông,...
 Thiết lập được kích thước, vị trí hiển thị cửa sổ.
 Hệ thống chiếu sáng:
- Áp dụng các kỹ thuật chiếu sáng OpenGL như chiếu sáng môi trường, chiếu sáng
cục bộ, chiếu sáng phản xạ,... để tạo ra hiệu ứng ánh sáng chân thực trong phòng ngủ.
- Thiết lập được các giá trị thuộc tính phù hợp cho nguồn sáng môi trường, các giá
trị thuộc tính phù hợp cho nguồn sáng Spot Light.
 Hiệu ứng camera:
 Áp dụng các kỹ thuật camera OpenGL như camera di chuyển, camera xoay,... để
tạo ra các góc nhìn khác nhau trong phòng ngủ.
 Sử dụng các kỹ thuật điều khiển bằng bàn phím để cho phép người dùng tương tác
với môi trường phòng ngủ như bật/tắt từng nguồn sáng, bật/tắt tất cả các nguồn sáng,thay
đổi hướng chiếu của nguồn sáng
 Giao diện người dùng:
- Tạo ra một giao diện người dùng đơn giản cho phép người dùng điều khiển
camera, ánh sáng và các vật dụng nội thất trong phòng ngủ.
- Sử dụng các thư viện giao diện người dùng như GLUT hoặc GLFW để tạo ra giao
diện người dùng.
 Tối ưu hóa hiệu suất:
 Tối ưu hóa mô hình 3D và các thuật toán đồ họa để cải thiện hiệu suất chương
trình.
 Sử dụng các kỹ thuật tối ưu hóa bộ nhớ và bộ xử lý để giảm thiểu thời gian tải và
chạy chương trình.
 Bài tập lớn thiết kế phòng ngủ OpenGL đã đạt được các nội dung cơ bản như mô
hình 3D, hệ thống chiếu sáng, hiệu ứng camera, giao diện người dùng và tối ưu hóa hiệu
suất. Tuy nhiên, vẫn còn một số nội dung có thể được cải thiện further như:
 Thêm các chi tiết trang trí và phụ kiện cho góc học tập
 Thêm các hiệu ứng âm thanh để tạo ra bầu không khí chân thực trong phòng ngủ.
3.2. Bài học kinh nghiệm:
 Lập kế hoạch và quản lý thời gian:
 Chia nhỏ bài tập thành các phần nhỏ: Do là nhóm 4 người, nên chia nhỏ bài tập
thành các phần nhỏ và giao cho từng thành viên trong nhóm phụ trách một phần. Điều
này sẽ giúp phân chia công việc hợp lý và đảm bảo rằng mỗi thành viên đều có trách
nhiệm hoàn thành phần việc của mình.
 Đặt ra thời hạn cho từng phần: Sau khi chia nhỏ bài tập, hãy đặt ra thời hạn cho
từng phần. Điều này sẽ giúp nhóm theo dõi tiến độ và đảm bảo rằng nhóm đang hoàn
thành bài tập đúng hạn.
 Sử dụng công cụ quản lý dự án: Có rất nhiều công cụ quản lý dự án có sẵn để giúp
nhóm theo dõi tiến độ và hoàn thành bài tập đúng hạn. Một số công cụ phổ biến bao gồm
Trello, Asana, và Jira.
 Giao tiếp và hợp tác:
 Giao tiếp thường xuyên: Giao tiếp thường xuyên giữa các thành viên trong nhóm
là rất quan trọng để đảm bảo rằng mọi người đều hiểu rõ nhiệm vụ của mình và đang làm
việc hiệu quả. Nhóm nên tổ chức các cuộc họp thường xuyên để thảo luận về tiến độ, giải
quyết vấn đề và đưa ra quyết định.
 Sử dụng công cụ giao tiếp: Có rất nhiều công cụ giao tiếp có sẵn để giúp nhóm
giao tiếp hiệu quả. Một số công cụ phổ biến bao gồm Slack, Zoom, và Google Meet.
 Chia sẻ kiến thức và kinh nghiệm: Mỗi thành viên trong nhóm đều có những kiến
thức và kinh nghiệm riêng. Nhóm nên chia sẻ kiến thức và kinh nghiệm của mình với
nhau để học hỏi lẫn nhau và cải thiện hiệu quả công việc.
 Sử dụng các công cụ và thư viện phù hợp:
 Nghiên cứu các công cụ và thư viện OpenGL: Có rất nhiều công cụ và thư viện
OpenGL có sẵn để giúp nhóm hoàn thành bài tập lớn. Nhóm nên dành thời gian để
nghiên cứu các công cụ và thư viện này và chọn những công cụ phù hợp với nhu cầu của
nhóm.
 Học cách sử dụng các công cụ và thư viện: Sau khi chọn được các công cụ và thư
viện phù hợp, nhóm nên dành thời gian để học cách sử dụng chúng. Có rất nhiều tài
nguyên trực tuyến và sách hướng dẫn có thể giúp nhóm học cách sử dụng các công cụ và
thư viện này.
 Sử dụng các ví dụ và hướng dẫn: Có rất nhiều ví dụ và hướng dẫn có sẵn trực
tuyến để giúp nhóm học cách sử dụng các công cụ và thư viện OpenGL. Nhóm nên tận
dụng các ví dụ và hướng dẫn này để học cách thực hiện các tác vụ cụ thể.
 Kiểm tra và sửa lỗi kỹ lưỡng:
 Kiểm tra chương trình của nhóm thường xuyên: Khi nhóm đang thực hiện bài tập,
hãy kiểm tra chương trình của nhóm thường xuyên để đảm bảo rằng nó hoạt động chính
xác. Nhóm có thể sử dụng các công cụ gỡ lỗi để tìm và sửa lỗi trong chương trình của
nhóm.
 Kiểm tra chương trình của nhóm trên nhiều hệ thống: Sau khi hoàn thành bài tập,
hãy kiểm tra chương trình của nhóm trên nhiều hệ thống khác nhau để đảm bảo rằng nó
hoạt động tốt trên mọi hệ thống.
 Sử dụng các công cụ kiểm tra chất lượng: Có rất nhiều công cụ kiểm tra chất
lượng có sẵn để giúp nhóm tìm lỗi trong chương trình của nhóm. Một số công cụ phổ
biến bao gồm Coverity, SonarQube, và Static Code Analysis.

 Học hỏi từ kinh nghiệm của bản thân:


 Phản ánh về quá trình làm bài tập: Sau khi hoàn thành bài tập, nhóm nên dành thời
gian để phản ánh về quá trình làm bài tập. Xác định những điểm mạnh và điểm yếu của
nhóm và tìm cách cải thiện trong những bài tập sau.
 Chia sẻ kinh nghiệm của nhóm với những người khác: Chia sẻ kinh nghiệm của
nhóm với những nhóm lập trình viên khác để họ có thể học hỏi từ nhóm. Nhóm có thể
chia sẻ kinh nghiệm của nhóm trên các diễn đàn trực tuyến, trong các nhóm lập trình,
hoặc tại các hội nghị.

You might also like