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
lOMoARcPSD|39150642 TRƯỜ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 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ế Hà nội, năm 2021 Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 Mụ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 Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 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á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 Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 I 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 void keyboard(unsigned char key, int x, int y) { // keyboard handler switch (key) { case 033: // 033 is Escape key octal value program exit(1); // quit // thay đổi giá trị true - false break; //case 1,2 điều khiển quạt case '1': xoayquat += 5; glutPostRedisplay(); break; case '2': checked = !checked; 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': Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 //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ế if (chan_ghe_y > thanh_y) break; chan_ghe_y += 0.01f; glutPostRedisplay(); break; case '9': //hạ thấp ghế if (chan_ghe_y 360) theta[13] -= 360; break; case 'd': theta[13] -= 5; if (theta[13] > 360) theta[13] -= 360; break; //y case 'c': theta[14] += 5; if (theta[14] > 360) theta[14] -= 360; break; case 's': theta[14] -= 5; if (theta[14] > 360) theta[14] -= 360; break; //x case 'h': theta[15] += 5; if (theta[15] > 360) theta[15] -= 360; break; case 'g': Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 theta[15] -= 5; if (theta[15] > 360) theta[15] -= 360; 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 Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 II 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 void wall_room(GLfloat tranX, GLfloat tranY, GLfloat tranZ, GLfloat width_wall, GLfloat height_wall, GLfloat depth_wall) { instance = Translate(tranX, tranY, tranZ) * Scale(width_wall, height_wall, depth_wall); material_diffuse = vec4(-0.5,1,-0.5,0.5); diffuse_product = light_diffuse * material_diffuse; glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product); glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * instance); glDrawArrays(GL_TRIANGLES, 0, NumPoints); } // hàm vẽ căn phòng void room_build() { 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 quay_mau = RotateX(90); 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 quay_mau = RotateY(-90); // 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; wall_room(x, y, z, width_wall1, height_wall1, depth_wall1); // hàm tạo tường (như trên) // hàm vẽ tường trái quay_mau = identity(); 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); quay_mau = identity(); } Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 b 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 void day() { instance = Translate(0, DAY_CAO / 2, 0) * Scale(DAY_DAI, DAY_CAO, DAY_RONG); material_diffuse = vec4(0.5, 1.5, 2, 1); diffuse_product = light_diffuse * material_diffuse; glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product); glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance); glDrawArrays(GL_TRIANGLES, 0, NumPoints); } void canh_1() { instance = RotateY(xoayquat) * Translate(DAY_DAI / 2 + NOI_DAI + CANH_DAI / 2, DAY_CAO / 2, 0) * Scale(CANH_DAI, CANH_CAO, CANH_RONG); glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance); glDrawArrays(GL_TRIANGLES, 0, NumPoints); } void canh_2() { // xoay quanh trục y 120 + độ xoay quạt instance = RotateY(120 + xoayquat) * Translate(DAY_DAI / 2 + NOI_DAI + CANH_DAI / 2, DAY_CAO / 2, 0) * Scale(CANH_DAI, CANH_CAO, CANH_RONG); glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance); glDrawArrays(GL_TRIANGLES, 0, NumPoints); } void canh_3() { instance = RotateY(240 + xoayquat) * Translate(DAY_DAI / 2 + NOI_DAI + CANH_DAI / 2, DAY_CAO / 2, 0) * Scale(CANH_DAI, CANH_CAO, CANH_RONG); glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance); glDrawArrays(GL_TRIANGLES, 0, NumPoints); } Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 void truc() { instance = Translate(0, DAY_CAO + TRUC_CAO / 2, 0)* Scale(TRUC_DAI, TRUC_CAO, TRUC_RONG); material_diffuse = vec4(0.5, 1.5, 2, 1); diffuse_product = light_diffuse * material_diffuse; glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product); glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance); glDrawArrays(GL_TRIANGLES, 0, NumPoints); } void dinh() { instance = Translate(0, DAY_CAO + TRUC_CAO + DINH_CAO / 2, 0) * Scale(DINH_DAI, DINH_CAO, DINH_RONG); material_diffuse = vec4(0.5, 1.5, 2, 1); diffuse_product = light_diffuse * material_diffuse; glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product); glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance); glDrawArrays(GL_TRIANGLES, 0, NumPoints); } void canhquat() { if (checked) { // nếu cheked == true 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 void tao_quat() { // quạt là mô hình 1 cấp (ko cha con) nhưng có thể quay tự động theo phím 2 truc(); // tĩnh dinh(); // tĩnh canhquat(); // động day(); // tĩnh } Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 c 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; mat4 Tran_ngan_keo; // xây dựng khung ngăn kéo void Ban(GLfloat TranX, GLfloat TranY, GLfloat TranZ, GLfloat width, GLfloat height, GLfloat depth) { instance = Translate(TranX, TranY, TranZ) * Scale(width, height, depth); material_diffuse = vec4(-0.5, 0, 1, 1);// hàm màu sắc diffuse_product = light_diffuse * material_diffuse; glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product); glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * Tran_ngan_keo * instance); glDrawArrays(GL_TRIANGLES, 0, NumPoints); } //xây dựng bàn void Ban1(GLfloat TranX, GLfloat TranY, GLfloat TranZ, GLfloat width, GLfloat height, GLfloat depth) { instance = Translate(TranX, TranY, TranZ) * Scale(width, height, depth); material_diffuse = vec4(1.1, 0, 1, 1); // hàm màu sắc diffuse_product = light_diffuse * material_diffuse; glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product); glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * Tran_ngan_keo * instance); glDrawArrays(GL_TRIANGLES, 0, NumPoints); } // 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 void ngan_keo_ban() { GLfloat x = 0.0f, y = 0.0f, z = 0.0f; // hai bên thành ngăn bàn Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 x = (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); } void ban_build() { 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; Tran_ngan_keo = identity() * Translate(x, y, z - theta[5]); ngan_keo_ban(); Tran_ngan_keo = Translate(x, y - thanh_keo_y, z - theta[6]); ngan_keo_ban(); Tran_ngan_keo = identity(); } Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 d Code bộ máy tính /* MÀN HÌNH MÁY TÍNH & CÂY MÁY TÍNH */ mat4 dat_len_ban; void ManHinh(GLfloat TranX, GLfloat TranY, GLfloat TranZ, GLfloat width, GLfloat height, GLfloat depth) { instance = Translate(TranX, TranY, TranZ) * Scale(width, height, depth); material_diffuse = vec4(1,1,0,1); diffuse_product = light_diffuse * material_diffuse; glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product); glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance); glDrawArrays(GL_TRIANGLES, 0, NumPoints); } //chỉnh màu cây máy tính void ManHinh1(GLfloat TranX, GLfloat TranY, GLfloat TranZ, GLfloat width, GLfloat height, GLfloat depth) { instance = Translate(TranX, TranY, TranZ) * Scale(width, height, depth); material_diffuse = vec4(0.5,0.5,1,0); diffuse_product = light_diffuse * material_diffuse; glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product); glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance); glDrawArrays(GL_TRIANGLES, 0, NumPoints); } 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; void ManHinh_Build() { 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 Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 x = 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); } void BanPhim_Build() { // tĩnh ManHinh1(0.0f, 0.5 * phim_y, 0.0f, phim_x, phim_y, phim_z); } // tĩnh void CayMayTinh_Build() { ManHinh1(0.0f, 0.15, 0.0f, 0.04f, 0.18f, phim_x); } e Code ghế ngồi GHẾ NGỒI */ /* mat4 quay_tua_lung; mat4 quay_ghe; mat4 nang_ghe; mat4 di_chuyen_ghe; void Ghe(GLfloat TranX, GLfloat TranY, GLfloat TranZ, GLfloat width, GLfloat height, GLfloat depth) { instance = Translate(TranX, TranY, TranZ) * quay_tua_lung * Scale(width, height, depth); material_diffuse = vec4(1, 0, 0, 1); // màu sắc diffuse_product = light_diffuse * material_diffuse; glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product); glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * di_chuyen_ghe * nang_ghe * quay_ghe * instance); glDrawArrays(GL_TRIANGLES, 0, NumPoints); } 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; void Build_Ghe() { GLfloat x = 0.0f, y = 0.5 * de_ghe_y, z = 0.0f; Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 di_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ế quay_ghe = Translate(0.0f, (de_ghe_y + chan_ghe_y + 0.5 * than_de_y), 0.0f) * RotateY(theta[7]) * RotateY(theta[8]) * Translate(0.0f, -(de_ghe_y + 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ế quay_tua_lung = Translate(0.0f, -0.5 * tua_lung_y, 0.0f) * RotateX(20) * 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); quay_tua_lung = identity(); // 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 + than_de_y + 0.3 * tua_lung_y, z = tan(M_PI / 9) * (0.3 * tua_lung_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); quay_ghe = identity(); nang_ghe = identity(); } f Code bức tranh /* VẼ BỨC TRANH */ // tĩnh void buctranh(GLfloat w, GLfloat h, GLfloat l) { instance = Scale(w, h, l); material_diffuse = vec4(1, 1, 0, 1); // yellow diffuse_product = light_diffuse * material_diffuse; glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product); Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance); glDrawArrays(GL_TRIANGLES, 0, NumPoints); } void demoChong(GLfloat w, GLfloat h, GLfloat l) { instance = Scale(w, h, l); material_diffuse = color4(1, 0, 0, 1.0); // green diffuse_product = light_diffuse * material_diffuse; glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, diffuse_product); glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * transl * instance_lk * instance); glDrawArrays(GL_TRIANGLES, 0, NumPoints); } void chongchong() { //vẽ trụ instance_lk = identity(); demoChong(0.02f, 0.1f, 0.01f); //vẽ cánh 1 instance_lk = instance_lk * Translate(0, 0.05, 0) * RotateZ(45); demoChong(0.02f, 0.05f, 0.01f); instance_lk = instance_lk * Translate(0, 0, 0) * RotateZ(75); 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 mat4 view = identity(); point4 eye(eye_x, eye_y, eye_z, 1.0); point4 at(0.0, 0.0, 0.0, 1.0); vec4 up(0.0, 1.0, 0.0, 0.0); view = LookAt(eye, at, up); glUniformMatrix4fv(view_loc, 1, GL_TRUE, view); mat4 p = Frustum(l, r, bottom, top, zNear, zFar); glUniformMatrix4fv(projection_loc, 1, GL_TRUE, p); Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 3 Hiển thị void display(void) { model = RotateX(theta[13]) * RotateY(theta[14])* RotateZ(theta[15]); // 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); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // vẽ phòng room_build(); // vẽ quạt transl = Translate(0, 0.65 * height_wall1, 0); tao_quat(); // vẽ bàn làm việc transl = Translate(-0.5 * width_wall + 0.5 * thanh_y + width_wall2, 0.0f, -0.3f) * RotateY(-90); ban_build(); // vẽ màn hình máy tính transl = transl * Translate(-0.25 * mat_x, thanh_y + mat_y, 0.2 * mat_z); ManHinh_Build(); //vẽ bàn phím transl = transl * Translate(0.0f, 0.0f, -0.4 * mat_z); BanPhim_Build(); //vẽ cây máy tính transl = RotateY(90)*Translate(0.1f, 0.15f, -0.6f) ; // vị trí + góc vs trục oy CayMayTinh_Build(); // scale đồ vật theo tỷ lệ và cho vào guilt của open gl // vẽ ghế ngồi transl = Translate(-0.5 * width_wall + 0.9 * thanh_z, 0.0f, -0.4f) * RotateY(90); Build_Ghe(); -0.4f); //vẽ bức tranh 1 trên bàn máy tính transl = Translate(-0.58 * width_wall + 0.6 * thanh_y + width_wall2, 0.6f, buctranh(0.02, 0.25, 0.25); transl = RotateY(90) * Translate(0.4f, 0.6f, -0.71f); chongchong(); //vẽ bức tranh 2 transl = RotateY(90) * Translate(-0.58 * width_wall + 0.6 * thanh_y + width_wall2, 0.6f, -0.1f); buctranh(0.02, 0.3, 0.5); transl = Translate(0.0f, 0.6f, 0.7f); Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 chongchong(); transl = Translate(-0.1f, 0.6f, 0.7f); chongchong(); transl = Translate(-0.2f, 0.6f, 0.7f); chongchong(); // mat4 view = identity(); point4 eye(eye_x, eye_y, eye_z, 1.0); point4 at(0.0, 0.0, 0.0, 1.0); vec4 up(0.0, 1.0, 0.0, 0.0); view = LookAt(eye, at, up); glUniformMatrix4fv(view_loc, 1, GL_TRUE, view); mat4 p = Frustum(l, r, bottom, top, zNear, zFar); glUniformMatrix4fv(projection_loc, 1, GL_TRUE, p); glutSwapBuffers(); } III Kết quả đạt được Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 KẾ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! Downloaded by ANH BACH (bachvan15@gmail.com)