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ôngcần quan tâm tới các thao tác bên trong hoạt động nhưthế
Trang 12.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
Trang 2BÁ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
Trang 3Cá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ôngcầ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ộttậ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àmviệc khác nhau
GKS (Graphics Kernel System) là chuẩn ra đời đầu tiêncho 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 haichiề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
Trang 4II 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:
Trang 5Mô hình hoạt động Opengl trên windowLậ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
Trang 6 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.
Các hình cơ bản (primitive) và lệnh (command)
Các thao tác cơ bản của OpenGL
Trang 72.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
Trang 8- 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 trongvù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
Trang 93 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)
Trang 10 Các hàm trên điểm ảnh (pixel)
• 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
Trang 12• 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à :
Trang 13Ví 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:
Trang 15 Biến đổi WCS & toạ độ màn hình
Trang 164 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ó đã đượcchuẩ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()
Trang 17 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
Trang 18 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à
4.2 Bên trong GLUT
Trang 19phả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ủacamera(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àykhông biết dịch ra tiếng việt ra sao.Upvector , hãy tưởng tượng bạn
Trang 20đ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 sangtrái
Trang 21 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àmglMatrixMode();
Trang 22- Các hàm vẽ điểm glVertex, glNormal đều không trực tiếp vẽ raWCS 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
- Để 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] );
Trang 23phầ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)
Trang 24 Khuỷ tay có thể chuyển động quanh trục ox từ -1300 → 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úttiế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
n
Trang 25tạ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
Trang 27Tiếp tục vẽ hình hộp bằng cách gọi hàm Box(0.8, 2.0, 0.8, solid) có chiều dài là 1 chiều rộng và chiều cao là 0.4 Sau đó tịnh tiến lùi lại trục oy 1 đoạn
là -0.95 Tiếp tục quay quanh trục ox 1 góc 90 độ Hệ trục toạ độ lúc này
là :
Sau đó vẽ tiếp hình trụ ( gluCylinder(qobj, 0.4, 0.4, 1.5, 16, 10)) có bán kính là 0.4 , độ dài là 1.5
z y
x
Trang 28glRotatef(-90.0,1, 0, 0.0) quay quanh trục ox 1 góc -90 độ quay trở lại hệ trục toạ độ:
dịch chuyển bằng hàm glTranslatef(-0.4, -1.85, 0) sau đó quay quanh trục oy
1 góc 90 độ => ta có hệ trục toạ độ
z x
Trang 29glTranslatef(0.4,0, 0.0) tịnh tiến dọc trục ox 1 đoạn là 0.4
x
Trang 30từ vị trí và vị trí hệ toạ độ trên tịnh tiến dọc trục oz 1 đoạn là 1.3 và vẽ hìnhhộp có các chiều tường ứng với trục ox, oy ,oz là 0.4 , 0.4, 1 ( vì hàm Box()
có : x = width / 2, y = height /2, z = depth / 2)
Hình vẽ khuỷ tay
Trang 31Hệ trục toạ độ như trên
gluCylinder(qobj, 0.5, 0.5, 0.5, 16, 10);
glTranslatef(0.0, 0.0, 0.5);gluDisk(qobj, 0.0, 0.5, 16, 10);
sau đó vẽ hình trụ bán kính 0.5 và dài 0.5 Tịnh tiến dọc theo trục oz 1 đoạn
là 0.5 sau đó vẽ đĩa tròn bán kính ngoài là 0.5
Trang 32gluCylinder(qobj, 0.06, 0.06, 0.8, 16, 10);
glTranslatef(0.0, 0.0, 0.8);
gluDisk(qobj, 0.06, 0.15, 16, 10);
gluSphere(qobj, 0.25, 16, 16);
ý nghĩa của các hàm trên:
vẽ hình trụ bán kính 0.15 và 0.06 có chiều dài là 0.8 Sau đó tịnh tiến dọc theo trục oz 1 đoạn là 0.8 vẽ đĩa tròn bán kính trong là 0.06 và bán kính ngoài là 0.15 Tiếp theo vẽ hình cầu bán kính là 0.25
-b) Vẽ đốt ngón tay 2: Đốt này cách vẽ tương tự đốt 1
3.5) Một số hàm vẽ khác được xây dựng trong chương trình
Void mouse(int button, int state, int x, int y) : hàm này có chức năng
bắt chuột
Void Toggle(void) : chức năng xác định tham số để điền đầy
Void disable(void) : không sử dụng chế độ chiếu sáng, độ sâu v.v.v
Void lighting(void) : thiết lập chế độ chiếu sáng cũng như vị trí của
Trang 33 Void keyboard(unsigned char key, int x, int y): sử dụng những nút ấn trên bàn phím.
Void menu_select(int mode): chọn menu
Void glutMenu(void) : hàm được xây dựng để sử dụng menu
Int main(int argc, char **argv) : hàm chính main hàm này sử dụng vòng lặp vẽ và gọi các hàm để xây dựng chương trình
4) Một số hình vẽ rôbốt:
Dạng line
Trang 34Dạng khối: