I.PHÁT BIỂU BÀI TOÁNMô 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
Trang 1BÁ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
Hà Nội, tháng 4 năm 2023
Trang 2Đ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);
break;
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ả