Code xây dựng một số đồ dùng trong phòng làm việc...82.. Hiển thị...17 Trang 3 LỜI NÓI ĐẦUĐồ họa 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
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
- -BÀI TẬP LỚN
ĐỒ HOẠ MÁY TÍNH
Đề tài: Mô phỏng hoạt động của một số đồ dùng trong phòng làm việc
Hà nội, năm 2021
Giảng viên hướng dẫn: Ths Vũ Minh Yến Nhóm thực hiện: Nhóm 5
Thành viên trong nhóm: Trần Ngọc Hải
Lưu Thị Minh Tú Đặng Thị Thu Huế
Trang 2Mục Lục
I Mô phỏng hoạt động 4
1 Hoạt động cơ bản 4
2 Hoạt động chi tiết 4
II Cách thực hiện 8
1 Code xây dựng một số đồ dùng trong phòng làm việc 8
2 Code phép chiếu, góc nhìn camera 16
3 Hiển thị 17
III Kết quả đạt được 19
Trang 3LỜI NÓI ĐẦU
Đồ họa 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
Đồ họa máy tính ngày nay được ứng dụng rất rộng rãi trong nhiều lĩnh vực khoa học, kĩ thuật, nghệ thuật, kinh doanh, quản lí, … Các ứng dụng đồ họa rất đa dạng, phong phú và phát triển liên tục không ngừng Ngày nay, hầu như không có chương trình ứng dụng nào mà không sử dụng kĩ thuật đồ họa
để làm tăng tính hấp dẫn của mình.
Việc mô tả dữ liệu thông qua các hình ảnh và màu sắc đa dạng của nó, các chương trình đồ họa thường thu hút người sử dụng bởi tính thân thiện, dễ dùng, … kích thích khả năng sáng tạo và nâng cao năng suất làm việc
Chúng em được tìm hiểu và làm quen với một số kĩ thuật đồ họa trên máy tính thông qua tài liệu, bài giảng do cô giáo Vũ Minh Yến giảng dạy Với
những kiến thức đã học chúng em quyết định chọn đề tài: Mô phỏng hoạt
động của một số đồ dùng trong phòng làm việc
Trang 4I Mô phỏng hoạt động
1 Hoạt động cơ bản
Xây dựng mô hình phòng làm việc
Xây dựng chuyển động của các vật trong cửa hàng
Xây dựng góc nhìn thay đổi
Cửa hàng có thể quay 360 độ
2 Hoạt động chi tiết
{
// keyboard handler
switch (key) {
break;
//case 1,2 điều khiển quạt case'1':
xoayquat += 5;
glutPostRedisplay();
break;
case'2':
glutPostRedisplay();
break;
case'3':
// mở ngăn kéo trên
theta[5] += 0.01f;
glutPostRedisplay();
break;
case'4':
// đóng ngăn kéo trên
theta[5] -= 0.01f;
glutPostRedisplay();
break;
case'5':
// mở ngăn kéo dưới
theta[6] += 0.01f;
glutPostRedisplay();
break;
case'6':
// đóng ngăn kéo dưới
theta[6] -= 0.01f;
glutPostRedisplay();
break;
case'0':
Trang 5//xoay ghế hình tròn sang phải
theta[7] += 5.0f;
glutPostRedisplay();
break;
case'7':
//xoay ghế hình tròn sang trái
theta[8] -= 5.0f;
glutPostRedisplay();
break;
case'8':
//nâng ghế
chan_ghe_y += 0.01f;
glutPostRedisplay();
break;
case'9':
//hạ thấp ghế
chan_ghe_y -= 0.01f;
glutPostRedisplay();
break;
case'q':
//di chuyển sang trái
theta[9] -= 0.05f;
glutPostRedisplay();
break;
case'w':
//di chuyển sang phải
theta[10] += 0.05f;
glutPostRedisplay();
break;
case'e':
//di chuyển về phía trước
theta[11] -= 0.05f;
glutPostRedisplay();
break;
case'r':
//di chuyển ra sau
theta[12] += 0.05f;
glutPostRedisplay();
break;
//điều khiển phóng to thu nhỏ (l, r, top ,bottom, zNear, zFar :biến khởi tạo camera)
case'x':
l *= 1.1f; r *= 1.1f;
break;
case'X':
l *= 0.9f; r *= 0.9f;
break;
Trang 6case'y':
bottom *= 1.1f; top *= 1.1f;
break;
case'Y':
bottom *= 0.9f; top *= 0.9f;
break;
case'z':
zNear *= 1.1f; zFar *= 1.1f;
break;
case'Z':
zNear *= 0.9f; zFar *= 0.9f;
break;
case' ':
// reset values to their defaults
l = -0.8;
r = 0.8;
bottom = -0.8;
top = 0.8;
zNear = 1.9;
zFar = 4.0;
theta[5] = 0;
theta[6] = 0;
theta[13] = 0;
theta[14] = 0;
theta[15] = 0;
break;
//z
case'a':
theta[13] += 5;
break;
case'd':
theta[13] -= 5;
break;
//y
case'c':
theta[14] += 5;
break;
case's':
theta[14] -= 5;
break;
//x
case'h':
theta[15] += 5;
break;
case'g':
Trang 7theta[15] -= 5;
break; }
glutPostRedisplay();
}
- Khi ấn phím ‘1’, ấn 1 lần quạt sẽ quay 5o
- Khi ấn phím ‘2’, khi quạt đứng yên ấn 1 lần quạt sẽ tự động quay, ấn thêm lần nữa quạt sẽ dừng
- Khi ấn ‘3’, ngăn kéo trên của bàn sẽ mở
- Khi ấn ‘4’, ngăn kéo trên của bàn sẽ đóng
- Khi ấn ‘5’, ngăn kéo dưới của bàn sẽ mở
- Khi ấn ‘6’, ngăn kéo dưới của bàn sẽ đóng
- Khi ấn ‘0’, ghế sẽ xoay sang phải
- Khi ấn ‘7’, ghế sẽ xoay sang trái
- Khi ấn ‘8’, ghế sẽ nâng lên
- Khi ấn ‘9’, ghế sẽ hạ thấp xuống
- Khi ấn ‘q’, ghế sẽ di chuyển sang trái
- Khi ấn ‘w’, ghế sẽ di chuyển sang phải
- Khi ấn ‘e’, ghế sẽ di chuyển lên phía trước
- Khi ấn ‘r’, ghế sẽ di chuyển ra sau
- Khi ấn ‘X’ cửa hàng phóng to theo trục x, ấn ‘x’ cửa hàng thu nhỏ theo trục x
- Khi ấn ‘Y’ cửa hàng phóng to theo trục y, ấn ‘y’ cửa hàng thu nhỏ theo trục y
- Khi ấn ‘Z’ cửa hàng phóng to theo trục z, ấn ‘z’ cửa hàng thu nhỏ theo trục z
- Khi ấn ‘ ’ kích thước phòng sẽ được reset lại như ban đầu
- Khi ấn ‘h’, ‘g’ cửa hàng nội thất quay 360 độ theo trục x
- Khi ấn ‘w’, ‘s’ cửa hàng nội thất quay 360 độ theo trục y
- Khi ấn ‘a’, ‘d’ cửa hàng nội thất quay 360 độ theo trục z
Trang 8II Cách thực hiện
1 Code xây dựng phòng làm việc
a Code căn phòng
/* - DỰNG HÌNH CĂN PHÒNG
- */
// hàm biến đổi khối hình lập phương thành bức tường mong muốn
GLfloatheight_wall, GLfloatdepth_wall)
{
depth_wall);
glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product);
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * instance);
}
// hàm vẽ căn phòng
{
GLfloat x = 0.0f, y = -height_wall * 0.5, z = 0.0f;
// hàm vẽ sàn > sàn có thể quay quanh trục ox
wall_room(x, y, z, width_wall, height_wall, depth_wall);
// hàm vẽ tường sau > sàn có thể quay quanh trục oy
// make 3 giá trị x,y,z để tạo tường sau qua hàm wall_room
x = 0.0f;
y = height_wall1 * 0.5 - height_wall;
z = depth_wall * 0.5;
tường (như trên)
// hàm vẽ tường trái
x = -width_wall * 0.5;
y = height_wall2 * 0.5 - height_wall;
z = 0.0f;
wall_room(x, y, z, width_wall2, height_wall2, depth_wall2);
}
Trang 9b Code quạt trần
/* - QUẠT TRẦN - */
// thuộc tính của quạt trần
GLfloat CANH_DAI = 0.4, CANH_RONG = 0.2, CANH_CAO = 0.02,
DINH_DAI = 0.05, DINH_RONG = 0.05, DINH_CAO = 0.05,
DAY_DAI = 0.05, DAY_RONG = 0.05, DAY_CAO = 0.05,
TRUC_DAI = 0.05, TRUC_RONG = 0.04, TRUC_CAO = 0.2,
NOI_DAI = 0.05, NOI_RONG = 0.02, NOI_CAO = 0.05;
GLfloat xoayquat = 0;
GLboolean checked = false;//Kiểm tra quạt có hoạt động hay không
{
DAY_RONG);
glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product);
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance);
}
{
CANH_DAI / 2, DAY_CAO / 2, 0)
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance);
}
{
// xoay quanh trục y 120 + độ xoay quạt
+ CANH_DAI / 2, DAY_CAO / 2, 0)
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance);
}
{
+ CANH_DAI / 2, DAY_CAO / 2, 0)
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance);
}
Trang 10void truc()
{
Scale(TRUC_DAI, TRUC_CAO, TRUC_RONG);
glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product);
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance);
}
{
Scale(DINH_DAI, DINH_CAO, DINH_RONG);
glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product);
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance);
}
{
xoayquat += 3;
canh_1();
canh_2();
canh_3();
glutPostRedisplay();
}
else { // nếu checker == false -> biến xuay quạt vẫn giữ nguyên giá trị
canh_1();
canh_2();
canh_3();
}
}
// tạo quạt
{
// quạt là mô hình 1 cấp (ko cha con) nhưng có thể quay tự động theo phím
2
}
Trang 11c Code bàn làm việc
/* - BÀN LÀM VIỆC
- */
// khai báo giá trị các thành phần của bàn
GLfloat mat_x = 0.5f, mat_y = 0.015f, mat_z = 0.25f;
GLfloat thanh_x = 0.015f, thanh_y = 0.2f, thanh_z = 0.25f;
// khai báo số đo của ngắn kéo tủ
GLfloat thanh_keo_x = 0.01f, thanh_keo_y = 0.08f, thanh_keo_z = 0.25f;
GLfloat cua_keo_x = 0.2f + 0.5 * thanh_x, cua_keo_y = 0.08, cua_keo_z = 0.01f;
GLfloat de_keo_x = 0.2f - thanh_x, de_keo_y = 0.01f, de_keo_z = 0.25f;
// xây dựng khung ngăn kéo
height, GLfloatdepth)
{
glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product);
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl *
}
//xây dựng bàn
height, GLfloatdepth)
{
glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product);
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl *
}
// xây dựng ngăn kéo
// lí do lấy ban1 để xây dựng là vì 2 cạnh bàn làm luôn cạnh của ngăn kéo
{
GLfloat x = 0.0f, y = 0.0f, z = 0.0f;
// hai bên thành ngăn bàn
Trang 12x = (0.5 * cua_keo_x - thanh_x); y = 0.5 * thanh_keo_y; z = 0.0f;
Ban1(x, y, z, thanh_keo_x, thanh_keo_y, thanh_keo_z);
Ban1(-x, y, z, thanh_keo_x, thanh_keo_y, thanh_keo_z);
// cánh cửa mặt trước ngăn kéo
x = 0.0f; y = 0.5 * cua_keo_y; z = -(0.5 * thanh_keo_z);
Ban1(x, y, z, cua_keo_x, cua_keo_y, cua_keo_z);
// tay nắm ngăn bàn
z -= 0.015f;
Ban(x, y, z, 0.06f, 0.01f, 0.01f);
// cánh cửa mặt sau ngăn bàn
x = 0.0f; y = 0.5 * cua_keo_y; z = (0.45 * thanh_keo_z);
Ban1(x, y, z, cua_keo_x, cua_keo_y, cua_keo_z);
// đế ngăn bàn
x = 0.0f; y = 0.5 * de_keo_y; z = 0.0f;
Ban1(x, y, z, de_keo_x, de_keo_y, de_keo_z);
}
{
GLfloat x = 0.0f, y = 0.0f, z = 0.0f;
// mặt bàn
x = 0.0f; y = 0.5 * mat_y + thanh_y; z = 0.0f;
Ban(x, y, z, mat_x, mat_y, mat_z);
// ba thanh bàn
x = -(0.5 * mat_x - 0.5 * thanh_x); y = 0.5 * thanh_y; z = 0.0f;
Ban(x, y, z, thanh_x, thanh_y, thanh_z);
Ban(-x, y, z, thanh_x, thanh_y, thanh_z);
x = 0.1 * mat_x;
Ban(x, y, z, thanh_x, thanh_y, thanh_z);
// phần ngăn kéo bàn
x = 0.1 * mat_x + 0.2 * mat_x - 0.5 * thanh_x; y = thanh_y - 0.04f - 0.5 * thanh_keo_y; z = 0.0f;
ngan_keo_ban();
ngan_keo_ban();
}
Trang 13d Code bộ máy tính
/* - MÀN HÌNH MÁY TÍNH & CÂY MÁY
TÍNH - */
GLfloatheight, GLfloatdepth)
{
glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product);
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance);
}
//chỉnh màu cây máy tính
GLfloatheight, GLfloatdepth)
{
glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product);
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance);
}
GLfloat de_may_x = 0.08f, de_may_y = 0.005f, de_may_z = 0.015f;
GLfloat chan_may_x = 0.015f, chan_may_y = 0.1f, chan_may_z = 0.015f;
GLfloat man_hinh_x = 0.2f, man_hinh_y = 0.1f, man_hinh_z = 0.01f;
GLfloat phim_x = 0.15f, phim_y = 0.01f, phim_z = 0.06f;
{
GLfloat x = 0.0f, y = 0.0f, z = 0.0f;
// đế màn hình
// cái dấu + ở phía chân màn hình ấy
// phần này fix cứng, ko có chuyển động
x = 0.0f; y = 0.5 * de_may_y; z = 0.0f;
ManHinh(x, y, z, de_may_x, de_may_y, de_may_z);
ManHinh(x, y, z, de_may_x, de_may_y, de_may_z);
// thanh đỡ màn hình -> tĩnh
x = 0.0f; y = de_may_y + 0.5 * chan_may_y; z = 0.0f;
ManHinh1(x, y, z, chan_may_x, chan_may_y, chan_may_z);
// màn hình -> tĩnh
Trang 14x = 0.0f; y = de_may_y + chan_may_y; z = -(cos(M_PI / 6) * chan_may_y) + 0.08;
ManHinh(x, y, z, man_hinh_x, man_hinh_y, man_hinh_z);
}
{
// tĩnh
ManHinh1(0.0f, 0.5 * phim_y, 0.0f, phim_x, phim_y, phim_z);
}
// tĩnh
{
ManHinh1(0.0f, 0.15, 0.0f, 0.04f, 0.18f, phim_x);
}
e Code ghế ngồi
/* - GHẾ NGỒI - */
height, GLfloatdepth)
{
height, depth);
glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product);
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl *
}
GLfloat de_ghe_x = 0.1f, de_ghe_y = 0.015f, de_ghe_z = 0.1f;
GLfloat chan_ghe_x = 0.015f, chan_ghe_y = 0.1f, chan_ghe_z = 0.015f;
GLfloat than_de_x = 0.15f, than_de_y = 0.015f, than_de_z = 0.12f;
GLfloat tua_lung_x = 0.15f, tua_lung_y = 0.2f, tua_lung_z = 0.015f;
GLfloat tua_tay_x = 0.02f, tua_tay_y = 0.02f, tua_tay_z = 0.1f;
{
GLfloat x = 0.0f, y = 0.5 * de_ghe_y, z = 0.0f;
Trang 15di_chuyen_ghe = Translate(theta[9] + theta[10], 0.0f, theta[11] + theta[12]);
// cái theta trong keyboard này
// đế ghế (đáy ghế) -> cha
Ghe(x, y, z, de_ghe_x, de_ghe_y, de_ghe_z);
// chân ghế -> con của thằng đáy ghế
x = 0.0f, y = de_ghe_y + 0.5 * chan_ghe_y, z = 0.0f;
Ghe(x, y, z, chan_ghe_x, chan_ghe_y, chan_ghe_z);
// code quay ghế
0.0f)
+ chan_ghe_y + 0.5 * than_de_y), 0.0f);
// đế ngồi > con của thằng chân ghế, cháu của đáy ghế
x = 0.0f, y = de_ghe_y + chan_ghe_y + 0.5 * than_de_y, z = 0.0f;
Ghe(x, y, z, than_de_x, than_de_y, than_de_z);
// tựa lưng -> con của thằng chân ghế, cháu của đáy ghế
Translate(0.0f, 0.5 * tua_lung_y, 0.0f);
x = 0.0f, y = de_ghe_y + chan_ghe_y + 0.5 * than_de_y + 0.5 * tua_lung_y,
z = 0.5 * de_ghe_z;
Ghe(x, y, z, tua_lung_x, tua_lung_y, tua_lung_z);
// tựa tay >con của thằng chân ghế, cháu của đáy ghế
x = 0.5 * tua_lung_x - 0.5 * tua_tay_x, y = de_ghe_y + chan_ghe_y +
Ghe(x, y, z, tua_tay_x, tua_tay_y, tua_tay_z);
Ghe(-x, y, z, tua_tay_x, tua_tay_y, tua_tay_z);
}
f Code bức tranh
/* - VẼ BỨC TRANH
- */
// tĩnh
{
glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product);
Trang 16glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance);
}
{
glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product);
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance_lk
}
{
//vẽ trụ
demoChong(0.02f, 0.1f, 0.01f);
//vẽ cánh 1
demoChong(0.02f, 0.05f, 0.01f);
demoChong(0.02f, 0.05f, 0.01f);
}
2 Code phép chiếu, góc nhìn camera
// Các tham số cho projection
GLfloat eye_x = 2.0, eye_y = 1.0, eye_z = -1.5;
GLfloat l = -0.8, r = 0.8;
GLfloat bottom = -0.8, top = 0.8;
GLfloat zNear = 1.9, zFar = 4.0;
// Phép chiếu phối cảnh,vị trí đặt cam,hướng nhìn
point4 eye(eye_x, eye_y, eye_z, 1.0);
point4 at(0.0, 0.0, 0.0, 1.0);
glUniformMatrix4fv(view_loc, 1, GL_TRUE, view);
glUniformMatrix4fv (projection_loc, 1, GL_TRUE , p);
Trang 173 Hiển thị
{
hàm quay xung quanh (view của phòng -x-y-z)
// dùng chung transl để make vị trí
//model = identity() * RotateX(-30) * RotateY(60);
// vẽ phòng
room_build();
// vẽ quạt
tao_quat();
// vẽ bàn làm việc
ban_build();
// vẽ màn hình máy tính
ManHinh_Build();
//vẽ bàn phím
BanPhim_Build();
//vẽ cây máy tính
// vẽ ghế ngồi
RotateY(90);
Build_Ghe();
//vẽ bức tranh 1 trên bàn máy tính
-0.4f);
buctranh(0.02, 0.25, 0.25);
chongchong();
//vẽ bức tranh 2
width_wall2, 0.6f, -0.1f);
buctranh(0.02, 0.3, 0.5);
Trang 18chongchong();
chongchong();
//
point4 eye(eye_x, eye_y, eye_z, 1.0);
point4 at(0.0, 0.0, 0.0, 1.0);
glUniformMatrix4fv(view_loc, 1, GL_TRUE, view);
glUniformMatrix4fv(projection_loc, 1, GL_TRUE, p); glutSwapBuffers();
}
III Kết quả đạt được
Trang 19KẾT LUẬN
Qua việc thực hiện nghiên cứu đề tài “Mô phỏng hoạt động của một số
đồ dùng trong phòng làm việc”, nhóm chúng em đã được biết thêm rất nhiều về môn đồ họa máy tính Bên cạnh đó, việc làm nghiên cứu giúp chúng em đoàn kết hơn, rèn luyện cho chúng em kỹ năng làm việc nhóm.
Trong quá trình thực hiện đề tài có rất nhiều ý tưởng hay, độc đáo Nhưng do kiến thức của chúng em hạn hẹp và thời gian không cho phép nên chúng em chưa thể thực hiện được những ý tưởng đó Tuy nhiên chúng em đã cố gắng để xây dựng một chương trình hoàn chỉnh nhất, đẹp nhất Trong quá trình xây dựng chương trình, nhóm chúng em khó tránh khỏi những sai sót Vì vậy em rất mong rằng cô và các bạn cùng góp ý với nhóm em để có thể hoàn thành sản phẩm một cách hoàn chỉnh nhất.
Chúng em xin cảm ơn cô Vũ Minh Yến đã tận tình giảng dạy chúng em trong môn Đồ họa máy tính Giúp đỡ chúng em trong quá trình nghiên cứu đề tài.Chia sẻ những tài liệu hay về thư viện OpenGl cũng như các
kĩ năng lập trình.
Chúng em xin chân thành cảm ơn!