Tải bản đầy đủ

Nghiên cứu thư viện đồ họa OpenGL và ứng dụng trong mô phỏng động học của robot

LỜI CẢM ƠN
Trong suốt quá trình thực hiện đồ án tốt nghiệp: “Nghiên cứu thư viện đồ
họa OpenGL và ứng dụng trong mô phỏng động học của Robot”, ngoài sự cố
gắng hết mình của bản thân, trong quá trình làm đồ án em đã nhận được sự giúp
đỡ tận tình từ phía nhà trường, thầy cô gia đình và bạn bè.
Em xin gửi lời cảm ơn sâu sắc đến ThS.Nguyễn Văn Huân mặc dù bận
nhiều công việc nhưng đã dành thời gian hướng dẫn và giúp đỡ em tận tình trong
quá trình làm đồ án tốt nghiệp.
Em xin chân thành cảm ơn các thầy, cô trường Đại học Công nghệ thông
tin và Truyền thông đã truyền đạt những kiến thức quý báu cho em trong suốt quá
trình học tập.
Em cũng xin cảm ơn tới gia đình và bạn bè đã luôn quan tâm, động viên,
giúp đỡ và tạo điều kiện cho em để em có điều kiện tốt nhất để hoàn thành đồ án này.
Trong quá trình thực hiện đồ án, mặc dù em đã có nhiều cố gắng nhưng do
hạn chế về thời gian cũng như kinh nghiệm nên đồ án này chắc chắn còn mắc phải
những thiếu sót, rất mong được sự góp ý kiến của các thầy cô và các bạn để ứng
dụng mà đồ án đề cập được hoàn thiện hơn.
Em xin chân thành cảm ơn!
Thái nguyên, ngày 16 tháng 06 năm 2012
Sinh viên thực hiện
Cao Thị Lâm


1


LỜI CAM ĐOAN
Để hoàn thành đồ án tốt nghiệp đúng thời gian quy định và đáp ứng được
yêu cầu của đề tài, bản thân em đã cố gắng tìm hiểu và nghiên cứu, học tập và
làm việc trong thời gian dài. Em đã tham khảo một số tài liệu được nêu trong
phần “Tài liệu tham khảo” và các mã nguồn mở được cho phép sử dụng cùng các
diễn đàn mạng uy tín trên Internet. Nội dung đồ án hoàn toàn không sao chép từ
các đồ án khác, không vi phạm bản quyền tác giả. Toàn bộ đồ án là do bản thân
em nghiên cứu và xây dựng nên.
Em xin cam đoan những lời trên là đúng, nếu có thông tin sai lệch em xin
hoàn toàn chịu trách nhiệm trước hội đồng.
Thái nguyên, ngày 16 tháng 06 năm 2012
Sinh viên thực hiện

Cao Thị Lâm

2


MỤC LỤC

DANH MỤC BẢNG

3


DANH MỤC HÌNH VẼ

LỜI NÓI ĐẦU
Robot công nghiệp là lĩnh vực đã được nghiên cứu và phát triển mạnh trên
thế giới. Ở nước ta, lĩnh vực này còn mới mẻ, ngày nay trong môi trường sản xuất
hiện đại, hầu hết các quy trình được thực hiện bằng các máy chuyên dùng. Với
các phương pháp này, đã làm giảm rõ rệt chi phí sản xuất các sản phẩm công
nghiệp phù hợp với đa số người tiêu dùng. Tuy nhiên mỗi máy công cụ được thiết
kế để thực hiện nguyên công cho trước, mỗi khi cần thay đổi kiểu mẫu sản phẩm
thì toàn bộ dây chuyền sản xuất phải được cải tạo lại. Kiểu tự động hoá này là
kiểu tự động hóa cứng và rất tốn kém. Do vậy mà trên thế giới có phương pháp

sản xuất tiên tiến đó là chế tạo ra các loại robot được đưa vào quy trình chế tạo
để thực hiện nhiều nguyên công như: chuyển tải vật tư và các thiết bị trong các
dây chuyền hiện đại, hàn điểm, sơn phun và lắp ráp trong công nghiệp ô tô… Do
các cơ cấu hoạt động được điều khiển bằng máy tính hoặc các bộ vi xử lý, chúng
có thể tái lập dễ dàng cho nhiều nguyên công khác nhau, do đó không cần thay
các máy móc này khi thay đổi kiểu mẫu sản phẩm. Đây là kiểu tự động hoá linh
hoạt và mang lại hiệu quả kinh tế cao và rất cần thiết trong hoàn cảnh của đất
nuớc ta hiện nay đang tiến tới công nghiệp hóa và hiện đại hoá đất nuớc.
Robot công nghiệp được ứng dụng rộng rãi trong các dây chuyền sản xuất
hiện đại và có sự linh hoạt cao, vì vậy việc nghiên cứu và chế tạo robot là cần
thiết. Trong quá trình tính toán, thiết kế và chế tạo robot thì việc mô phỏng các
hoạt động của robot là một phần rất quan trọng. Quá trình mô phỏng sẽ cho ta
4


thấy được sự hoạt động và quá trình làm việc của robot. Với các ý nghĩa đó, trong
Đồ án tốt nghiệp này em đã chọn đề tài “Nghiên cứu thư viện đồ họa OpenGL
và ứng dụng trong mô phỏng động học của Robot”.
Nội dung của đồ án gồm có ba chương như sau:
 Chương 1: Tổng quan về động học và thư viện đồ họa OpenGL.
 Chương 2: Phân tích, thiết kế bài toán mô phỏng hoạt động của Robot.
 Chương 3: Chương trình mô phỏng.

5


CHƯƠNG 1: TỔNG QUAN VỀ ĐỘNG HỌC VÀ THƯ VIỆN ĐỒ
HỌA OPENGL
1 Giới thiệu chung
Ngày nay, Robot công nghiệp có vai trò rất quan trọng và được ứng dụng
rộng rãi trong quá trình sản xuất của nền công nghiệp hiện đại. Để chế tạo ra
được một mô hình robot và đem ra phục vụ cho sản xuất phải trải qua rất nhiều
giai đoạn như: tìm hiểu về các loại robot và các đặc tính hoạt động của nó, tính
toán một cách chính xác các khâu của các cơ cấu, các phương trình hoạt động và
thiết kế các mô hình 3D sao cho tối ưu và hiệu quả nhất. Một mô hình robot hoạt
động trơn tru và đáp ứng được các yêu cầu kỹ thuật đề ra đòi hỏi việc chế tạo là
hết sức tỉ mỉ và chi tiết từng bước một. Trong một mô hình robot bao gồm rất
nhiều phần như: cơ khí để chế tạo ra các chi tiết, điện tử để điều khiển các hoạt
động và tin học để lập trình cho các cơ cấu của robot hoạt động theo các quỹ đạo
và yêu cầu kỹ thuật đề ra. Một phần cũng rất quan trọng mà một mô hình robot
nào cũng phải thực hiện là mô phỏng quá trình hoạt động của nó.
Để lập trình mô phỏng được hoạt động của robot, sau đây em xin giới
thiệu tổng quan về động học và thư viện đồ họa OpenGL.
1.2 Động học
Động học khảo sát chuyển động cơ học của vật thể (chất điểm) về mặt
hình học, không quan tâm đến nguyên nhân gây chuyển động và biến đổi chuyển
động của chúng.
Khi vật thể có kích thước rất bé so với quỹ đạo chuyển động của nó hoặc
có thể bỏ qua thì ta coi đó là chất điểm chuyển động, gọi tắt là động điểm.
Chuyển động xảy ra trong không gian nhưng hoàn toàn có tính tương đối
phụ thuộc vào vật lấy làm mốc để theo dõi chuyển động. Vật lấy làm mốc được
gọi là hệ quy chiếu.
Để tính thời gian ta chọn một thời điểm tuỳ ý làm thời điểm gốc (t 0),
thường chọn t0 là lúc bắt đầu khảo sát chuyển động.

6


Động học được chia làm hai phần chính là “Động học điểm” và “Động
học vật rắn”. Và để mô phỏng được động học của Robot, dưới đây em xin giới
thiệu tổng quan về động học vật rắn hay chuyển động cơ bản của vật rắn. Từ đó
ứng dụng vào tìm hiểu động học của Robot.
1.2.1 Chuyển động cơ bản của vật rắn
1.2.1.1 Chuyển động tịnh tiến của vật rắn
 Định nghĩa
Chuyển động tịnh tiến của vật rắn là chuyển động mà mỗi đoạn thẳng
thuộc vật đều song song với vị trí ban đầu của nó.
Ví dụ: Thùng xe chuyển động tịnh tiến so với mặt đường trên đoạn đường
thẳng như hình 1.1:

Hình 1.1: Chuyển động tịnh tiến của thùng xe trên đoạn đường thẳng
Chuyển động tịnh tiến có thể là thẳng hoặc cong, các điểm thuộc vật rắn
chuyển động tịnh tiến có thể chuyển động không thẳng, không đều nên không có
khái niệm điểm chuyển động tịnh tiến.
 Tính chất của chuyển động tịnh tiến
Trong chuyển động tịnh tiến, mọi điểm thuộc vật chuyển động giống hệt
nhau. Nghĩa là tại mỗi thời điểm vận tốc và gia tốc của các điểm thuộc vật giống
hệt nhau. Quỹ đạo của mọi điểm thuộc vật có thể tịnh tiến để trùng khít lên nhau.
Như vậy, có thể thấy:
• Khảo sát một số chuyển động tịnh tiến của vật rắn có thể thay bằng khảo sát
chuyển động của một điểm thuộc vật.

7


• Lấy tên chuyển động của chất điểm thuộc vật để đặt tên cho chuyển động của vật
ấy.
• Lấy vận tốc, gia tốc của điểm thuộc vật làm vận tốc, gia tốc của vật.
1.2.1.2 Chuyển động của vật rắn quanh trục cố định
 Định nghĩa
Nếu trong quá trình chuyển động vật rắn có hai điểm cố định thì vật rắn
chuyển động quanh trục cố định đi qua hai điểm ấy.
Trục đi qua hai điểm cố định được gọi là trục quay của vật rắn.
 Phương trình chuyển động của vật rắn quay quanh trục cố định
Dựng hai mặt phẳng và П chứa trục quay của vật, là mặt phẳng cố định
còn П là mặt phẳng động gắn với vật rắn. Vị trí của mặt phẳng П xác định vị trí
của vật. Gọi là góc giữa hai mặt phẳng và П, như vậy là thông số xác định vị trí
của vật rắn quay quanh trục cố định. Ta có phương trình chuyển động của vật
rắn:
= (t) .
Quy ước: > 0 khi vật quay ngược chiều kim đồng hồ. Đơn vị tính góc là
[rad].

Hình 1.2: Chuyển động của vật rắn quanh trục cố định

8


1.2.1.3 Chuyển động của điểm thuộc vật rắn quanh trục cố định
Xét chuyển động của điểm M thuộc vật rắn. M cách trục quay z là R=IM.
Khi vật rắn quay, quỹ đạoM là đường tròn tâm I bán kính R=IM.

Hình 1.3: Chuyển động của điểm thuộc vật rắn quanh trục cố định
Khi đó ta có phương trình chuyển động của điểm thuộc vật được xác định
như sau:
Do đã biết quỹ đạo của M nên ta dùng hệ tọa độ tự nhiên để khảo sát.
Chọn O là giao điểm của quỹ đạo điểm M với mặt phẳng làm gốc tọa độ, chọn
chiều quay ngựơc chiều kim đồng hồ làm chiều dương. Như vậy vị trí của M
được xác định bằng cung S = . Ta có phương trình chuyển động của M:
= = R . (t) .
1.2.2 Động học của Robot
Về mặt động học, có thể xem tay máy như là một chuỗi động hở với một
khâu cố định, gọi là giá, và các khâu động. Mỗi khâu động là một vật rắn được
liên kết hoặc nối động với nhau nhờ các khớp động.
Bất kỳ một Robot nào cũng bao gồm các khâu liên kết với nhau thông
qua các khớp. Hai chuyển động cơ bản của các khâu thông qua khớp quay và
khớp tịnh tiến.
Để khảo sát chuyển động của các khâu, ta thường dùng phương pháp hệ
toạ độ tham chiếu hay hệ toạ độ cơ sở. Bằng cách “gắn cứng” lên mỗi khâu động
thứ k một hệ trục toạ độ vuông góc (Oxyz) k - còn gọi là các hệ toạ độ tương đối
9


và gắn cứng với giá cố định hệ trục toạ độ vuông góc (Oxyz) 0 - còn gọi là hệ toạ
độ tuyết đối, hệ toạ độ tham chiếu hay hệ toạ độ cơ sở, ta có thể khảo sát chuyển
động của một khâu bất kỳ trên tay máy hoặc chuyển động của một điểm bất kỳ
thuộc khâu.
Theo đó, toạ độ của điểm M thuộc một khâu bất kỳ, được xác định bởi bán
kính vectơ . Với các thành phần (hình chiếu) của nó trong hệ toạ độ
cơ sở (oxyz)0 lần lượt là , , được gọi là toạ độ tuyệt đối của điểm M.
Toạ độ của điểm M thuộc khấu thứ k được xác định bởi bán kính vectơ
với các thành phần tương ứng của nó trong hệ toạ độ (oxyz), gắn cứng với khâu
lần lượt là , , được gọi là toạ độ tương đối của điểm.
Mếu M là điểm cố định trên khâu thì toạ độ tương đối của M sẽ không
thay đổi khi khâu chuyển động.
Dưới dạng ma trận ta có thể biểu diễn:
= =()T
= =()T
Bằng cách mô tả như trên, ta có thể coi tay máy như là một chuỗi các hệ
toạ độ liên tiếp có chuyển dộng tương đối với nhau.
Chuyển động của một tay máy thường là nhằm làm thay đổi vị trí và
hướng khâu tác động cuối hay khâu cuối (end - effector) bằng cách tuần tự cho
khâu cuối đi qua các điểm xác định nào đó để tạo ra các hoạt động có ích đã được
hoạch định trước.
Vì vậy, khi khảo sát chuyển động của tay máy, người ta thường quan tâm
đến chuyển động của khâu cuối bao gồm quỹ đạo hoặc các vị trí đi qua (hay tổng
quát là một đường cong trong không gian ba chiều), vận tốc và gia tốc chuyển
động ... mà không quan tâm nhiều đến chuyển động của các khâu trung gian (gọi
là các khâu thành viên).
Từ những khái niệm nêu trên, ở nội dung động học có hai bài toán thường
được đặt ra như sau: Bài toán động học thuận và bài toán động học ngược (sẽ
được trình bày và tính toán chi tiết trong chương tiếp theo).

10


Bài toán động học thuận: xác định vị trí điểm cuối và hướng tay kẹp mà
tay máy đạt được khi qui luật thay đổi theo thời gian của các thông số định vị của
tay máy là hàm đã biết. Bài toán này nhằm phục vụ bài toán xác định phạm vi
hoạt động của tay máy, bài toán thuận trong động lực học tay máy…
Bài toán động học ngược: xác định qui luật thay đổi theo thời gian của tay
máy để nó nắm bắt được vị trí đã cho của đối tượng theo một hướng định trước
của tay kẹp. Bài toán này nhằm phục vụ các bài toán điều khiển qũy đạo, các bài
toán điều khiển tối ưu...
1.3 Thư viện đồ họa OpenGL
Để hiểu một cách cụ thể về công cụ đồ họa như OpenGL thì một câu hỏi được
đặt ra là: OpenGL là gì? Và tại sao lại sử dụng OpenGL cho bài toán mô phỏng?
OpenGL là chữ viết tắt của Open Graphic Library, là một thư viện đồ họa
tốc độ cao và độc lập với hệ thống giao diện các hệ điều hành. Tiền thân của
OpenGL là IRIS GL do hãng Silicon Graphic Library Inc phát triển cho các
WorkStation đồ họa tốc độ cao từ năm 1982. Sau đó từ năm 1992 thì OpenGL đã
trở thành một chuẩn công nghiệp và đặc tính kỹ thuật của OpenGL do ủy ban kỹ
thuật ARB (Architectural Review Board) phê chuẩn.
Công nghệ đồ họa đang ngày càng được ứng dụng trong cuộc sống, và
ngày nay, nó đã được phát triển tương đối mạnh mẽ ở Việt Nam. Trong kỹ thuật
thì việc sử dụng các ứng dụng của OpenGL cũng như DirectX vào việc mô phỏng
các cơ cấu máy móc, các hoạt động của Robot công nghiệp trước khi đem thử
nghiệm bằng mô hình thực là giải pháp mà rất nhiều kỹ sư cơ khí cũng như cũng
như các viện nghiên cứu lựa chọn do tính ưu việt của nó trong việc thể hiện các
mô hình đồ họa động trong không gian ba chiều (3D). Vì vậy trong phạm vi của
đồ án này em chọn cách sử dụng OpenGL để xây dựng bài toán mô phỏng.

11


1.3.1 Cơ chế hoạt động của OpenGL

Hình 1.4: Cơ chế hoạt động của OpenGL
OpenGL có cơ chế hoạt động theo kiểu ống dẫn, tức là đầu ra của giai
đoạn trước là đầu vào của giai đoạn sau. Từ sơ đồ thì các thành phần của cơ chế
được giải thích như sau:


Display List: Là nơi lưu lại một số lệnh để xử lý sau.


Evaluator (bộ ước lượng): Xấp xỉ các đường cong và mặt phẳng hình học
bằng cách đánh giá các đa thức của dữ liệu đưa vào.



Per- vertex Operations and Primitive assembly: Xử lý các primitive hình học
(điểm, đoạn thẳng, đa giác) được biểu diễn bởi các vertex. Các vertex sẽ được xử
lý và các primitive được cắt xén vào viewport để chuẩn bị cho khâu kế tiếp.



Rasterization: Tạo ra một chuỗi các địa chỉ bộ đệm khung và các giá trị liên
quan bằng cách sử dụng mô tả 2 chiều của điểm, đoạn thẳng hay đa giác. Mỗi
phần tử (fragment) được sinh ra sẽ đưa vào giai đoạn kế tiếp.



Per- fragment operations: Là các thao tác cuối cùng trên dữ liệu, trước khi lưu
trữ dữ liệu dưới dạng các pixel trong bộ đệm khung. Các thao tác này bao
gồm việc cập nhật (có điều kiện) cho bộ đệm khung dựa vào dữ liệu vào và dữ
liệu được lưu trữ trước đó, thực hiện trộn màu cho các pixel và làm một số
thao tác khác.
Trong trường hợp dữ liệu vào ở dạng pixel không phải vertex, nó sẽ đưa

thẳng vào giai đoạn xử lý pixel. Sau giai đoạn này, dữ liệu ở dạng pixel sẽ được
lưu trữ như là bộ nhớ texture để đưa vào giai đoạn Per-fragment operation hoặc
đưa vào Rasterization như dữ liệu dạng Vertex.
12


1.3.2 Đặc điểm của OpenGL
OpenGL là một thư viện đồ họa rất lớn gồm khoảng 150 hàm hỗ trợ một
số tính năng cơ bản sau:
1.3.2.1 Thể hiện các đối tượng đồ họa cơ bản
OpenGL không có sẵn các hàm để xây dựng các đối tượng hình học phức
tạp, người dùng phải tự xây dựng chúng từ các đối tượng hình học cơ bản mà
OpenGL hỗ trợ: điểm, đoạn thẳng, đa giác.
Mọi đối tượng hình học đều được mô tả cơ bản từ các vertex. Vertex cũng
có thể hiểu là một điểm. Khai báo một điểm, dùng hàm:
glVertex{234}{sifd}[v] (Tọa độ điểm);
Trong đó:
{234} – Chỉ định số chiều của không gian.
{sifd} – Chỉ định kiểu dữ liệu của tọa độ, ý nghĩa được chỉ định trong bảng
1.1 như sau:
Bảng 1.1: Một số kiểu dữ liệu của OpenGL
Kí hiệu
s
i
f
d

Kiểu dữ liệu
16 – bit integer
32 – bit integer
32 – bit floating – point
64 – bit floating – point

Tên kiểu của OpenGL
GLshort
GLint, GLsizei
GLfloat, GLclampf
GLdouble, GLclampd

[v] – Nếu tọa độ điểm được truyền từ 1 mảng cho trước.
Việc xây dựng các đối tượng hình học khác đều có thể được thực hiện như sau:
glBegin(mode);
/* xác định tọa độ và màu sắc các điểm của hình */
glEnd();

13


Danh sách các mode (tham số) có thể là một trong những giá trị sau:
Bảng 1.2: Các tham số của glBegin()
Giá trị
GL_POINTS
GL_LINE
GL_POLYGON
GL_TRIANGLES
GL_QUADS
GL_LINE_STRIP
GL_LINE_LOOP
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
GL_QUAD_STRIP

Ý nghĩa.
Các điểm.
Đoạn thẳng.
Đa giác lồi.
Tam giác.
Tứ giác.
Đường gấp khúc không khép kín.
Đường gấp khúc khép kín.
Một dải tam giác liên kết với nhau.
Các tam giác liên kết theo hình quạt.
Một dải các tứ giác liên kết với nhau.

Dưới đây là hình minh họa cho các loại mode:

Hình 1.5: Các đối tượng đồ họa cơ bản
Ngoài ra còn có một số đối tượng ba chiều cơ bản như: Hình cầu, hình trụ,
hình hộp ... từ đó ta xây dựng được các đối tượng ba chiều phức tạp hơn, thậm chí
có thể tự định nghĩa hay thiết kế các phần mềm hỗ trợ thiết kế ba chiều như
AutoCAD, SolidWorks, 3D Max.
Ví dụ: Các lệnh để thực hiện quá trình vẽ các điểm trong môi trường 2D
của OpenGL như sau:

14


glBegin(GL_POINTS);
glVertex2f(0.0f,0.0f);
glVertex2f(1.0f,0.0f);
glVertex2f(0.0f,1.0f);
glEnd();
Các lệnh để vẽ các điểm tạo thành hình ngũ giác trong môi trường 2D:
glBegin(GL_POLYGON);
glVertex2f(0.0f,0.0f);
glVertex2f(3.0f,0.0f);
glVertex2f(4.0f,3.0f);
glVertex2f(1.5f,6.0f);
glVertex2f(-1.0f,3.0f);
glEnd();

Hình 1.6: Quá trình vẽ các Vertex 2D t

1.3.2.2 Quan sát đối tượng
Các đối tượng có thể quan sát từ nhiều góc độ khác nhau thông qua các
phép biến đổi vị trí mắt nhìn hay phép biến đổi vị trí vật cũng như các phép chiếu...
1.3.2.3 Định màu sắc, vật liệu đối tượng

15


OpenGL có thể thể hiện màu sắc đối tượng một cách đa dạng và đặc biệt là
khả năng thể hiện thuộc tính vật liệu.
Để thiết lập màu sắc cho đối tượng, ta dùng hàm : glColor3f() ;
Ví dụ :
glColor3f(0.0, 0.0, 0.0); // black
glColor3f(1.0, 0.0, 0.0); // red
glColor3f(0.0, 1.0, 0.0); // green
glColor3f(1.0, 1.0, 0.0); // yellow
glColor3f(0.0, 0.0, 1.0); // blue
glColor3f(1.0, 0.0, 1.0); // magenta
glColor3f(0.0, 1.0, 1.0); // cyan
glColor3f(1.0, 1.0, 1.0); // white
Ví dụ: quá trình Render màu sắc của đối tượng:

Hình 1.7: Quá trình Render màu sắc của vật liệu

1.3.2.4 Tạo hiệu ứng ánh sáng OpenGL trong chương trình mô phỏng
Cho phép tạo ra hiệu ứng ánh sáng như trong thực tế tạo nên cảm giác thật
cho các mô hình và khung cảnh ba chiều.

16


void COpenGLView::SetupLighting ()
{
//Material Properties
GLfloat matSpecular[] = { 1.0f, 0.0f, 0.0f, 1.0f};
GLfloat matShininess[] = { 50.0f};
GLfloat matAmbient[] = { 0.25f, 0.25f, 0.25f, 1.0f};
GLfloat matDiffuse[] = { 0.5f, 0.5f, 0.5f, 1.0f};
glMaterialfv(GL_FRONT, GL_SPECULAR, matSpecular);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_DIFFUSE, matDiffuse);
glMaterialfv(GL_FRONT, GL_AMBIENT, matAmbient);
//Lighting Parameters
//Enable Lighting
glEnable(GL_LIGHTING);
//Specify a single directional light
GLfloat ambient1[] = { 0.5f,0.5f,0.5f};
GLfloat diffuse1[] = { 0.5f,0.5f,0.5f};
GLfloat specular1[] = { 1.0f,0.0f,0.0f};
GLfloat position1[] = { 0.0f,0.0f,5.0f,0.0};
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient1);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse1);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular1);
glLightfv(GL_LIGHT0, GL_POSITION, position1);
glEnable(GL_LIGHT0);
GLfloat ambient2[] = { 1.0f,1.0f,0.0f};
GLfloat diffuse2[] = { 1.0f,0.0f,0.0f};
GLfloat position2[] = { 1.0f,0.0f,5.0f,1.0};
GLfloat direction2[] = {0.0f,0.0f,-5.0f};
glLightfv(GL_LIGHT1, GL_AMBIENT, ambient2);
glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse2);
glLightfv(GL_LIGHT1, GL_POSITION, position2);
glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, direction2);
glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 15.0f);
glEnable(GL_LIGHT1);
}

17


Hình 1.8: Quá trình tạo hiệu ứng ánh sánh cho đối tượng
1.3.2.5 Tạo khung cảnh mô phỏng thực tế OpenGL
Hỗ trợ các kỹ thuật tạo các khung cảnh giống với thực tế như: Kỹ thuật
dán ảnh, kỹ thuật sương mù, kỹ thuật pha trộn, kỹ thuật giảm hiệu ứng răng cưa.


Kỹ thuật dán ảnh (Texture Mapping)
Đôi khi chúng ta cần thể hiện một đối tượng phức hợp, một trong những

cách để làm được điều này là thêm chất liệu (dán ảnh) vào đối tượng và nó được
gọi là Texture Mapping.
Ví dụ, để tạo thành các Texture Mapping thì các lệnh như sau sẽ thực thi
trong OpenGL:
void COpenGLView::LoadTexture (CString fileName, int texName)
//Load Texture
AUX_RGBImageRec* m_texture;
m_texture = auxDIBImageLoad((const char*)fileName);
if(!m_texture)
{
MessageBox("Picture could not be loaded");
exit(1);
}
glBindTexture(GL_TEXTURE_2D, m_Texture[texName]);

18


glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,
m_texWrap);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,
m_texWrap);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,
m_texFilter);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,
m_texFilter);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,
m_texMode);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, m_texture->sizeX,m_texture
->sizeY, GL_RGB, GL_UNSIGNED_BYTE, m_texture->data);
}
void COpenGLView::RenderScene ()
{
glTranslatef(0.0f,0.0f,-5.0f);
glRotatef(m_xRot,1.0f,0.0f,0.0f);
glRotatef(m_yRot,0.0f,1.0f,0.0f);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,m_Texture[0]);
//Front Face
glBegin(GL_POLYGON);
glTexCoord2f(0,0);
glVertex3f(-1.0f,-1.0f,0.0f);
glTexCoord2f(1,0);
glVertex3f( 1.0f,-1.0f,0.0f);
glTexCoord2f(1,1);
glVertex3f( 1.0f, 1.0f,0.0f);
glTexCoord2f(0,1);
glVertex3f(-1.0f, 1.0f,0.0f);

19


glEnd();
// Back face
glBindTexture(GL_TEXTURE_2D,m_Texture[1]);
// Left and Right Faces
glBindTexture(GL_TEXTURE_2D,m_Texture[2]);
// Top and Bottom faces
glDisable(GL_TEXTURE_2D);
}

Hình1.9: Quá trình Texture Mapping trên OpenGL



Kỹ thuật pha trộn (Blending)
Là kỹ thuật kết hợp màu của các pixel nguồn và đích theo các cách khác

nhau để tạo thành những hiệu quả đặc biệt. Pha trộn thường được sử dụng để tạo
các đối tượng trong mờ. Khi một đối tượng được pha trộn chồng lên đối tượng
khác thì có thể nhìn xuyên qua đối tượng được bao phủ do màu của đối tượng
nguồn kết hợp với màu của pixel được bao phủ tạo ra màu mới.
Với ví dụ trên, ta có quá trình Blending:

20


glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
GLfloat matSpecular[] = { 1.0f, 0.0f, 0.0f, 0.5f};
GLfloat matAmbient[] = { 0.25f, 0.25f, 0.25f, 0.5f};
GLfloat matDiffuse[] = { 0.5f, 0.5f, 0.5f, 0.5f};

Hình 1.10: Quá trình Blending màu sắc của vật liệu trên OpenGL
• Hiệu ứng sương mù (Fog)
Cho phép tạo hiệu ứng hình ảnh mờ dần khi đối tượng chuyển động xa
khỏi mắt nhìn.
Và với ví dụ trên, ta có quá trình tạo hiệu ứng sương mù:
glFogi(GL_FOG_MODE, GL_EXP);
GLfloat fog_color[4] = {0.2f,0.2f,0.2f,0.0f};
glFogfv(GL_FOG_COLOR, fog_color);
glFogf(GL_FOG_DENSITY, 0.25);

21


Hình 1.11: Quá trình tạo hiệu ứng sương mù trên OpenGL
• Kỹ thuật giảm hiệu ứng răng cưa (Antialiasing)
Sử dụng các sắc thái màu khác nhau để che dấu cạnh răng cưa của
đường thẳng trên màn hình. Thực tế Antialiasing chỉ là một kiểu hiệu quả pha
trộn OpenGL.
1.3.2.6 Cải thiện tốc độ OpenGL
Khi ta có ý định vẽ lại hoặc thay đổi trạng thái nhiều lần một đối tượng, sử
dụng Display list để làm tăng khả năng thực thi chương trình. Trong OpenGL,
dislay list sẽ làm giảm sự hao phí thời gian truyền dữ liệu. Ví dụ: muốn vẽ một
cái ôtô có bốn bánh, thay vì việc phải viết đoạn mã vẽ bánh ôtô bốn lần ta sẽ tạo
một danh sách hiển thị làm nhiệm vụ vẽ bánh ôtô và gọi nó bốn lần.
1.3.2.7 Chọn các đối tượng đồ họa
Việc cho phép người dùng chọn đối tượng đồ hoạ bằng cách click chuột
trên cửa sổ là một yêu cầu thiết yếu đối với các ứng dụng tương tác. Để thực hiện
được những chức năng như vậy, trong OpenGL có sẵn một chế độ là Selection.
Và chế độ này được ứng dụng trong kỹ thuật mô phỏng va chạm của các vật thể.
1.3.3 Thư viện hỗ trợ lập trình OpenGL
Ngoài các thư viện chuẩn OpenGL như: GLU32.lib, OpenGL.lib, còn một
số thư viện hỗ trợ lập trình OpenGL. Như đã đề cập ở trên OpenGL là một thư
viện đồ hoạ đã được chuẩn hoá. Vì vậy các chương trình sử dụng các hàm
OpenGL cơ bản có khả năng tương thích với các chương trình biên dịch trên các
22


hệ điều hành khác nhau mà không cần sửa đổi hoặc chỉ sửa không đáng kể. Tuy
nhiên do OpenGL độc lập với các hệ thống giao diện, nên các chương trình muốn
sử dụng OpenGL trên các hệ điều hành khác nhau thì cần sử dụng các thư viện hỗ
trợ giao tiếp giao diện ứng với từng hệ điều hành riêng. Ví dụ các chương trình đồ
hoạ sử dụng OpenGL trên Microsoft Windows phải sử dụng thư viện giao tiếp
WGL, trên Apple Macintosh phải sử dụng thư viện AGL, trên Unix / Linux. X
Window system phải sử dụng thư viện GLX... Phần giao tiếp này phải phù hợp
với từng hệ điều hành khác nhau. Một thư viện giao tiếp khác, thư viện GLUT
(OpenGL Utility Toolkit của tác giả Mark Kilgard) giúp tạo các ứng dụng đồ hoạ
hỗ trợ các giao diện giao tiếp trên nhiều hệ điều hành như tạo các cửa sổ chương
trình, menu, xử lý đầu vào: bàn phím, chuột... Thư viện này được xây dựng độc
lập với nhiều hệ điều hành do đó các chương trình đồ hoạ sử dụng OpenGL và
GLUT có khả năng tương thích cao trong các hệ điều hành hỗ trợ GLUT. Hiện đã
có phiên bản trên tất cả các hệ điều hành chủ yếu như Microsoft Windows, Unix/
Linux, X Window system, Apple Macintosh.
Ngoài ra, các thư viện thương phẩm như Open Inventer, Performer... được
xây dựng dựa trên OpenGL cung cấp những thao tác phức tạp hơn như: Tạo các
khung cảnh (Scene), giao tiếp với người dùng, khả năng trao đổi dữ liệu đồ hoạ
với các phần mềm đồ hoạ khác... Nhờ vậy việc xây dựng các ứng dụng đồ họa ba
chiều trở nên nhanh chóng và dễ dàng hơn.
1.3.4 Các bước tổng quan khi xây dựng ứng dụng đồ hoạ với thư viện OpenGL
1.3.4.1 Khởi tạo môi trường hỗ trợ cho OpenGL
OpenGL là một thư viện đồ hoạ độc lập với hệ thống giao diện của
các hệ điều hành, do đó các ứng dụng đồ hoạ sử dụng OpenGL trên các hệ
điều hành khác nhau đều phải có một quá trình khởi tạo thích hợp với các
hàm xử lý đồ hoạ của OpenGL. Quá trình này được thực hiện bằng việc gọi
một số hàm thích hợp của các thư viện hỗ trợ giao tiếp với OpenGL trong
chương trình ứng dụng. Quá trình khởi tạo bao gồm: định nghĩa một kiểu
cấu trúc dữ liệu đồ hoạ phù hợp với quản lý thông tin về định dạng điểm
ảnh và lựa chọn các thông số phù hợp với hệ thống. Các thông số này bao
gồm: kiểu điểm ảnh (RGBA hay color index), bộ đệm hoán đổi đơn hay kép

23


(single/double buffer), độ phân giải màu sắc, khả năng hỗ trợ bộ đệm chiều
sâu (depth buffer), bộ đệm stencil (stencil buffer), bộ đệm

tích lũy

(accumulation buffer). Dưới đây là kiểu cấu trúc dữ liệu đồ hoạ trên các hệ
điều hành khác nhau:


Điều khiển Rendering (Control Rendering): Sau khi thiết lập và lựa chọn
định dạng điểm ảnh phù hợp với từng hệ thống, tất cả các hệ thống đều
phải thực hiện việc điều khiển quá trình tô vẽ (Rendering). Quá trình này
thực hiện các việc: Tạo và sử dụng ngữ cảnh tô vẽ (rendering context),
thực hiện quá trình đồng bộ hoá (synchronizing execution), hoán đổi các
bộ đệm (swaping buffers), sử dụng các phông hệ thống...



Tô vẽ (rendering): là một quá trình tạo và hển thị điểm ảnh hai chiều lên
các thiết bị kết xuất đồ hoạ như: màn hình máy tính, máy in... từ các đối
tượng đồ hoạ ba chiều.



Ngữ cảnh (context): Trong OpenGL, ngữ cảnh là một khái niệm chỉ một
tập hợp đầy đủ các biến trạng thái của OpenGL.



Biến trạng thái: Các trạng thái trong OpenGL như: định dạng điểm ảnh, màu
sắc, ánh sáng... đều được điều khiển bằng các biến trạng thái tương ứng.



Ngữ cảnh tô vẽ (rendering context): Có thể coi ngữ cảnh tô vẽ của OpenGL
như một cổng mà tất cả các hàm của OpenGL phải đi qua để giao tiếp với
thiết bị đồ hoạ phần cứng. Ngữ cảnh tô vẽ tạo ra định dạng điểm ảnh giống
hệt với định dạng điểm ảnh của ngữ cảnh thiết bị (device context) gắn với
nó. Một chương trình ứng dụng có thể có nhiều ngữ cảnh tô vẽ.



Quá trình đồng bộ hoá: Quá trình này buộc các hàm của OpenGL hay các
hàm đồ hoạ của hệ thống phải chờ cho đến khi hàm trước đó được thực
hiện xong. Điều này có nghĩa các lệnh của OpenGL ở trước lệnh chờ của
hệ thống sẽ được đảm bảo được thực hiện trước các lệnh của hệ thống nằm
ở sau lệnh chờ đó. Ngược lại các lệnh của OpenGL ở phía sau lệnh chờ
của OpenGL chỉ được thực hiện khi các lệnh của hệ thống nằm ở trước
lệnh chờ của OpenGL đã thực hiện xong.

24




Hoán đổi bộ đệm (Swaping buffer): Mục đích chính của các chương trình
đồ hoạ là thể hiện các hình ảnh trên màn hình. Một hình ảnh chuyển động
cần có 24 hình/giây. Các hình ảnh trước khi được đưa lên màn hình vẽ sẽ
được vẽ lên bộ đệm trung gian, sau đó toàn bộ hình ảnh trên bộ đệm mới
được đưa ra màn hình cùng một lúc. Nếu hệ thống chỉ hỗ trợ một bộ đệm,
những phần vẽ đầu của khung hình sẽ tồn tại trong suốt 1/24 giây, nhưng
các phần vẽ sau của khung hình sẽ bị xoá ngay khi vừa được vẽ để chuẩn
bị cho khung hình tiếp theo. Giải pháp để nâng cao chất lượng điểm ảnh và
hạn chế nhược điểm trên là sử dụng bộ đệm kép. Khi hình ảnh trên bộ đệm
thứ nhất được đưa ra màn hình trong suốt 1/24 giây, thì cùng lúc, hình ảnh
cho khung hình tiếp theo được vẽ trên bộ đệm kia. Sau 1/24 giây thì các bộ
đệm hoán đổi vị trí cho nhau. Quá trình liên tục như vậy sẽ giúp cải thiện
chất lượng đồ hoạ.

1.3.4.2 Xây dựng các đối tượng ba chiều (3D)
Việc xây dựng đối tượng ba chiều phức tạp bằng OpenGL được thực hiện
như sau:


Thiết kế các mô hình ba chiều bằng một phần mềm nhỏ hỗ trợ thiết kế
chuyên dùng như AutoCAD hay SolidWork, 3D Max…



Sử dụng các lệnh trong các phần mềm đó để xuất đối tượng ba chiều ra
các dạng tập tin nhị phân hay ASCII có chứa các thông tin của đối tượng
dưới dạng các đỉnh và quy tắc nối các đỉnh đó thành đa giác. Ví dụ các tập
tin *.BDF, *.STL,…



Đọc thông tin các đối tượng từ các tập tin đó và sử dụng các hàm vẽ
đối tượng cơ bản của OpenGL xây dựng lại đối tượng ba chiều cơ bản
ban đầu.

Vì vậy đây chính là cơ sở để xây dựng các bài toán mô phỏng hoạt động
của Robot.

25


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay

×