Mục Lục
Lời mở đầ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à
1
đ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 sang tạo và nâng cao năng suất làm việc
Là sinh viên 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: Xây dựng mô
hình dồ chơi Ôtô tải theo OpenGL hiện đại.
1. Giới thiệu tóm tắt
Sự ra đời của đồ họa máy tính thực sự là cuộc cách mạng trong giao tiếp giữa
người dùng và máy tính. Với lượng thông tin trực quan, đa dạng và phong phú
được chuyển tải qua hình ảnh, các ứng dụng đồ họa máy tính đã lôi cuốn nhiều
người nhờ tính thân thiện, dễ dùng, kích thích khả năng sáng tạo và tăng đáng
kể
hiệu suất làm việc.
2
Đồ 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.
Một hệ đồ họa bao giờ cũng có hai thành phần chính đó là phần cứng và phần
mềm..
Thành phần phần cứng bao gồm các thiết bị hiển thị (hay là thiết bị xuất) và
các thiết bị nhập. Tiêu biểu nhất trong các thiết bị hiển thị là màn hình mà cơ
chế hoạt động dựa trên cấu tạo của ống tia âm cực CRT. Các thiết bị nhập dữ
liệu thường gặp bao gồm bàn phím, chuột.
Phần mềm đồ họa có thể chia làm hai loại đó là các công cụ lập trình như các
hàm thư viện của C, Pascal, GL, … và các ứng dụng phục vụ cho một mục đích
nào đó như AutoCAD, Photoshop, …
2. Ý tưởng
Hình1 Ảnh mô hình ôtô tải đồ chơi
Đồ chơi là những đồ vật được chơi bởi trẻ em trong các hoạt động giải trí.
Chúng thường là những đồ vật thu nhỏ, được tạo dáng đơn giản và có màu
sắc hấp dẫn. Đồ chơi có những nét tiêu biểu dưới dạng khái quát, bảo đảm tái
tạo các hoạt động tương ứng của đồ vật. Ví dụ đồ chơi xe ôtô có thể chạy, đồ
chơi búp bê có hình dạng giống con người.
Với những xe đồ chơi mô hình đa dạng, trẻ em có thể tăng cường nhận thức
và học hỏi nhiều loại phương tiện giao thông, chức năng của từng loại. Do đó,
3
với
những món đồ chơi mô hình như: xe máy, ô tô các loại, tàu, máy bay hoặc
thêm các mô hình tàu thủy… trẻ em sẽ tận hưởng được nhiều lợi ích như:
- Giúp trẻ em tìm hiểu thế giới xung quanh: nhận biết các loại xe, chức năng
riêng biệt của từng loại…
- Kích thích khả năng khám phá và tự học hỏi của trẻ em.
- Giúp trẻ em chơi sáng tạo với các kết hợp các loại phương tiện với nhau.
Ôtô tải là đồ chơi mà ai cũng từng được chơi. Nó là đồ chơi phổ biến được lựa
chọn cho trẻ em. Do vậy bằng những kiến thức đã học chúng em lựa chọn Ôtô
tải để làm mô hình.
3. Mô tả chuyển động của xe.
a)
b)
c)
Nhóm chúng em tiến hành mô tả 3 hoạt động phổ biến nhất trong chuyển
động của ôtô tải là :
- Thùng xe có thể nâng lên và hạ xuống được.
- Xe có thể quay 360o.
- Xe có thể di chuyển tới một điểm khác.
Mô tả chi tiết từng chuyển động
Nhóm chúng em sửa dụng keyboard để điều khiển chuyển động của xe.
Thùng xe có thể nâng lên và hạ xuống được.
- Để làm cho thùng xe có thể nâng lên được chúng em sử dụng phím
“u’ và phím “U” để hạ thùng xe.
Xe có thể quay 360o
- Xe có thể quay theo trục OX khi nhấn phím “a” và “A”
- Xe có thể quay theo trục OY khi nhấn phím “b” và “B”
- Xe có thể quay theo trục OZ khi nhấn phím “c” và “C”
Xe có thể di chuyển tới một điểm khác.
- Sử dụng phím “d” để di chuyển tiến và phím “D” để di chuyển lùi.
4. Các phép biến đổi sử dụng
4.1 Phép biến đổi
- Phép tịnh tiến.
- Phép quay.
+ Phép quay quanh trục OX.
+ Phép quay quanh trục OY.
4
+ Phép quay quanh trục OZ.
- Phép biến đổi tỉ lệ.
- Phép chiếu sáng.
- Góc nhìn (view).
4.2 Phép vẽ hình cơ bản
- Vẽ hình hộp chữ nhật.
5. Code mô tả hoạt động chuyển động
Tạo mô hình xe
void Banhxe(GLfloat a, GLfloat b, GLfloat c)
{
instance = Translate(a, b, c) * Scale(x_khung, y_khung, x_khung);
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * instance);
glDrawArrays(GL_TRIANGLES, 0, NumPoints);
}
void khung(GLfloat a, GLfloat b, GLfloat c)
{
instance = Translate(a, b, c) * Scale(x_thung, y_khung, z_thung);
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * instance);
glDrawArrays(GL_TRIANGLES, 0, NumPoints);
}
void truc_nang(GLfloat a)
{
instance = RotateZ(a) * Scale(x_thung - 0.3, y_khung, z_thung);
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * instance);
glDrawArrays(GL_TRIANGLES, 0, NumPoints);
}
void thung1()
{
instance = Scale(x_thung, y_thung, z_thung);
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * instance);
glDrawArrays(GL_TRIANGLES, 0, NumPoints); //thung day
instance = Translate(0, y_dau / 2 - y_dau / 5, z_thung / 2) * RotateX(90) *
instance;
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * instance);
glDrawArrays(GL_TRIANGLES, 0, NumPoints); //thung mat trai
5
instance = Translate(0, y_dau - z_thung / 1.5, 0) * RotateX(180) * instance;
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * instance);
glDrawArrays(GL_TRIANGLES, 0, NumPoints); // thung mat phai
instance = Scale(x_thung * 1.5, 1, z_thung * 1.3) * Translate(x_thung /
1.65, 0, 0) * RotateY(90) * instance;
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * instance);
glDrawArrays(GL_TRIANGLES, 0, NumPoints); // thung mat truoc
}
void dauxe()
{
instance = Translate(x_thung / 2 + x_dau / 2, y_dau / 2 - y_thung / 2, 0.0) *
Scale(x_dau, y_dau, z_dau);
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * instance);
glDrawArrays(GL_TRIANGLES, 0, NumPoints);
}
void cuaxetrai()
{
instance = Translate(x_thung / 1.4, y_dau / 2, z_dau / 2) * Scale(0.2, 0.2,
0.01);
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * instance);
glDrawArrays(GL_TRIANGLES, 0, NumPoints);
}
void cuaxephai()
{
instance = Translate(x_thung / 1.4, y_dau / 2, -z_dau / 2) * Scale(0.2, 0.2,
0.01);
glUniformMatrix4fv(model_loc, 1, GL_TRUE, model * instance);
glDrawArrays(GL_TRIANGLES, 0, NumPoints);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
model = RotateY(theta[0]);
model = model * RotateX(theta[2]);
model = model * RotateZ(theta[3]);
model = model * Translate(theta[4], 0, 0);
dauxe();
//truc_nang(90);
6
khung(0.2, -(y_thung) / 2, 0);
Banhxe(-(x_thung / 3) + banh_xe, -(y_thung + banh_xe) / 2, -z_thung / 2);
//banh phai sau
Banhxe(-(x_thung / 3) + banh_xe, -(y_thung + banh_xe) / 2, z_thung / 2);
//banh trai sau
Banhxe(-(x_thung / 3) + x_thung / 2 + banh_xe, -(y_thung + banh_xe) / 2,
-z_thung / 2); //banh phai giua
Banhxe(-(x_thung / 3) + x_thung / 2 + banh_xe, -(y_thung + banh_xe) / 2,
z_thung / 2); //banh trai giua
Banhxe(-(x_thung / 3) + x_thung + banh_xe, -(y_thung + banh_xe) / 2,
-z_thung / 2); //banh phai truoc
Banhxe(-(x_thung / 3) + x_thung + banh_xe, -(y_thung + banh_xe) / 2,
z_thung / 2); //banh trai truoc
cuaxetrai();
cuaxephai();
model = model * Translate(-i / 2, 2 * i, 0) * RotateZ(theta[1]);
thung1();
point4 eye(radius * sin(theta2) * cos(phi),
radius * sin(theta2) * sin(phi),
radius * cos(theta2),
1.0);
//point4 eye(0.5, 1, 1.5, 1);
point4 at(0.0, 0.0, 0.0, 1.0);
vec4 up(0.0, 1.0, 0.0, 1.0);
mat4 mv = LookAt(eye, at, up);
glUniformMatrix4fv(model_view_loc, 1, GL_TRUE, mv);
mat4 p = Frustum(l, r, bottom, top, zNear, zFar);
glUniformMatrix4fv(projection_loc, 1, GL_TRUE, p);
//glUniformMatrix4fv(projection_loc, 1, GL_TRUE, projection);
glDrawArrays(GL_TRIANGLES, 0, NumPoints); /*Vẽ các tam giác*/
//const vec3 viewer_pos(0.0, 0.0, 2.0); /*Trùng với eye của camera*/
//glUniformMatrix4fv(model_loc, 1, GL_TRUE, model);
glutSwapBuffers();
}
Quay quanh các trục OX, OY, OZ.
7
case 'a':
theta[0] += 5;
if (theta[0] > 360) theta[0] -= 360;
glutPostRedisplay();
break;
case 'A':
// một số lệnh
theta[0] -= 5;
if (theta[0] > 360) theta[0] -= 360;
glutPostRedisplay();
break;
case 'b':
theta[2] += 5;
if (theta[0] > 360) theta[0] -= 360;
glutPostRedisplay();
break;
case 'B':
// một số lệnh
theta[2] -= 5;
if (theta[0] > 360) theta[0] -= 360;
glutPostRedisplay();
break;
case 'c':
theta[3] += 5;
if (theta[0] > 360) theta[0] -= 360;
glutPostRedisplay();
break;
case 'C':
// một số lệnh
theta[3] -= 5;
if (theta[0] > 360) theta[0] -= 360;
glutPostRedisplay();
break;
Di chuyển tiến lùi.
case 'd':
theta[4] += 0.05;
glutPostRedisplay();
break;
case 'D':
// một số lệnh
theta[4] -= 0.05;
8
glutPostRedisplay();
break;
Nâng thùng xe.
case 'u':
// một số lệnh
if (theta[1] < 30)
{
theta[1] += 5;
i = i + 0.01;
}
else {}
glutPostRedisplay();
break;
case 'U':
// một số lệnh
if (theta[1] > 0)
{
theta[1] -= 5;
i = i - 0.01;
}
glutPostRedisplay();
break;
Góc nhìn.
point4 eye(radius * sin(theta2) * cos(phi),
radius * sin(theta2) * sin(phi),
radius * cos(theta2),
1.0);
//point4 eye(0.5, 1, 1.5, 1);
point4 at(0.0, 0.0, 0.0, 1.0);
vec4 up(0.0, 1.0, 0.0, 1.0);
mat4 mv = LookAt(eye, at, up);
glUniformMatrix4fv(model_view_loc, 1, GL_TRUE, mv);
mat4 p = Frustum(l, r, bottom, top, zNear, zFar);
glUniformMatrix4fv(projection_loc, 1, GL_TRUE, p);
- Sử dụng Keyboard:
9
case 'x': l *= 1.1; r *= 1.1; break;
case 'X': l *= 0.9; r *= 0.9; break;
case 'y': bottom *= 1.1; top *= 1.1; break;
case 'Y': bottom *= 0.9; top *= 0.9; break;
case 'z': zNear *= 1.1; zFar *= 1.1; break;
case 'Z': zNear *= 0.9; zFar *= 0.9; break;
case 'r': radius *= 2.0; break;
case 'R': radius *= 0.5; break;
case 't': theta2 += dr; break;
case 'T': theta2 -= dr; break;
case 'p': phi += dr; break;
case 'P': phi -= dr; break;
case ' ': // reset values to their defaults
l = -1.0;
r = 1.0;
bottom = -1.0;
top = 1.0;
zNear = 0.5;
zFar = 3.0;
radius = 1.0;
theta2 = 0.0;
phi = 0.0;
theta[0] = 0;
theta[1] = 0;
theta[2] = 0;
theta[3] = 0;
theta[4] = 0;
i = 0;
break;
Chiếu sáng.
/* Khởi tạo các tham số chiếu sáng - tô bóng*/
point4 light_position(0.0, 0.0, 1.0, 0.0);
color4 light_ambient(0.2, 0.2, 0.2, 1.0);
color4 light_diffuse(1.0, 1.0, 1.0, 1.0);
color4 light_specular(1.0, 1.0, 1.0, 1.0);
color4 material_ambient(1.0, 0.0, 1.0, 1.0);
color4 material_diffuse(1.0, 0.8, 0.0, 1.0);
color4 material_specular(1.0, 0.8, 0.0, 1.0);
float material_shininess = 100.0;
10
color4 ambient_product = light_ambient * material_ambient;
color4 diffuse_product = light_diffuse * material_diffuse;
color4 specular_product = light_specular * material_specular;
glUniform4fv(glGetUniformLocation(program, "AmbientProduct"), 1,
ambient_product);
glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1,
diffuse_product);
glUniform4fv(glGetUniformLocation(program, "SpecularProduct"), 1,
specular_product);
glUniform4fv(glGetUniformLocation(program, "LightPosition"), 1,
light_position);
glUniform1f(glGetUniformLocation(program, "Shininess"),
material_shininess);
11