TRƯỜNG ĐẠI HỌC ĐIỆN LỰC KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO CHUYÊN ĐỀ HỌC PHẦN ĐỒ HỌA MÁY TÍNH ĐỀ TÀI Mô phỏng chuyển động của ô tô Sinh viên thực hiện Đinh Vũ Mạnh Chuyên ngành Công nghệ phần mềm Mã sin[.]
Trang 1TRƯỜNG ĐẠI HỌC ĐIỆN LỰC
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO CHUYÊN ĐỀ HỌC PHẦN
ĐỒ HỌA MÁY TÍNH
ĐỀ TÀI:
Mô phỏng chuyển động của ô-tô
Sinh viên thực
hiện:
Đinh Vũ Mạnh Chuyên ngành: Công nghệ phần mềm
Mã sinh viên: 20810320132
GVHD: Ngô Trường Giang
Hà Nội, tháng 4 năm 2023
Trang 2PHIẾU CHẤM ĐIỂM
Sinh viên thực hiện:
Đinh Vũ Mạnh
Giảng viên chấm:
Giảng viên chấm 1 :
Giảng viên chấm 2 :
Trang 3MỤC LỤC
I.PHÁT BIỂU BÀI TOÁN 1
II.PHƯƠNG ÁN GIẢI QUYẾT BÀI TOÁN 1
1.Vẽ mô hình 3D ô-tô 1
1.1.Phương pháp thực hiện 1
1.2.Minh họa cách thực hiện 2
2.Tạo các chuyển động của ô-tô 4
2.1.Phương pháp thực hiện 4
2.2.Minh họa cách thực hiện 4
3.Thiết lập tô màu 5
4.Thay đổi góc nhìn 5
III.LẬP TRÌNH XỬ LÝ, DEMO KẾT QUẢ 6
1.Lập trình xử lý 6
2.Demo kết quả 7
IV.KẾT LUẬN 12
Trang 4I.PHÁT BIỂU BÀI TOÁN
Mô phỏng chuyển động của ô-tô trong không gian 3D bằng lập trình C++ với thư viện đồ họa OpenGL và freeglut, cụ thể là:
-Vẽ mô hình 3D ô-tô dựa vào các đối tượng cơ bản trong thư viện đồ họa
-Dựa vào các phép biến đổi 3D, tạo hoạt cảnh ô-tô thực hiện các chuyển động sau:
+Tiến +Lùi +Sang trái +Sang phải -Thiết lập tô màu ô-tô
-Thay đổi góc nhìn
II.PHƯƠNG ÁN GIẢI QUYẾT BÀI TOÁN
1.Vẽ mô hình 3D ô-tô
1.1.Phương pháp thực hiện
Để vẽ mô hình 3D ô-tô, nhóm nghiên cứu đã sử dụng các hàm tạo đối tượng cơ bản trong thư viện đồ họa, kết hợp với các phép biến đổi Các hàm tạo đối tượng trong thư viện freeglut được sử dụng bao gồm:
-Hàm glutSolidCube: Vẽ hình lập phương với cạnh a = size
-Hàm glutSolidTorus: được sử dụng để vẽ một hình Torus (hình nhẫn)
Các đối tượng trên được kết hợp với các phép biến đổi để tạo ra thân
xe, bánh xe của ô-tô, cụ thể là:
Trang 5-Hàm glScalef(GLfloat x, GLfloat y, GLfloat z); //Biến đổi tỷ lệ kích thước các đối tượng cơ bản với tỷ lệ x theo trục X, tỷ lệ y theo trục Y và tỷ
lệ z theo trục Z với tâm tỷ lệ tại gốc tọa độ;
-Hàm glTranslatef(GLfloat x, GLfloat y, GLfloat z); //Tịnh tiến hệ trục tọa độ theo véc tơ tịnh tiến nối từ gốc tọa độ đến điểm (x, y, z);
-Hàm glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); //Quay 1 góc angle (angle > 0 thì quay ngược chiều kim đồng hồ) quanh trục nối gốc tọa độ với điểm (x, y, z)
-Sử dụng hàm glPushMatrix() và glPopMatrix() để lưu và khôi phục
hệ tọa độ chưa được điều chỉnh
1.2.Minh họa cách thực hiện
-Thân xe được vẽ bằng các hàm:
glPushMatrix()
glTranslatef()
glRotatef()
glBegin(GL_POLYGON)
glVertex3f()
glEnd()
void car()
{
glPushMatrix();
if (run == 0)
{
spin_wheel = 0;
}
else
{
spin_wheel += spin_k_wheel;
if (spin_wheel >= 360) spin_wheel -= 360;
else if (spin_wheel <= -360) spin_wheel += 360;
qd = 3.14 * 1.5 / 180 * abs(spin_k_wheel);
Trang 6GLfloat sin_w = sin(spin_y * 3.14159 / 180), cos_w = cos(spin_y * 3.14159 / 180);
id_x += run * qd * sin_w;
id_z += run * qd * cos_w;
}
glTranslatef(id_x, 1.88, id_z);
glRotatef(spin_y, 0, 1, 0);
glRotatef(90, 0, 1, 0);
glPushMatrix();
-Cửa sổ:
color_rgb(0, 0, 255);
glBegin(GL_POLYGON);
glVertex3f(-2.5, 7.5, 3.66);
glVertex3f(0.5, 7.5, 3.66);
glVertex3f(0.5, 5.5, 4);
glVertex3f(-4, 5.5, 4);
glEnd();
glPopMatrix();
color_rgb(0, 0, 255);
glBegin(GL_POLYGON);
glVertex3f(-2.5, 7.5, -3.66);
glVertex3f(0.5, 7.5, -3.66);
glVertex3f(0.5, 5.5, -4);
glVertex3f(-4, 5.5, -4);
glEnd();
glPopMatrix();
color_rgb(0, 0, 255);
glBegin(GL_POLYGON);
glVertex3f(-5.8, 4, 3.5);
glVertex3f(-3.4, 7.5, 3.2);
glVertex3f(-3.4, 7.5, -3.2);
glVertex3f(-5.8, 4, -3.5);
glEnd();
-Bánh xe:
glPushMatrix()
glTranslatef()
glRotatef()
Trang 7glLineWidth()
glVertex3f()
glutSolidTorus()
2.Tạo các chuyển động của ô-tô
2.1.Phương pháp thực hiện
Ô-tô tiến lùi bằng các lệnh từ bàn phím, thay đổi góc nhìn bằng lệnh từ chuột
void Keyboard(unsigned char ch, int x, int y)
void Mouse(int button, int state, int x, int y)
void Motion(int x, int y)
{
float turn_del, tipp_del, x_del, y_del;
static int c = 0, x_sav, y_sav;
static float turn_save = 0.0, tipp_save = 0.0;
void OnSpecialKeyDown(int key, int xx, int yy)
void OnSpecialKeyUp(int key, int xx, int yy)
2.2.Minh họa cách thực hiện
2.2.1.Ô-tô tiến
case GLUT_KEY_UP:
run = 1.0;
spin_k_wheel = abs(spin_k_wheel);
break;
2.2.3.Ô-tô lùi
case GLUT_KEY_DOWN:
run = -1.0;
spin_k_wheel = -abs(spin_k_wheel);
Trang 82.2.4.Ô-tô sang trái
case GLUT_KEY_LEFT:
spin_y += 4;
if (spin_y > 180) spin_y = -180;
break;
2.2.5.Ô-tô sang phải
case GLUT_KEY_RIGHT:
spin_y -= 4;
if (spin_y < -180) spin_y = 180;
break;
3.Thiết lập tô màu
-Chỉnh ánh sáng bằng lệnh GLfloat ambient_light[] = {}
GLfloat diffuse_light[] = {}
GLfloat specular_light[] = {}
GLfloat light_position[] = {}
-Chỉnh màu bằng lệnh
glColor3f()
color_rgb() 4.Thay đổi góc nhìn
int new_mouse = 0, mouse_rot = 1, mouse_trn = 0:khai báo các biến để lưu trữ thông tin về tình trạng của chuột Và thay đổi góc nhìn bằng chuột void Mouse(int button, int state, int x, int y)
{
x_click = x;
y_click = y;
Trang 9new_mouse = 1;
}
III.LẬP TRÌNH XỬ LÝ, DEMO KẾT QUẢ
1.Lập trình xử lý
Code lập trình bằng ngôn ngữ C++
Trang 102.Demo kết quả
Trang 118
Trang 1310
Trang 15IV.KẾT LUẬN
Qua quá trình nghiên cứu và thực hiện, về cơ bản bài tập lớn đã hoàn thành và đã đạt được những kết quả sau:
-Tổng kết được phương pháp vẽ, từ đó đã xây dựng được mô hình Robot 3D bằng ngôn ngữ C++ với các đối tượng và các phép biến đổi cơ bản trong thư viện đồ họa OPENGL và FREEGLUT
-Tổng kết được phương pháp tạo hoạt động cho các đối tượng, từ đó đã thực hiện được các hoạt cảnh hoạt động của Robot 3D, bao gồm:
+Ô-tô tiến +Ô-tô lùi
+Ô-tô sang trái
+Ô-tô sang phải
-Thiết lập màu cho Ô-tô
-Thay đổi góc nhìn