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à đ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ệcLà 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ắtSự 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.Đồ 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, …
Trang 1Mục Lục
Lời mở đầu 2
1 Giới thiệu tóm tắt 3
2 Ý tưởng 3
3 Mô tả chuyển động của xe 4
4 Các phép biến đổi sử dụng 4
4.1 Phép biến đổi 4
4.2 Phép vẽ hình cơ bản 5
5 Code mô tả hoạt động chuyển động 5
Trang 2Lờ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à đ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.
Trang 31 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
Đồ 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
Trang 4tạ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 đó, 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.
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 a) 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
b) 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”
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
+ Phép quay quanh trục OZ
Trang 5- 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
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
Trang 6instance = 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);
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
Trang 7Banhxe(-(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.
case 'a':
theta[0] += 5;
if (theta[0] > 360) theta[0] -= 360;
glutPostRedisplay();
break;
case 'A':
// một số lệnh
Trang 8theta[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;
glutPostRedisplay();
break;
Nâng thùng xe.
case 'u':
// một số lệnh
if (theta[1] < 30)
{
theta[1] += 5;
Trang 9}
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:
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;
Trang 10bottom = -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;
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);