Ngôn ngữ lập trình Programming language là dạng ngôn ngữ máy tính sử dụng để phát triển các chương trình phần mềm, tập lệnh hoặc các chuẩn hóa theo một hệ thống các quy tắcriêng để máy t
Trang 1KHOA ĐIỆN – ĐIỆN TỬ
BỘ MÔN ĐIỆN TỬ
-o0o -BÁO CÁO THỰC TẬP TỐT NGHIỆP
Đề Tài: Tìm Hiểu Lập Trình Python Và PyOpenGl
GVHD: Th.S Hồ Trung Mỹ Thành viên nhóm 12:
Lê Nguyễn Minh Long – 1712012
Lê Long Hồ – 1711447
TP HỒ CHÍ MINH, THÁNG 09 NĂM 2020
Trang 2LỜI CẢM ƠN
Chúng em xin cảm ơn chân thành tới các thầy cô Khoa Điện- Điện Tử Trường ĐH Bách Khoa- Đại Học Quốc Gia TP.HCM, đặc biệt là thầy Hồ Trung Mỹ đã tận tình hướng dẫn, hỗ trợ chúng em trong suốt thời gian thực tập và trong quá trình làm báo cáo thực tập tốt nghiệp Trong thời gian thực tập chúng em đã được truyền đạt những kinh nghiệm quý báu để giúp chúng em trong công việc sau này, chúng em cũng được học thêm những kiến thức cũng như kinh nghiệm thực tế và có điều kiện phát huy những kiến thức chuyên môn đã được học trong trường do các thầy cô tận tình giảng dạy Với kiến thức còn hạn chế nên bản báo cáo TTTN không thể tránh khỏi những thiếu xót rất mong được sự thông cảm của quý thầy cô
Chúng em xin chân thành cảm ơn!
Tp Hồ Chí Minh, ngày 08 tháng 09 năm 2020.
Sinh viên
i
Trang 3MỤC LỤC
LỜI MỞ ĐẦU 3
1 TỔNG QUAN VỀ NGÔN NGỮ PYTHON 4
1.1 Giới thiệu Python 4
1.1.1 Đặc điểm 4
1.1.2 Ưu điểm 4
1.1.3 Nhược điểm 5
1.2 Cú pháp ngôn ngữ 5
1.2.1 Biến số và toán tử 5
1.2.2 Kiểu dữ liệu 6
1.2.3 Cấu trúc lặp và rẽ nhánh 7
1.2.4 Hàm và Class 7
1.3 Phân chia module 9
1.3.1 Các loại module 9
1.3.2 Cách sử dụng module 9
1.4 Xử lý tập tin 10
1.4.1 Mở file 10
1.4.2 Đọc file 11
1.4.3 Ghi vào file 11
1.4.4 Đóng file 11
1.4.5 Đổi tên/ xóa file 11
2 GIỚI THIỆU VỀ PYOPENGL 12
2.1 Tìm hiểu về OpenGl 12
2.2 Cấu trúc tập lệnh 13
2.3 Ứng dụng của OpenGL 14
2.3.1 Vẽ các đối tượng hình học 14
ii
Trang 42.3.2 Thao tác trên ModelView 16
2.3.3 Thao tác trên Projection 17
2.3.4 Thao tác trên Viewport 18
2.3.5 Thiết lập mô hình shading 19
2.3.6 Tương tác với người dùng 20
3 MỘT SỐ DEMO CƠ BẢN 23
3.1 Vẽ khối lập phương xoay 23
3.2 Tương tác với chuột và bàn phím 24
3.3 Thao tác với Model View và thư viện Random 25
3.4 Tạo một khối cầu mặt lưới từ hai mặt phẳng cắt 26
3.5 Xây dựng mô hình Trái Đất quay xung quanh Mặt Trời 26
3.6 Thiết lập mô hình Smooth-Shading cho một tam giác 26
4 ĐỀ XUẤT CÁC ĐỀ TÀI LIÊN QUAN 26
5 TÀI LIỆU THAM KHẢO 26
6 PHỤ LỤC 26
iii
Trang 5LỜI MỞ ĐẦU
Thật rõ ràng để nhận thấy rằng nếu chỉ hiển thị thông tin chỉ với các ký hiệu, chữ cái, chữ
số thì sẽ không thể hấp dẫn và dễ hiểu như khi có thêm biểu diễn bằng Kỹ thuật đồ hoạ Đâycũng là công cụ không thể thiếu trong các ngành khoa học kỹ thuật, giáo dục, nghệ thuật, giảitrí, quảng cáo…(để diễn đạt máy móc thiết bị, kiến trúc, cấu trúc cơ thể, thông tin thiên vănđịa lý, hình ảnh minh hoạ ) Cùng với sự phát triển của tin học, kỹ thuật đồ họa trên máy vitính, ngày càng trở nên tinh xảo Giao diện các phần mềm ngày nay trở nên thân thiện, đẹpmắt nhờ các thể hiện đồ họa Sự hỗ trợ của tin học cho các ngành khác trở nên đắc lực hơnnhờ khả năng đồ họa vi tính
Ngôn ngữ lập trình (Programming language) là dạng ngôn ngữ máy tính sử dụng để phát
triển các chương trình phần mềm, tập lệnh hoặc các chuẩn hóa theo một hệ thống các quy tắcriêng để máy tính thực thi Hiện nay có rất nhiều ngôn ngữ lập trình đang được sử dụng nhưJavaScript, Java, C/C++,Python,…Python có cú pháp khá đơn giản, tốc độ xử lý nhanh, mượt,không quá kén người sử dụng, nhất là phù hợp với những người học lập trình game và ứngdụng Một điều đáng kinh ngạc đối với Python là tốc độ phát triển nhanh nhất hiện nay.Trong thành công của kỹ thuật đồ họa ngày nay không thể không nói đến sự phát triểnvượt bậc của tốc độ phần cứng lẫn hệ điều hành Nhưng bản thân kỹ thuật đồ họa thì có bướctiến nhảy vọt từ những phép tính toán học phức tạp đến những thư viện đồ họa được tạo sẳn.Các thư viện này cho phép giảm nhẹ thời gian và công sức của người lập trình; Bởi với chúng,
để có được một “tác phẩm”đồ họa không đòi hỏi phải có một kiến thức hùng hậu về đườngcong Bezier, B-spline, về hình học, tạo bóng…, mà chỉ ứng dụng các hàm tạo sẵn
Một trong những thư viện đó là OpenGL, được xem là tiêu chuẩn thiết kế công nghiệp cho
đồ họa ba chiều Mục tiêu của bài tiểu luận này làtìm hiểu thư viện đồ họa của OpenGL trong
đồ họa ba chiều, đồng thời cũng cố gắng đưa ra một ứng dụng của OpenGL trong việc minhhọa các giải thuật đồ họa ba chiều một cách đơn giản và dễ tiếp cận
iv
Trang 61 TỔNG QUAN VỀ NGÔN NGỮ PYTHON
1.1 Giới thiệu Python
1.1.1 Đặc điểm
Python là một ngôn ngữ lập trình bậc cao cho các mục đích lập trình đa năng, do Guido
van Rossum tạo ra và lần đầu ra mắt vào năm 1991 tại Viện toán-tin ở Hà Lan Python kếthừa từ nhiều ngôn ngữ như ABC, Module-3, C, C++, Unix Shell,… Đến nay thì cộng đồngngười sử dụng ngôn ngữ này rất đông, nếu so sánh từ bảng xếp hạng các ngôn ngữ năm 2016thì Python đứng thứ 3 trong top 10 ngôn ngữ lập trình phổ biến nhất
Có thể thấy rất nhiều ví dụ từ những trò chơi điện tử đơn giản, cho đến những thuật toántìm kiếm phức tạp, Python đã trở thành sự lựa chọn hoàn hảo cho mọi lập trình viên Đặc biệt
là với sự bùng nổ về công nghệ AI – trí tuệ nhân tạo trong những năm gần đây, cái tên Pythonliên tục được nhắc đến như là một công cụ hữu ích trong lĩnh vực công nghệ thông tin
1.1.2 Ưu điểm
- Python là một ngôn ngữ bậc cao rất dễ dàng sử dụng Python có một số lượng từ khóa íthơn, cấu trúc của Python đơn giản hơn và cú pháp của Python được định nghĩa khá rõ ràng.Tất cả các điều này là Python thực sự trở thành một ngôn ngữ thân thiện với lập trình viên
- Phần code của Python được định nghĩa khá rõ ràng và rành mạch
- Python có một thư viện chuẩn khá rộng lớn Thư viện này dễ dàng tương thích và tíchhợp với UNIX, Windows, và Macintosh
- Python là một ngôn ngữ thông dịch Trình thông dịch thực thi code theo từng dòng, điềunày giúp cho quá trình debug trở nên dễ dàng hơn và đây cũng là yếu tố khá quan trọng giúpPython thu hút được nhiều người học và trở nên khá phổ biến
- Python cũng là một ngôn ngữ lập trình hướng đối tượng Ngoài ra, Python còn hỗ trợ cácphương thức lập trình theo hàm và theo cấu trúc
v
Trang 7- Ngoài các đặc điểm trên, Python còn khá nhiều đặc điểm khác như hỗ trợ lập trình GUI,
mã nguồn mở, có thể tích hợp với các ngôn ngữ lập trình khác, …
1.1.3 Nhược điểm
- Tốc độ chậm hơn so với các ngôn ngữ C/C++ hay Java
- Không phải là ngôn ngữ tốt dành cho nền tảng mobile
- Python không phải lựa chọn tốt cho các bài toán cần tối ưu bộ nhớ
- Python có nhiều giới hạn khi làm việc với cơ sở dữ liệu phức tạp
1.2 Cú pháp ngôn ngữ
1.2.1 Biến số và toán tử
Ta khai báo một biến bằng cách gán giá trị cụ thể cho nó Biến sẽ tự động được giải phóngkhi ra khỏi phạm vi của chương trình sử dụng nó Một biến có thể được gán nhiều loại giá trịnhư số, chuỗi, ký tự
Trang 8>>> b
45
1.2.2 Kiểu dữ liệu
Kiểu số
1234585396326 (số nguyên dài vô hạn) -86.12 7.84E-04 3+ 8j (số phức)
Kiểu chuỗi (string): Đặt trong cặp dấu ‘ hoặc “
"Hello" "It's me" '"OK"-he replied'
Kiểu bộ (tuple): là cấu trúc mảng và một tuple đã được khai báo rồi thì không thay đổi được
giá trị (immutable)
mytuple = ('x' , 'y' , 'z') (1, 2.0, 3) (1,) ("Hello",1,())
Kiểu danh sách (list): là cấu trúc mảng và các phần tử có index có thứ tự
numbers = [1, 2, 3, 4, 5] names = ['Marry' , 'Peter']
Kiểu từ điển (dictionary):là một cấu trúc mảng, nhưng các phần tử bao gồm key và value
{"Vietnam":"Hanoi", "Netherlands":"Amsterdam","France":"Paris"}
vii
Trang 9Chú thích: giúp cho lập trình viên dễ dàng cải tiến mã nguồn, ghi chú các chức năng của
đoạn code thực hiện
Trang 101.2.4 Hàm và Class
Trong lập trình chúng ta sẽ có lúc sử dụng một đoạn code lặp đi lặp lại nhiều lần trongchương trình Hàm sẽ giúp chúng ta thực hiện điều này Chúng ta có thể viết tất cả những gìchúng ta muốn thực hiện trong hàm sau đó chỉ cần gọi khi sử dụng
Khai báo hàm theo cú pháp sau:
def <functionname> (<param1>, <param2>, ):
<statements(s)>
Hàm nếu không trả dữ liệu thì mặc định sẽ trả về giá trị <None>
Một ví dụ về khai báo và gọi hàm tìm phần tử lớn nhất trong mảng:
print “Data:”, data
print “Maximum:”, max(data)
Kết quả:
Data: [1, 5, 1, 12,3, 4, 6]
Maximum: 12
Khai báo một Class theo cú pháp sau:
class <myclass> ([parentclass]):
<assignments>
def init (self):
<statements>
ix
Trang 11Có 3 loại module thường thấy là:
1 Viết bằng Python: có phần mở rộng là py
2 Các thư viện liên kết động: có phần mở rộng là dll , pyd , so , sl ,…
3 C-Module liên kết với trình phiên dịch
1.3.2 Cách sử dụng module
Modules trong Python là các tập tin chưa các hàm được định nghĩa sẵn, biến cái mà chúng
ta có thể sử dụng lại, nó cũng có đuôi mở rộng là py Python đã cung cấp sẵn một số modulemặc định Chúng ta có thể sử dụng chúng Để sử dụng chúng ta cần dùng lệnh import
import <modulename>
Khi gặp câu lệnh trên thì trình biên dịch sẽ tiến hành tìmkiếm file module tương ứng theo thứ tự thư mục sau:
1 Thư mục hiện hành mà script đang gọi
2 Các thư mục trong PYTHONPATH (nếu có set)
3 Các thư mục cài đặt chuẩn trên Linux/Unix
Giả sử ta tạo một file python mymath.py có nội dung như sau:
x
Trang 12print 'Tong hai so la: ', mymath.cong(num1, num2)
Sau khi thực hiện sẽ hiển thị lên màn hình là:
Tong hai so la: 3
1.4 Xử lý tập tin
Một tập tin chứa thông tin hoặc dữ liệu được lưu trữ trên thiết bị lưu trữ của máy tính.Python sẽ cung cấp cách để điều khiển các tập tin như âm nhạc, video, và tập tin văn bản.Chúng ta sẽ tập trung vào hai loại: tập tin văn bản và binary
w : mở để ghi nội dung
a : mở để ghi thêm nội dung vào cuối file
xi
Trang 13 r+ : mở để đọc và ghi Con trỏ nằm ở đầu file.
w+ : mở để đọc và ghi Ghi đè nếu file đã tồn tại, nếu chưa tồn tại thì tạo file mới để ghi
a+ : mở để đọc và thêm vào cuối file Con trỏ nằm ởcuối file Nếu file chưa tồn tại thì tạofile mới để ghi
Mặc định là mở file text, nếu muốn mở file nhị phân(binary) thì thêm b , ví dụ: rb , wb ,
1.4.3 Ghi vào file
Nếu file được mở ở chế độ có thể ghi thì có thể dùng phương thức write() để ghi một nộidung vào file Ví dụ:
Trang 141.4.5 Đổi tên/ xóa file
Sử dụng phương thức os.rename(old, new) để đổi tênmột file Ví dụ:
OpenGL (Open Graphics Library) là một tiêu chuẩn kỹ thuật đồ họa có mục đích định ra
một giao diện lập trình ứng dụng (API) đồ họa 3 chiều OpenGL cũng có thể được dùng trongcác ứng dụng đồ họa 2 chiều Giao diện lập trình này chứa khoảng 150 hàm để vẽ các cảnhphức tạp từ những hàm đơn giản
Silicon Graphics, nhà sản xuất máy trạm đồ họa tiên tiến thế giới, là đơn vị đi tiên phongtrong việc phát triển OpenGL Nó được dùng rộng rãi trong các trò chơi điện tử Ngoài raOpenGL còn dùng trong các ứng dụng CAD, thực tế ảo, mô phỏng khoa học, mô phỏng thôngtin, phát triển trò chơi…
OpenGL hỗ trợ các hàm đồ họa làm các việc như sau:
Xây dựng các đối tượng phức tạp từ các thành phần hình học cơ bản (điểm, đoạn, đagiác, ảnh, bitmap)
Sắp xếp đối tượng trong đồ họa 3D và chọn điểm thuận lợi để quan sát
xiii
Trang 15 Tính toán màu sắc của các đối tượng (màu sắc của đối tượng được quy định bởi điềukiện chiếu sáng, texture của đối tượng, mô hình được xây dựng hoặc là kết hợp của cả
3 yếu tố đó)
Biến đổi những mô tả toán học của đối tượng và thông tin màu sắc thành các pixeltrên màn hình (quá trình này được gọi là resterization)
2.2 Cấu trúc tập lệnh
OpenGL sử dụng tiền tố gl và tiếp theo đó là những từ được viết hoa ở chữ cái đầu để tạo
nên tên của một lệnh theo hình thức gl{tên hàm}[{số tham số}{loại tham số}]
Trang 16Ví dụ: glVertex2i(1,3) tương ứng với xác định một điểm (x,y) với x, y nguyên (integer)Tuy nhiên có những thứ mà OpenGL không hỗ trợ sẵn như
Bản thân OpenGL không có sẵn các hàm nhập xuất hay thao tác trên window
OpenGL không có sẵn các hàm cấp cao để xây dựng các mô hình đối tượng, thay vàođó,người dùng phải tự xây dựng từ các thành phần hình học cơ bản
Để khắc phục nhược điểm của OpenGL, GLUT được tạo ra với với nhiều hàm hỗ trợ
Quản lý window
Display callback
Nhập xuất (bàn phím, chuột, )
Vẽ một số đối tượng 3D phức tạp (mặt cầu, khối hộp, )
Tên các hàm của GLUT đều có tiền tố là glut
2.3 Ứng dụng của OpenGL
2.3.1 Vẽ các đối tượng hình học
Trong OpenGL có 2 loại buffer phổ biến nhất, mỗi lần vẽ, chúng ta nên xóa buffer
glClearColor(0.0, 0.0, 0.0, 0.0); /* xác định màu để xóa color buffer (màu đen) */
glClearDepth(1.0); /* xác định giá trị để xóa depth buffer */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* xóa color buffer
và depth buffer */
Color buffer: buffer chứa màu của các pixel cần được thể hiện
Depth buffer (hay còn gọi là z-buffer): buffer chứa chiều sâu của pixel, được đo bằngkhoảng cách đến mắt Mục đích chính của buffer này là loại bỏ phần đối tượng nằm sau đốitượng khác
Khi vẽ một đối tượng, OpenGL sẽ tự động sử dụng màu đã được xác định trước đó Do
đó, để vẽ đối tượng với màu sắc theo ý mình, cần phải thiết lập lại màu vẽ như sau:
glColor3f(0.0, 0.0, 0.0); // black
xv
Trang 17Khi khai báo một điểm ta dùng hàm glVertexXY với X là số chiều (2, 3, hoặc 4), Y làkiểu dữ liệu.
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
Trang 18Một số tính chất của điểm và đoạn cần quan tâm có thể được thiết lập qua các hàm:
Kích thước của một điểm: void glPointSize(GLfloat size)
Độ rộng của đoạn thẳng: void glLineWidth(GLfloat width)
Kiểu vẽ
2.3.2 Thao tác trên ModelView
Trước khi thực hiện các thao tác trên ModelView, chúng ta cần gọi hàm
glMatrixMode(GL_MODELVIEW);
OpenGL hỗ trợ sẵn các hàm biến đổi affine cơ bản như sau
Tịnh tiến:
void glTranslate{fd}(TYPEx, TYPE y, TYPEz);
Quay quanh trục nối gốc tọa độ với điểm (x,y,z)
void glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z);
Tỉ lệ (tâm tỉ lệ tại gốc tọa độ)
xvii
Trang 19void glScale{fd}(TYPEx, TYPE y, TYPEz);
Ví dụ: chúng ta thực hiện phép quay quanh trục z một góc α và tịnh tiến đi một đoạn theovector(trx, try, trz), các bước thực hiện sẽ là:
Giống như chụp hình, thiết lập view là thiết lập vị trí cũng như góc, hướng của camera.GLUT cómột hàm giúp thiết lập view một cách nhanh chóng
void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, Gldoublecenterx,
GLdouble centery, GLdouble centerz, GLdouble upx, GLdoubleupy, GLdouble upz)
trong đó
(eyex, eyey, eyez) là vị trí đặt của view,
(centerx, centery, centerz) là điểm nằm trên đường thẳng xuất phát từ tâm view hướng rangoài,
(upx, upy, upz) là vector chỉ hướng lên trên của view
2.3.3 Thao tác trên Projection
Trước khi thực hiện các thao tác chiếu, chúng ta gọi 2 hàm
xviii
Trang 20glLoadIdentity();
Chiếu phối cảnh (Perspective Projection)
Đặc điểm của phép chiếu này là đối tượng càng lùi ra xa thì trông càng nhỏ
Để thiết lập phép chiếu này, OpenGL có hàm
void glFrustum(GLdouble left, GLdouble right, GLdouble bottom,GLdoubletop, GLdouble near, GLdouble far);
Chiếu trực giao (Orthogonal Projection)
Trong phép chiếu này, khoảng cách của vật tới camera không ảnh hưởng tới độ lớn của vật đó khi hiển thị
Để thiết lập phép chiếu này, OpenGL có hàm
void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdoubletop, GLdouble near, GLdouble far);
xix
Trang 212.3.4 Thao tác trên Viewport
OpenGL có hàm để thiết lập viewport
void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
trong đó (x,y) là vị trí điểm trái-trên trong cửa sổ vẽ, width, height là chiều rộng và caocủaviewport Mặc định (x,y,width,height) = (0,0,winWidth, winHeight) (chiếm toàn bộ cửasổ)
2.3.5 Thiết lập mô hình shading
OpenGL hỗ trợ 2 chế độ màu: RGBA và Color-Index Trong chế độ màu RGBA, RGB lầnlượt thể hiện màu Red, Green, Blue Còn thành phần A (tứcalpha) không thực sự ảnh hưởngtrực tiếp lên màu pixel, người ta có thể dùng thành phần A đểxác định độ trong suốt hay thông
số nào đó cần quan tâm
xx