Tải bản đầy đủ (.doc) (35 trang)

Mô phỏng chuyển động rôbốt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (666.17 KB, 35 trang )

Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

phụ lục
I. Tổng quan về đồ hoạ máy tính....................................................................................2
1) Giới thiệu...............................................................................................................2
2) Tổng quan về một hệ đồ hoạ.................................................................................3
II. Giới thiệu tổng quan về opengl..................................................................................4
1.Giới thiệu tổng quan về OpenGL...........................................................................4
1.1. Hardware vs Software.....................................................................................6
1.2. OpenGL vs Direct3D.......................................................................................6
2. Các khái niệm........................................................................................................6
2.1. Primitive & Command....................................................................................6
2.2. Các thao tác cơ bản của OpenGL....................................................................7
2.3. OpenGL Pipeline.............................................................................................8
3. Tổng quan về các hàm của OpenGL.....................................................................9
3.1. Cách đặt tên hàm...........................................................................................10
3.5 Các hàm trên Primitive...................................................................................15
3.6 Các hàm trên Primitive...................................................................................15
4. Các thư viện tiện ích............................................................................................16
4.1Chương trình đầu tiên với GLUT....................................................................16
4.2 Bên trong GLUT............................................................................................18
III. Chương trình cánh tay rô bốt..................................................................................23
1)Mục đích của chương trình :................................................................................23
2)Chức năng của chương trình :..............................................................................23
3)Tiến trình vẽ cánh tay rôbốt:................................................................................24
3.1)Hàm shoulder(solid):......................................................................................26
3.2)UpperArm(char solid)....................................................................................26


3.3)Void ForeArm(char solid)..............................................................................29
3.4)Vẽ cổ tay:.......................................................................................................31
3.5) Một số hàm vẽ khác được xây dựng trong chương trình.............................32
4) Một số hình vẽ rôbốt:.......................................................................................33

-1-


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

BÁO CÁO ĐỒ ÁN MÔN HỌC
I. Tổng quan về đồ hoạ máy tính
1) Giới thiệu
 Đồ họa máy tính có thể được hiểu như là tất cả
những gì liên quan đến việc tạo ra ảnh (image) bằng
máy tính. Chúng bao gồm : tạo, lưu trữ, thao tác trên
các mô hình (model) và các ảnh.
 Thuật ngữ đồ họa máy tính (computer graphics) do
William Fetter đặt ra năm 1960 để mô tả một cách
thiết kế mới khi đang làm việc tại hãng Boeing.
 Hỗ trợ thiết kế (CAD - Computer Aided Design)



Dùng phát sinh các biểu đồ, đồ thị, … trong việc minh
họa mối quan hệ giữa nhiều đối tượng với nhau.




Tóm lược các dữ liệu về tài chính, thống kê, kinh tế,
khoa học, toán học, … giúp cho việc nghiên cứu, quản lí, …
một cách có hiệu quả.

-2-


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

 Giải trí


Tạo giao diện

2) Tổng quan về một hệ đồ hoạ.

 Các thành phần phần cứng
 Thiết bị hiển thị

: màn hình, máy in, …

 Thiết bị nhập


: bàn phím, chuột, …

 Các công cụ phần mềm
 Công cụ ứng dụng (application package) : Được thiết kế
cho các người sử dụng để tạo ra các hình ảnh mà không
cần quan tâm tới các thao tác bên trong hoạt động như
thế nào. Ví dụ : AutoCAD, Adobe Photoshop, 3D Studio, …
  Công cụ lập trình (programming package) : Cung cấp một
tập các hàm đồ họa có thể được dùng trong các ngôn ngữ
lập trình cấp cao như C, Pascal, … Ví dụ : GRAPH.TPU,
GRAPHICS.LIB, Open GL, …

 Các chuẩn phần mềm
 Ra đời để đáp ứng tính tương thích : Nếu các phần mềm
được thiết kế với các hàm đồ họa chuẩn chúng có thể
dùng được cho nhiều hệ phần cứng và môi trường làm
việc khác nhau.
 GKS (Graphics Kernel System) là chuẩn ra đời đầu tiên
cho việc phát triển các phần mềm đồ họa. Ban đầu GKS
được thiết kế chae dùng cho tập các công cụ đồ họa hai
chiều, sau đó mới được mở rộng ra cho đồ họa ba chiều.
 Các hàm của GKS thực sự chỉ là các mô tả trừu tượng,
độc lập với bất kì ngôn ngữ lập trình nào. Để cài đặt một
chuẩn đồ họa cho ngôn ngữ cụ thể nào, các cú pháp tương
ứng sẽ được xác định và cụ thể hóa.

-3-


Khoa Toán Tin - Ứng Dụng

Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

II. Giới thiệu tổng quan về opengl
1.Giới thiệu tổng quan về OpenGL
OpenGL là giao diện cho phép phần mềm giao tiếp với phần cứng đồ
hoạ mà không phụ thuộc vào phần cứng (hardware-independent)
Mục đích: Vẽ các hình ảnh (2D/3D)
OpenGL cung cấp khoảng 120 hàm để thực hiện các thao tác đồ
hoạ
OpenGL không bao gồm các lệnh cấp cao cũng như các đối tượng
để mô tả các mô hình 3D
Các tính năng nêu trên được cung cấp trong nhiều thư viện
OpenGL (GLU – OpenGL Utility Library, Open Inventor)
OpenGL được hỗ trợ trên hầu hết các phần cứng đồ hoạ
Bình thường các ứng dụng window sử dụng GDI(graphic Device
interface và DC(device context) để vẽ các cửa sổ. Trong ơpengl không
sử dụng GDI mà sử dụng RC(rendering context) RC sẽ kết hợp với DC
để vẽ trên nền window theo mô hình sau:

-4-


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt


Mô hình hoạt động Opengl trên window
Lập trình viên sử dụng GDI chỉ có khả năng vẽ các đường nét cơ bản như
đường thẳng, đường cong. Nếu muốn có không gian 3 chiều hay hiệu
ứng đồ hoạ : lập trình viên phải tự quản lí sử lí và thao tác ngoài ra
những chương trình này không tận dụng được sức mạnh phần cứng nên
tốc độ chậm.
Trong mô hình hoạt động của opengl: phần sử lí tính toán đồ hoạ 3D hay
hiệu ứng đồ hoạ được chuyển cho phần cứng (card đồ hoạ thực hiện).
Opengl sử dụng các lệnh đồ hoạ nằm trong phần cứng để sử dụng một
cách có hiệu quả nhất. Khi có được kết quả sử lý opengl thông qua GDI
để hiện kết quả lên màn hình.
-5-


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

1.1. Hardware vs Software

 Các chức năng đồ hoạ 3D có thể được xây dựng dựa trên các thư viện
các hàm.
 Đồ hoạ 3D đòi hỏi khối lượng tính toán lớn, sử dụng phần mềm
không đảm bảo được chất lượng đối với đồ hoạ 3D thời gian thực.
 Hiện nay, hầu hết các card màn hình đều hỗ trợ chức năng 3D, có
nghĩa là phần tính toán 3D được thực hiện trên chip của card màn
hình (phần cứng)

 Sử dụng các thư viện đồ hoạ thông thường (vd: GDI trong Windows)
không tận dụng được các tính năng 3D của phần cứng.
1.2. OpenGL vs Direct3D

 Trên Windows, có thể sử dụng Direct3D để tận dụng các tính năng đồ
hoạ của phần cứng
 Direct3D làm việc trực tiếp với phần cứng mà không qua GDI →
tăng tốc độ.
 Direct3D hỗ trợ việc mô tả các vật thể 3D, biến đổi và tương tác trên
môi trường 3D thông qua tập hợp các đối tượng (tiếp cận ở mức cao)
 OpenGL chỉ cung cấp các hàm vẽ các đối tượng cơ bản (điểm, đoạn
thẳng, mặt...) (tiếp cận mức thấp)
 Direct3D là chuẩn của Microsoft, OpenGL là chuẩn của cộng đồng
mở
2. Các khái niệm
 Các hình cơ bản (primitive) và lệnh (command)
 Các thao tác cơ bản của OpenGL
2.1. Primitive & Command

 OpenGL cung cấp các hàm cấp thấp, vẽ điểm, đoạn thẳng, đa giác
 Điểm trong OpenGL gồm các thông tin:
– Toạ độ
-6-


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt


– Màu
– Vector pháp tuyến
– Toạ độ Texture (Texture coordinate)
 OpenGL không cung cấp các hàm riêng để vẽ điểm, đoạn thẳng, đa
giác mà là sự kết hợp các chế độ vẽ với hàm vẽ điểm
Ví dụ:
– glBegin(GL_POLYGON);
• glVertex3f (0.25, 0.25, 0.0);
• glVertex3f (0.75, 0.25, 0.0);
• glVertex3f (0.75, 0.75, 0.0);
• glVertex3f (0.25, 0.75, 0.0);
– glEnd();
2.2. Các thao tác cơ bản của OpenGL

Sơ đồ quá trình xử lý dữ liệu trong OpenGL
 Display List: Hàng đợi các lệnh
 Dữ liệu hình học
- Eluavator: Xấp xỉ các đường cong thành đa giác

-7-


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

- Per-Vertex Operation & Primitive Assembly: Các hình hình

học đều được mô tả qua điểm → biến đổi điểm, clip hình trong
vùng nhìn
- Rasterization: Đưa ra các dữ liệu 2D (toạ độ điểm, đoạn thẳng,
đa giác) để chuẩn bị cho bước cuối
- Per-fragment operations: Vẽ các dữ liệu đã được tính ở bước
Rasterization lên frame buffer
 Dữ liệu ảnh
– Dữ liệu vào có thể là dữ liệu ảnh của texture, hoặc dữ liệu ảnh
để vẽ lên frame buffer
– Sau khi thực hiện các thao tác trên điểm ảnh (pixel operation)
• Lưu lại thành texture (texture memory)
• Vẽ lên frame buffer
2.3. OpenGL Pipeline

-8-


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

3. Tổng quan về các hàm của OpenGL
 Cách đặt tên hàm
 Các hàm trên điểm (Vertex)
 Các hàm trên đối tượng (primitive)
 Các hàm trên mảnh (fragment)
-9-



Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

 Các hàm trên điểm ảnh (pixel)
3.1. Cách đặt tên hàm

 OpenGL gồm khoảng 120 nhóm hàm
 Mỗi nhóm hàm bao gồm nhiều hàm có chức năng giống nhau nhưng
khác nhau về kiểu dữ liệu vào
Ví dụ
– Nhóm hàm glVertex* gồm các hàm
• glVertex2d( GLdouble x, GLdouble y)
• glVertex2f( GLfloat x, GLfloat y)
• glVertex2i( GLint x, GLint y)
glVertex2s( GLshort x, GLshort y)
Tác dụng của các hàm rất khác nhau, tuỳ thuộc vào
chế độ hiện hành (mode)
Để thiết lập hoặc bỏ một mode, sử dụng lệnh
– glEnable()
– glDisable()
3.2 Các hàm trên Vertex

Dữ liệu vào
 Toạ độ
– Để xác định 1 điểm, dùng hàm glVertex*
– Dùng glRect để xác định 1 hình chữ nhật

 Vector pháp
– glNormal*
 Màu
– glColor* (chế độ RGBA)

- 10 -


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

– glIndex* (chế độ color-index)

 Texture coordinate
– glTexCoord*
 Chú ý: Các hàm trên cạnh, vector pháp, màu, texture là thiết lập giá
trị hiện tại, do đó phải được gọi trước glVertex*
3.3 Các hàm trên Vertex
Biến đổi ma trận
 Toạ độ điểm, vector pháp được chuyển đổi bởi ma trận phép chiếu
trước khi vẽ lên frame buffer
 Cách kết hợp ma trận
– glMatrixMode
– glMultMatrix
– glRotate
– glTranslate
– glScale


- 11 -


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

• Void Translate(TYPE x , TYPE y, TYPE z): nhân ma trận hiện tại
với ma trận khác mà đối tượng được dịch chuyển có giá trị x, y, z
(hay dời vị trí trục toạ độ đi 1 khoảng như trên)
Ma trận tịnh tiến được xác định bởi ma trận 4 × 4:

minh hoạ phép biến đổi.
• Void Rotate(TYPE angle, TYPE x, TYPE y, TYPE z): nhân
ma trận hiện tại với ma trận mà quay đối tượng (hay vị trí của
hệ trục toạ độ ) theo hướng ngược kim đồng hồ . Bán kính từ
gốc toạ độ tới điểm đặt vật. Góc quay tính = đơn vị độ. Nhân
ma trận hiện tại với ma trận quay kết quả lưu vào ma trận hiện
tại các ma trận quay tương ứng với các trục ox, oy, oz là :

- 12 -


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính

Mô Phỏng Chuyển Động Rôbốt

Ví dụ: glRotatef(45.0, 0.0, 0.0, 1.0) quay vật xung quanh trục z một góc 45
độ

• Void glScale(TYPE x, TYPE y, TYPE z): nhân ma trận
hiện tại với ma trận mà kéo dài , co giãn đối tượng dọc
theo các trục. Mỗi toạ độ x, y, z của đối tượng được
nhân với các tham số tương ứng x, y ,z.
Ví dụ :
glScalef(2.0, -0.5, 1.0)
Quả lưu vào ma trận hiện tại. Ma trận tỉ lệ là ma trận 4 × 4:

- 13 -


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

 Xác định trực tiếp ma trận
– glLoadMatrix*
– glLoadIdentity
 Lưu và phục hồi ma trận
– glPushMatrix
– glPopMatrix
3.4Các hàm trên Vertex


Ánh sáng & màu sắc
 Thiết lập ánh sáng
- glLight*
- glLightModel*
 Thiết lập vật liệu
- glMaterial*
- glFrontFace
- glColorMaterial
 Các chế độ
- 14 -


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

- glShadeModel
3.5 Các hàm trên Primitive

 Clipping
- glClipPlane
- glFrustum
- glOrtho
 Biến đổi WCS & toạ độ màn hình
- glDepthRange
- glViewport
3.6 Các hàm trên Primitive


 Hình
- glRasterPos*
- glPointSize
- glLineWidth
- glLineStipple
- glPolygonStipple
- glCullFace
- glFrontFace
- glPolygonMode
 Điểm ảnh
- glPixelStore*
- glPixelMap*
- glPixelTransfer*
- glDrawPixels
- glPixelZoom
 Bitmaps
- glBitmap

- 15 -


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

 Texture
- glTexImage2D
- glTexImage1D

- glTexParameter
- glTexEnv*
 Fog
- glFog*
4. Các thư viện tiện ích
 OpenGL cung cấp các lệnh mạnh để vẽ các đối tượng cơ bản. Tất cả
các hình đều được vẽ từ các lệnh này. Để đơn giản hơn trong quá
trình làm việc, người ta cung cấp thêm 1 số thư viện
 OpenGL Utility Library (GLU) gồm các lệnh cấp thấp: khởi
tạo biến đổi ma trận quan sát, tạo camera, vẽ các bề mặt...
 OpenGL Utility Toolkit (GLUT) hệ thống làm việc với cửa sổ
(độc lập hệ điều hành).
4.1Chương trình đầu tiên với GLUT

 GLUT : là thư viện phổ biến cho lập trình OPENGL. Bởi vì nó đã được
chuẩn hoá và đơn giản hoá window và quản lý sự kiện.
Khởi tạo window:
 Trước khi bạn khởi tạo window bạn phải đặt thuộc tính cho nó : chọn
bộ nhớ đệm đơn hay đôi. Chọn chế độ màu thường là RGBA. Vị trí
hiển thị window. Nó bao gồm các hàm sau:
 GlutInit(), glutInitDisplayMode(), glutInitWindowSize(), và
GlutInitWindowPosition() trước khi gọi hàm glutCreateWindow()
 để mở window.
 Void glutInit(int argc, char ** argv);
 GlutInit(): được gọi trước khi các hàm glut được gọi nó có chức năng
khởi tạo thư viện GLUT

- 16 -



Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

 Void glutInitDisplayMode(unsigned int mode) : chỉ định chế độ hiển
thị ( vd: màu hiển thị RGBA hay bộ đệm đơn hoặc đôi) cho việc tạo
window khi hàm glutCreateWindow() được gọi .
 Void glutInitWindowSize(int width, int height) : chỉ định chiều rộng
và chiều cao của cửa sổ window.
 Void glutInitWindowPosition(int x, int y) khởi tạo vị trí của window.
Tham số x, y khởi chỉ định góc trái của window.
 Int glutCreateWindow(char *name) mở cửa sổ window với các thông
số đã được chọn ( như chế độ màu chế độ hiển thị chiều rộng chiều cao
v..v.v) , giá trị name là tên gọi đặt cho cửa sổ. window sẽ không được
khởi tạo nếu thiếu gọi hàm gluMainLoop() nó trả lại giá trị của
window. Giá trị nhận dạng có tác dụng gọi đúng cửa sổ window trong
trường hợp dự án có nhiều cửa sổ.
 Điều khiển window và các sự kiện vào.
 Khi ta đã thực hiện gọi các hàm trên thì window được tạo nhưng trước
khi vào bên trong vòng lặp chính bạn lên đăng kí các hàm gọi lại
(callback function) sử dụng các hàm sau:
 Void glutDisplayFunc(void (*func)(void)) hàm được sử dụng khi
window cần được vẽ lại (redraw). Nội dung trong cửa sổ cần được vẽ
lại khi window mở khởi tạo. Nó được gắn liền với hàm void
GlutPostRedisplay(void). Hàm này có tác dụng đánh dấu window hiện
tại cần được vẽ lại.
 Void glutReshapeFunc(void (*func)(int width, int height)) : hàm này
được gọi khi window được vẽ lại hoặc được dời đi. Tham số của hàm

là con trỏ trỏ tới hàm có 2 tham số có chiều rộng mới và chiều dài mới
của window. Điển hình là hàm glViewport().
 Void glutKeyboardFunc(void (*func)(unsigned int key, int x, int y) :
hàm được gọi khi có 1 kí tự mã ASCII được ấn. x ,y là vị trí của con
trỏ khi kí tự được ấn.

- 17 -


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

 Void glutMouseFunc(void (*func)(int button, int state, int x, int y)) :
hàm được gọi khi 1 nút của chuột được ấn hay được nhả ra. Nó bao
gồm các tham số sau: GLUT_LEFT_BUTTON,
GLUT_MIDDLE_BUTTON, or GLUT_RIGHT_BUTTON,
GLUT_UP or GLUT_DOWN còn x, y mô tả vị trí của chuột khi sự
kiện sảy ra.
 Void glutMotionFunc(void (*func)(int x, int y)) : hàm này được gọi
khi con trỏ chuột di chuyển trong cửa sổ window. Toạ độ x ,y mô tả vị
trí của con trỏ khi sự kiện xuất hiện.
 Void glutSwapBuffers(void): Có tác dụng hoán đổi buffer trước và
sau.
 Vòng lặp chính (Main loop)
- glutMainLoop(): Gọi vòng lặp chính của chương
trình.
- Chương trình tạo ra 1 cửa sổ, lặp gọi các hàm call

back (display, reshape...) cho đến khi người dùng
đóng cửa sổ
4.2 Bên trong GLUT

 Màu sắc (Color)
 Thiết lập điểm nhìn (Viewing Transformation)
 Tô bóng (Shading)
 Chiếu (Projection)
 Làm việc với Stack ma trận (Matrix stack)
 Màu sắc (Color)
- Màu của điểm:glColor*(): glColor3d(), glColor3f()...
- Xoá màn hình:


glClear(GL_COLOR_BUFFER_BIT);
- 18 -


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

Các lệnh glClearColor(), glClear(),glFush() là những lệnh cơ bản của
Opengl.glClearColor() có nhiệm vụ chọn màu để xoá window, bạn dễ
dàng nhận ra là nó có 4 tham số, 4 tham số đó là RGBA( red green
blue alpha).Không giống với hàm RGB() trong Win32 API , 4 tham
số này có giá trị trong khoảng 0.0f đến 1.0f(kiểu float).Ba tham số
đầu là màu đỏ xanh lá cây và xanh da trời, còn tham số thứ 4 là độ

sáng tối của window.


Thiết lập điểm nhìn
– Đặt vị trí camera

- Void

gluPerspective(GLdouble

fovy,

GLdouble

aspect,

GLdouble near, GLdouble far);
- Tham số đầu tiên là góc quan sát trong mặt phẳng XOZ, trong ví dụ
trên góc đó là 30độ, tham số thứ hai là tỉ lệ giữa w và h, nó bằng w/h,
tham số thứ 3 và thứ 4 thì hẳn các bạn đã quen khi quan sát bằng
glOrtho().Nếu chỉ có hàm này không thôi thì chúng ta vẫn chưa quan
sát được hình lập phương mà chúng ta vẽ. Để quan sát được chúng ta
phải dùng thêm hàmgluLookAt()
- Hàm này có tới 9 tham số, nhưng thực ra nó nằm trong 3 tham số
chính.Tham số đầu tiên là vị trí của mắt, cũng có thể coi đó là vị trí của
camera(chú ý là trong toạ độ 3 chiều, nên vị trí của mắt chứa 3 toạ độ),
tham số thứ 2 là điểm nhìn, và tham số thứ 3 gọi là upvector, từ này
không biết dịch ra tiếng việt ra sao.Upvector , hãy tưởng tượng bạn

- 19 -



Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

đang theo dõi một vật, upvector chính là vector từ tim bạn lên đỉnh đầu,
nếu thay đổi số liệu cũng tương tự như bạn nghiêng đầu sang phải sang
trái

vị trí camera mặc định

Sử dụng hàm gluLookAt()

 Tô bóng
- glBegin()
- glVertex*();
- glEnd()
- Tất cả các hình khối được vẽ trong opengl đều được nằm giữa
hai dòng lệnh glBegin() và glEnd()

- 20 -


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính

Mô Phỏng Chuyển Động Rôbốt

 Chiếu (Projection)
- Bắt đầu với ma trận chuyển đổi từ WCS sang hệ toạ độ camera:
glMatrixMode(GL_PROJECTION)
-

glLoadIdentity():glLoadIdentity: thay thế ma trận hiện thời bằng

ma trận đơn vị.
- Thiết lập vùng nhìn (vùng hình chóp cụt)
glFrustum() hoặc gọi hàm gluPerspective()
- Kết

thúc

bằng

việc

đặt

lại

chế

độ

ma


trận

glMatrixMode(GL_MODELVIEW)
 Matrix Stack
- OpenGL gồm các ma trận (Projection Matrix, Model View Matrix
& Texture Matrix);
- Để chuyển đổi giữa các chế độ ma trận, sử dụng hàm
glMatrixMode();

- 21 -


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

- Các hàm vẽ điểm glVertex, glNormal... đều không trực tiếp vẽ ra
WCS mà được biến đổi qua ma trận này rồi mới vẽ trên WCS
• Như vậy, có thể sử dụng ma trận để thực hiện các phép biến đổi:
tịnh tiến, quay, co dãn và kết hợp nhiều phép biến đổi
• Để lưu lại ma trận
glPushMatrix()
• Để lấy ma trận đã lưu
glPopMatrix()

Đẩy và lấy ma trận stack
 Chiếu sáng
- Trong OpenGL, việc chiếu sáng được thực hiện đơn giản thông qua

đèn (light)
Các đèn được đánh số: GL_LIGHT0, GL_LIGHT1...
-

Để thiết lập chế độ chiếu sáng
glEnable(GL_LIGHTING);

-

Để bật đèn
glEnable(GL_LIGHT0);

-

Để thiết lập các thông số của đèn: glLight*();
glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse[4] );
glLightfv( GL_LIGHT0, GL_POSITION, position[4] );

Để xác định mặt nào được chiếu sáng và với cường độ sáng bao nhiêu,
người ta dùng véc tơ pháp tuyến (normal vector). glEnable() và glDisable(),
các thông số này cho phép chúng ta sử dụng ánh sáng trong khi tạo đồ
vật.Opengl cung cấp cho chúng ta 8 nguồn sáng, hàm glNormal3dv() thiết
- 22 -


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt


lập véc tơ pháp tuyến cho mỗi mặt chúng ta vẽ, vì thế khi vật thể quay
quanh trục thì ta sẽ thấy độ sáng tối thay đổi.
GLfloat ambient[]={ 0.2,0.2,0.2,1.0};
GLfloat diffuse[]={ 0.8,0.0,0.0,1.0};
GLfloat specular[]={0.5,0.5,0.5,1.0};
GLfloat shininess=40.0;
Trong đó các thông số trên đều được đặt theo hệ RGBA(như đã đề cập ở các
phần trên), chính vì thế mà chúng có 4 giá trị.Thông số ambient biểu hiện
cho độ sáng của môi trường bên ngoài, diffuse là độ khuếch tán, specular là
độ phản xạ và shininess là độ bóng(độ bóng sáng). Các thông số trên được
hàm glMaterial*() sử dụng để tạo vật thể của chúng ta
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambient);
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuse);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specula);
glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,shininess);
III. Chương trình cánh tay rô bốt

1)Mục đích của chương trình :
Mô tả chuyển động của rôbốt. Sử dụng đồ hoạ 3D dựa trên ngôn ngữ
Opengl.
2)Chức năng của chương trình :
Di chuyển đồ vật từ vị trí A -> B . Dùng cánh tay rôbốt để gắp đồ vật và
di chuyển từ vị trí này sang vị trí khác. Dùng các phím điều khiển trên bàn
phím để điểu khiển cánh tay rôbốt
Phạm vi và giới hạn của cánh tay rôbốt
 Cả thân rôbốt có thể chuyển động quanh oy 3600 (nút a,s)
 Cánh tay rôbốt có thể chuyển động quay xung quanh trục oz từ
-30→2100 (nút điều khiển r,t)


- 23 -


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

 Khuỷ tay có thể chuyển động quanh trục ox từ -130 0 → 1300 ( nút
điều khiển w,e)
 cổ tay có thể quay quanh trục oz 3600 (nút điều khiển z,x)
 Ngón tay có thể quanh quanh trục ox -800 →800 (nút điểu khiển m ,n)
Ngoài ra rôbốt có thể dịch chuyển tịnh tiến, lùi , sang phải sang trái bằng nút
tiến, lùi, sang phải, sang trái.(tịnh tiến dọc theo trục ox, oz) sử dụng các
phím left, right, up, down. Dùng nút b để bắt vật , sử dụng các nút 1 đến 8
để di chuyển rôbốt cùng với vật.
3)Tiến trình vẽ cánh tay rôbốt:
Định nghĩa các hàm được sử dụng để vẽ :
-

void Box(float width, float height, float depth, char solid):

hàm vẽ hình hộp bao gồm các tham số chiều rộng, chiều cao ,chiều sâu
và tham số điền đầy.
Hình hộp được tạo bởi các mặt phẳng ghép lại
y

n


x
z

- Void gluSphere(
GLUquadricObj *qobj,
GLdouble radius,
GLint slices,
GLint stacks
);

Hàm vẽ hình cầu trong opengl tham số đầu tiên là con trỏ trỏ tới đối

tượng vẽ, tham số thứ 2 là bán kính, tham số thứ 3 là số mặt được chia xung
quanh trục z , tham số cuối là số mặt được chia dọc theo trục z.
-

Void gluCylinder(

- 24 -


Khoa Toán Tin - Ứng Dụng
Đồ án môn học

Đồ Hoạ Máy Tính
Mô Phỏng Chuyển Động Rôbốt

GLUquadricObj *qobj,
GLdouble baseRadius,
GLdouble topRadius,

GLdouble height,
GLint slices,
GLint stacks
); hàm vẽ hình trụ

Tham số đầu tiên là con trỏ trỏ tới đối tượng vẽ, tham số thứ 2 là bán kính
tại z= 0, tham số thứ 3 là bán kính của trụ tại độ cao z, tham số thứ 4 là độ
cao của trụ, tham số thứ 5 là số mặt chia xung quanh trục z, tham số cuối
cùng là số mặt chia dọc theo trục z
- Void gluDisk(
GLUquadricObj *qobj,
GLdouble innerRadius,
GLdouble outerRadius,
GLint slices,
GLint loops
); Hàm vẽ đĩa tròn

Tham số đầu tiên là con trỏ trỏ tới đối tượng vẽ, tham số thư 2 bán kính
trong, tham số thứ 3 bán kính ngoài, tham số thứ 4 là số mặt chia, tham số
thứ 5 là số vòng tròn đồng tâm.

- 25 -


×