Professional Documents
Culture Documents
chương1tkdhmtm
chương1tkdhmtm
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
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:
+ Ý 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
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.
void initialize(void);
void display(void);
void reshape(int w, int h);
void keyboard(unsigned char key, int x, int y);
void idle(void);
if (flag)
glEnable(GL_LIGHT0);
else
glDisable(GL_LIGHT0);
}
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);
}
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(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();
// TODO:
// Add animation here
glFlush();
glutSwapBuffers();
}
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;
}
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();
}
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.