CHƯƠNG I CÁC CÔNG CỤ ĐỂ XÂY DỰNG BÀI TOÁN MÔ PHỎNG HOẠT ĐỘNG CỦA ROBOT Các công cụ để xây dựng bài toán mô phỏng gồm có: - Thư viện đồ họa OpenGL. - Ngôn ngữ lập trình Visual C++ và các ứng dụng của MFC. - Phầm mềm thiết kế Solidworks và AutoCAD. Giới thiệu chung.1- Giới thiệu về phần mền 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.1 Logo OpenGL 13 ĐỒ ÁN TỐT NGHIỆP ________________________________________________________________________________________ OpenGL là chữ viết tắt của Open Graphic Library là 1 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. Trong công nghệ đồ họa động đ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 họat động của Rôbốt 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 3 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.2 Gới thiệu về Cơ chế hoạt động của Open GL.2 : 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 : 14 ĐỒ ÁN TỐT NGHIỆP ________________________________________________________________________________________ + Display List: Là nơi lưu lại một số lệnh để xử lý sau. + Evaluator: 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 (điểm,đoạn,đa giác) được mô tả 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: sinh ra một loạt các địa chỉ framebuffer 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,đ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: Các tác vụ sau cùng (cập nhập có điều kiện cho framebuffer dựa vào dữ liệu vào và dữ liệu được lưu trữ trước đó của giá trị z (đối với z buffering), thực hiện trộn màu cho các pixel và làm một số thao tác khác) sẽ được thực hiện trên dữ liệu trước khi nó được chuyển thành pixel và đưa vào framebuffer.
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ữ vào texture memory để đưa vào giai đoạn Per-fragment operation hoặc đưa vào Rasterization như dữ liệu dạng Vertex(tức là các điểm).3 Đặc điểm của OpenGL. Các khả năng của thư viện OpenGL cung cấp.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.Khả năng thể hiện các đối tượng đồ hoạ cơ bản. OpenGL cũng có cách xây dựng các đối tượng theo cách riêng.
Trong OpenGL, 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ể 15 ĐỒ ÁN TỐT NGHIỆP ________________________________________________________________________________________ hiểu là một điểm. Cấu trúc này bao gồm bộ 4 số thực chỉ tọa độ trong không gian. Để chỉ định một vertex, ta dùng: glVertex{234}{sifd}[v](TYPEcoords); Từ hình vẽ trên ta có thể thấy các trường khai báo có nội dung như sau: [v] - véctơ chứa các phần tử là tọa độ của Vertex.
{sifd}- kiểu tham số của vector: Interger, float… {234}- số phần tử của véctơ Các đối tượng đồ hoạ cơ bản như điểm,đoạn thẳng,đa giác,các đường cong hay mặt cong bậc hai. Giá trị Ý nghĩa. GL_POINT Hàm này cung cấp các chức năng vẽ điểm (tức là từng Vertex được vẽ riêng) GL_LINE Vẽ đường thẳng nối giữa 2 điểm ( Mỗi cặp vertex được coi như 2 đầu một đoạn thẳng) GL_LINE_STRIP Tập hợp của những đoạn thẳng nối với nhau ( Bộ 4 vertex xem như các đỉnh tứ giác (có lặp)) GL_LINE_LOOP Đường gấp khúc khép kín(Như trên nhưng vertex đầu và cuối được nối với nhau (lặp vòng)) GL_TRIANGLES Vẽ hình tam giác.( Bộ 3 vertex được xem các đỉnh một tam giác (không lặp)) GL_QUADS Vẽ tứ giác.( Bộ 4 vertex được xem như 4 đỉnh 1 đa giác (không lặp)) GL_TRIANGLES_STRIP Vẽ tập hợp các tứ giác liền nhau chung một cạnh.( Bộ 3 vertex xem như các đỉnh tam giác (có lặp)) GL_TRIANGLE_FAN Vẽ hình quạt.( Vertex 0 là đỉnh chung kết hợp cặp đỉnh 16 ĐỒ ÁN TỐT NGHIỆP ________________________________________________________________________________________ bất kỳ tạo tam giác) Dưới đây là một số hàm thể hiện các đối tượng cơ bản Hình 1.3: Các đối tượng đồ họa cơ bản. 17 ĐỒ ÁN TỐT NGHIỆP ________________________________________________________________________________________ Ngoài ra còn có một số đối tượng 3 chiều cơ bản như: Hình cầu, hình trụ, hình hộp vv.
từ đó ta xây dựng được các đối tượng 3 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ế 3 chiều như AutoCAD, SolidWorks, 3D Max.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: glBegin(GL_POINTS); glVertex2f(0.4: Quá trình vẽ các Vertex 2D trên OpenGL Các lệnh để vẽ các điểm để tạo thành hình ngũ giác trong môi trường 2D như sau: glBegin(GL_POLYGON); glVertex2f(0. Khả năng quan sát đối tượng. 18 ĐỒ ÁN TỐT NGHIỆP ________________________________________________________________________________________ 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. Khả năng định màu sắc vật liệu đối tượng.
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. void COpenGLView::RenderScene () { glTranslatef(0.0f); //Front Face glBegin(GL_POLYGON); glColor3f(1.0f); //Back Face glBegin(GL_POLYGON); glVertex3f(-1.0f); //Left Face glBegin(GL_POLYGON); glVertex3f(-1.0f); //Right Face glBegin(GL_POLYGON); glVertex3f(1.0f); 19 ĐỒ ÁN TỐT NGHIỆP ________________________________________________________________________________________ glVertex3f(1.0f); //Top Face glBegin(GL_POLYGON); glVertex3f(-1.0f); //Bottom Face glBegin(GL_POLYGON); glVertex3f(-1.5 : Quá trình Render màu sắc của vật liệu 1. Khả năng 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 3 chiều.
20 ĐỒ ÁN TỐT NGHIỆP ________________________________________________________________________________________ void COpenGLView::SetupLighting () { //Material Properties GLfloat matSpecular[] = { 1.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); } 21 ĐỒ ÁN TỐT NGHIỆP ________________________________________________________________________________________ Hình 1.6: Quá trình Render màu sắc của vật liệu 1. Khả năng 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 (texture mapping ) để tạo các khung cảnh thực tế, kỹ thuật 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. Kỹ thuật trộn màu (Blending) cho phép tạo các vật thể trong mờ có thể nhìn xuyên qua được.
Kỹ thuật loại bỏ răng cưa (Antialiasing).Để 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]); 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); 22 ĐỒ ÁN TỐT NGHIỆP ________________________________________________________________________________________ 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. 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.7 : Quá trình Texture Mapping trên OpenGL. 23 ĐỒ ÁN TỐT NGHIỆP ________________________________________________________________________________________ Quá trình Blending : ::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); GLfloat matSpecular[] = { 1.8 : Quá trình Blending màu sắc của vật liệu trên OpenGL Hiệu ứng sương mù ::glFogi(GL_FOG_MODE, GL_EXP); GLfloat fog_color[4] = {0.0f}; ::glFogfv(GL_FOG_COLOR, fog_color); ::glFogf(GL_FOG_DENSITY, 0.25); 24 ĐỒ ÁN TỐT NGHIỆP ________________________________________________________________________________________ Hình1.9 : Quá trình tạo hiệu ứng sương mù trên OpenGL.
Khả năng cải thiện tốc độ OpenGL. Cho phép cải thiện tốc độ hiển thị bằng kỹ thuật danh sách hiển thị (display list). Khả năng chọn các đối tượng đồ hoạ (selection and hitting derect). Kỹ thuật này cho phép chọn các đối tượng đồ hoạ 3 chiều và ứng dụng trong kỹ thuật mô phỏng va trạm của các vật thể.Các thư viện hỗ trợ lập trình OpenGL.
Ngoài các thư viện chuẩn OpenGL như GLU32.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 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 25 ĐỒ ÁN TỐT NGHIỆP ________________________________________________________________________________________ độ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, sử 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.