You are on page 1of 62

3/20/2015

Trường Đại học Bách Khoa Hà Nội

Bài giảng
Kỹ thuật lập trình mô phỏng Rô bốt
và các hệ cơ điện tử

Giảng viên: TS. Vũ Lê Huy

Đơn vị công tác: Bộ môn cơ sở thiết kế máy và Rôbốt, Viện Cơ khí

Hà Nội, 1/2015 1

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

1. Các phép biến hình 2

 1.1. Phép tịnh tiến


P’(x’,y’)

 P’ = m.P

trz
P’

P
try

trx y
x

1
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

1. Các phép biến hình 3

 1.2. Phép tỉ lệ y
Q’

Q P’
P
 P’Q’ = m.PQ x

z
P’

P
Q’
Q
y
x

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

1. Các phép biến hình 4

 1.3. Phép quay y


P’

 P

 P’ = m.P O x

z
P’z
P
 Quanh trục Z 

y
x

2
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

1. Các phép biến hình cơ bản 5

 1.4. Phép quay z


P’x 
 Quanh trục X P

y
x

z
 Quanh trục Y
P

 P’y

y
x

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

1. Các phép biến hình cơ bản 6

 1.5. Kết hợp các phép biến hình y


P’’
 Quay P quanh 0  P’ try P’

 P’ = mR.P
P

 Tịnh tiến P’  P’’ 

 P’’ = mT.P’ = mR.mT.P = m.P O trx x

3
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

1. Các phép biến hình cơ bản 7

 1.5. Kết hợp các phép biến hình

STL
y
x

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

1. Các phép biến hình cơ bản 8

 1.5. Kết hợp các phép biến hình z


z 1 , z2 z4
y1
 Tịnh tiến Oxyz  Ox1y1z1 x2 z3
y2
2 x1 y4
try3
x3 y3 4
trz1 x4

 Quay Ox1y1z1  Ox2y2z2 O y


x

 Tịnh tiến Ox2y2z2  Ox3y3z3

 Quay Ox3y3z3  Ox4y4z4

4
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

1. Các phép biến hình cơ bản 9

 1.5. Kết hợp các phép biến hình z


z 1 , z2 z4
y1
 Ma trận chuyển Oxyz  Ox4y4z4 x2 z3
y2
2 x1 y4
try3
x3 y3 4
trz1 x4

O y
x

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

2. Bài toán Động học 10

 2.1. Động học Cơ cấu 4 khâu


 Bài toán vị trí: Tìm các giá trị góc của các khâu 2 và 3 tùy
theo vị trí của khâu 1 với giá trị 1  giải hệ phương trình phi
tuyến :
l1. cos(1 )  l2 . cos( 2 )  l3 . cos(3 )  d1  0

 l1. sin(1 )  l2 . sin( 2 )  l3 . sin(3 )  d 2  0
 Phương pháp NewtonRaphson: Giải gần đúng hệ phương trình
phi tuyến n ẩn số f(x) = 0

l2
Đây là phương pháp lặp với biểu thức 2
l3
hồi quy dạng :
3
x(k+1) = x(k) – Fx-1(x(k)).f(x(k)) l1
1
k : bước lặp thứ k
d2

Fx : ma trận Jacobi
d1

5
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

2. Bài toán Động học 11

 2.1. Động học Cơ cấu 4 khâu


 Phương pháp NewtonRaphson:
x(k+1) = x(k) – Fx-1(x(k)).f(x(k))
 f1 f1 f1 
 x 
x2 xn 
 1 
 f 2 f 2

f 2 
Fx : ma trận Jacobi, Fx   x1 x2 xn 
     
 f f n f n 
 n  
 x1 x2 xn 

Đặt : x(k) = – Fx-1(x(k)).f(x(k))


 Fx(x(k)).x(k) = –f(x(k))

Giải hệ tìm x(k), sẽ thu được giá trị của ẩn sau bước lặp thứ k :
x(k+1) = x(k) + x(k)

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

2. Bài toán Động học 12

 2.1. Động học Cơ cấu 4 khâu


 Bài toán vận tốc: lấy đạo hàm theo thời gian đối với phương trình
vị trí
  l2 . sin( 2 ).2  l3 . sin(3 ).3  l1.1. sin(1 )

l2 . cos( 2 ).2  l3 . cos(3 ).3  l1.1. cos(1 )

 Bài toán gia tốc: lấy đạo hàm theo thời gian đối với phương trình
vận tốc

 l2.sin ( 2 ) l3.sin (3 )  a2 


 l .cos ( )  l .cos ( )  a  
 2 2 3 3 
  3 
l .a .sin ( )  l .w .w .cos (1 )  l .w .w .cos ( )-l .w .w .cos ( )
1 1 1 1 1 1 2 2 2 2 3 3 3 3 
-l1.a1.cos (1 )  l1.w1.w1.sin (1 )  l2.w2.w2.sin ( 2 )-l3.w3.w3.sin (3 )

 Thực hiện giải hệ phương trình đại số tuyến tính bằng phương
pháp GaussJordan, ……

6
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

2. Bài toán Động học 13

 2.2. Động học Rô bốt

Dao phay

 Thiết lập bộ thông số Denavit-Hartenbeg :


• Trục zn được liên kết với trục của khớp
thứ n+1. Chiều của zn được chọn tuỳ ý.
•Trục xn được xác định là đường vuông
góc chung giữa trục khớp n và khớp
n+1, hướng từ điểm trục của khớp tới
khớp n+1.
•Trục yn được xác định theo xn và zn
theo quy tắc bàn tay phải.

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

2. Bài toán Động học 14

 2.2. Động học Rô bốt

Dao phay

 Thiết lập bộ thông số Denavit-Hartenbeg :

7
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

2. Bài toán Động học 15

 2.2. Động học Rô bốt

Dao phay

 Thiết lập bộ thông số Denavit-Hartenbeg :


n 1
An 
cos  n  cos  n sin  n sin  n sin  n an cos  n 
 sin  cos  n cos  i sin  n cos  n an sin  n 
 n

 0 sin  n cos  n dn 
 
 0 0 0 1 

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

2. Bài toán Động học 16

 2.2. Động học Rôz bốt z2 y2


z3 y3
1
3 a3
2
x2
x1 y1 x3
a2
d1 Dao phay
z

x y

 Thiết lập bộ thông số Denavit-Hartenbeg :

Khâu θi αi ai di

1 0 0 0 d1

2 θ2 0 a2 0

3 θ3 0 a3 0

8
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

2. Bài toán Động học 17

 2.2. Động học Rôz bốt z2 y2


z3 y3
1
3 a3
2
x2
x1 y1 x3
a2
d1 Dao phay
z

x y

1 0 0 0 cos  2  sin  2 0 a2 
0  sin  0 0 
1 0 0  cos  2
0
A1  
1
A2   2

0 0 1 d1   0 0 0 0
   
0 0 0 1  0 0 0 1

cos  3  sin  3 0 a3 
 sin  cos  3 0 0 
2
A3   3

 0 0 0 0
 
 0 0 0 1

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

2. Bài toán Động học 18

 2.2. Động học Rôz bốt z2 y2


z3 y3
1
3 a3
2
x2
x1 y1 x3
a2
d1 Dao phay E(xE,yE,zE)
z
=0A4 . E4(x4,y4,z4)
x y

0
A4  2A1.1A2 .2 A3
cos( 2   3 )  sin( 2   3 ) 0 a2 cos  2  a3 cos( 2   3 )
 sin(   ) cos(   ) 0 a2 sin  2  a3 cos( 2   3 ) 
0
A4   2 3 2 3

 0 0 0 d1 
 
 0 0 0 1 
 Phương trình điểm tác động cuối: E(xE,yE,zE) = 0A4 . E4(x4,y4,z4)
 Giải hệ phương trình phi tuyến  Thu được các biến khớp
 Giải bài toán vận tốc, gia tốc, …

9
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

2. Bài toán Động học 19

 2.3. Bài tập 1: lập ma trận chuyển cho các mô hình


Đầu dao khắc

Dao phay

Bàn gá phôi

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 20

 3.1. Khái niệm


 Nguyên lý cơ bản của lập trình Window là cơ sở xử lý thông điệp.

Một chương trình Window có 2 thành phần chính :


+ Khởi động chương trình : hàm WinMain() thực hiện mọi khởi tạo và thiết
lập các cửa sổ giao diện.
+ Xử lý thông điệp : hàm WinProc() được Window gọi tới để xử lý toàn bộ
các thông điệp đang xếp hàng trong hàng đợi của hệ thống được gửi đến chương
trình => thực hiện vòng lặp xử lý các thông điệp (đây là một vòng lặp rất lớn).

10
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 21

 3.1. Khái niệm


 Nguyên lý cơ bản của lập trình Window là cơ sở xử lý thông điệp.

Tuy nhiên để lập chương trình bằng các hàm API là vô cùng phức tạp và rất khó
quản lý.
 MFC = Microsoft Foundation Class (lớp nền tảng của Microsoft) : là tập hợp
các lớp định nghĩa sẵn, đóng gói các hàm API của Window theo một hệ thống.

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 22

 3.2. Tạo đề án MFC trên Visual Studio


 Chọn menu "File\New ..."
 Trên hộp thoại "New" chọn trang "Project" như hình sau :

11
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 23

 3.2. Tạo đề án MFC trên Visual Studio


 Bước 1 :
 Single Document (SDI : Single Document Interface): cho phép tạo ứng
dụng đơn tài liệu, tại mỗi thời điểm chương trình chỉ có thể mở một tài liệu.
 Multi Documents (MDI : Multi Documents Interface): cho phép tạo ứng
dụng đa tài liệu, tại mỗi thời điểm chương trình có thể mở đồng thời nhiều tài liệu, mỗi
tài liệu được quản lý bởi một cửa sổ riêng nằm gọn trong cửa sổ chính của chương trình.
 Dialog Based: tạo ứng dụng là một hộp thoại. Đây là loại ứng dụng đơn giản nhất.

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 24

 3.2. Tạo đề án MFC trên Visual Studio


a/ Tạo đề án giao diện của chương trình kiểu Dialog Based
 Bước 2

 Bước 3

12
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 25

 3.2. Tạo đề án MFC trên Visual Studio


a/ Tạo đề án giao diện của chương trình kiểu Dialog Based
 Bước 4

 Bước 5: soạn thảo mã nguồn cho chương trình

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 26

 3.2. Tạo đề án MFC trên Visual Studio


b/ Tạo đề án giao diện của chương trình kiểu Single Document
và Multi Document
 Bước 2

 Bước 3

13
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 27

 3.2. Tạo đề án MFC trên Visual Studio


b/ Tạo đề án giao diện của chương trình kiểu Single Document
và Multi Document
 Bước 4
  Advanced…

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 28

 3.2. Tạo đề án MFC trên Visual Studio


b/ Tạo đề án giao diện của chương trình kiểu Single Document
và Multi Document
 Bước 5

 Bước 6

14
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 29

 3.2. Tạo đề án MFC trên Visual Studio


b/ Tạo đề án giao diện của chương trình kiểu Single Document
và Multi Document
Danh sách các lớp sẽ được tạo ra:
 CxxxView được kế thừa từ lớp quan sát, có thể là CView (mặc định), CEditView,
CFormView, .... đảm nhận công việc thể hiện tài liệu trong chương trình. Được đặt
trong file “xxxView.h" và "xxxView.cpp".

 CxxxApp được kế thừa từ lớp CWndApp, đảm nhận công việc khởi tạo và quản lý
ứng dụng. Được đặt trong file "xxx.h" và "xxx.cpp".

 CMainFrame được kế thừa từ lớp CFrameWnd nếu chương trình dạng Single
Document, còn nếu là Multi Document thì kế thừa từ lớp CMDIFrameWnd, là lớp quản
lý cửa sổ chính của chương trình. Được đặt trong file "MainFrm.h" và "MainFrm.cpp".

 CxxxDoc được kế thừa từ lớp CDocument, quản lý tài liệu của chương trình. Được
đặt trong file "xxxDoc.h" và "xxxDoc.cpp".

 Nếu chương trình là dạng MultiDocument thì sẽ có thêm lớp CChildFrame kế


thừa từ lớp CMDIChildWnd, là lớp quản lý cửa sổ con ứng với mỗi tài liệu đang có.
Được đặt trong file "ChildFrm.h" và "ChildFrm.cpp".

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 30

 3.3. Làm việc với Menu, ToolBar, Status


a/ Sửa đổi Menu và ToolBar có sẵn
 Mặc định ban đầu của MFC sẽ tạo ra cho bạn một menu và một thanh công cụ với ID
là IDR_MAINFRAME, đây sẽ là menu và thanh công cụ mặc định của chương trình và
gắn với cửa sổ ứng dụng chính và được khởi tạo bởi CMainFrame. Menu và thanh công
cụ này mới chỉ có một số chức năng cơ bản có ở đa số các ứng dụng.

 Để bổ xung thêm chức năng mới của menu và thanh công cụ trên bạn nên dùng trình
soạn thảo Resource của Microsoft Visual Studio.
 Để tạo công việc xử lý sự kiện bạn cần tạo ra một hàm xử lý sự kiện và tạo ra ánh xạ
thông điệp để quy chiếu sự kiện tới hàm đó, công việc này có thể được thực hiện
nhanh chóng nhờ ClassWizard hoặc có thể kích chuột phải lên tên lớp (ở vùng
WorkSpace) rồi chọn "Add Windows Message Handler …"

15
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 31

 3.3. Làm việc với Menu, ToolBar


a/ Sửa đổi Menu và ToolBar có sẵn
 Trong file tiêu đề (.h) được bổ xung thêm dòng khai báo hàm thành
viên có dạng :
 afx_msg ReVal memberFxn(ListParam);
 ReVal là giá trị trả về của hàm
 ListParam là danh sách tham số, afx_msg chỉ rằng hàm này là một hàm xử lý
thông điệp.
 Trong file nguồn (.cpp) :
 Bổ xung thêm ánh xạ thông điệp vào giữa khu vực :
 BEGIN_MESSAGE_MAP()
 ……
 ……
 END_MESSAGE_MAP()
 Bổ xung triển khai của hàm thành viên đã được thêm khai báo trong
file tiêu đề (thường được đặt vào cuối cùng của file cpp).

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 32

 3.3. Làm việc với Menu, ToolBar


b/ Thêm ToolBar mới
 Khai báo một thanh công cụ mới :
 CToolBar m_wndToolBar;
 Trong hàm :
 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
Thêm các dòng lệnh sau để khởi tạo và gán biến trên với một thanh
công cụ đã tạo trong tài nguyên thông qua ID của nó:
 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |
WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS |
CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
 !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
 {
 TRACE0("Failed to create toolbar\n");
 return -1; // fail to create
 }
 ID của thanh công cụ là IDR_MAINFRAME, có thể thay ID khác.

16
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 33

 3.4. Vẽ trên Windows


 Để thực hiện công việc vẽ bạn cần có biến quản lý công việc vẽ
thuộc kiểu CDC hoặc CPaintDC, CClientDC, ... (đều kế thừa từ CDC),
lớp này cần được nhận được con trỏ của lớp điều khiển sẽ được vẽ
lên đó.

 CDC : Class of Device-Context, lớp ngữ cảnh thiết bị, để vẽ tất cả các
thứ đều thông qua các hàm thành viên của lớp này. CDC cung cấp
các chức năng thao tác ngữ cảnh thiết bị, làm việc với các công cụ
vẽ, lựa chọn các đối tượng giao diện thiết bị đồ hoạ (GDI : Graphics
Device Interface), làm việc với mầu và bảng mầu.

 Vẽ trong cửa sổ của chương trình Dialog thông qua hàm OnPaint(),
còn với khung View thì thông qua hàm OnDraw(CDC *pDC).

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 34

 3.4. Vẽ trên Windows


 Một số hàm vẽ của CDC :
 ArcTo LineTo Polygon TextOut

 Ellipse MoveTo Rectangle DrawText

 FillRect Pie RoundRect ….

 FloodFill PolyBezier SetTextColor

 CPen quản lý các nét vẽ với kiểu đường, độ rộng và mầu vẽ.

 CBrush quản lý vùng tô với kiểu tô, mầu tô.

 CFont quản lý kiểu chữ.

 Để chọn một kiểu bút và chổi tô mới cho CDC sử dụng hàm :
 CDC::SelectObject

17
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 35

 3.4. Vẽ trên Windows


 Nếu sử dụng các đối tượng bút, chổi tô và font chữ được định nghĩa
sẵn trong Window:

virtual CGdiObject* SelectStockObject(int nIndex);


với nIndex là một trong những giá trị:

BLACK_BRUSH DKGRAY_BRUSH GRAY_BRUSH

HOLLOW_BRUSH LTGRAY_BRUSH NULL_BRUSH

WHITE_BRUSH BLACK_PEN NULL_PEN

WHITE_PEN DEVICE_DEFAULT_FONT SYSTEM_FONT

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 36

 3.4. Vẽ trên Windows

void CDlgTest::OnPaint()
{
CRect clientRect;
GetClientRect(clientRect);

CPaintDC dc(this);
clientRect.InflateRect(-5,-5,-5,-5);
dc.Rectangle(clientRect);
dc.DrawText("Draw Text : My HelloWorld program.",-1, clientRect,
DT_SINGLELINE|DT_CENTER|DT_VCENTER);
dc.MoveTo(5,5);
dc.LineTo(100,100);
}

18
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 37

 3.4. Vẽ trên Windows


 a/ Bút vẽ :
 Cách đơn giản nhất để tạo bút là sử dụng đối tượng CPen và truyền cho
chúng các tham số định nghĩa bút :
 CPen pen(PS_SOLID,1,RGB(255,0,0));
 Phương pháp thứ hai là xây dựng đối tượng bút chưa truyền tham số rồi
gọi hàm thành phần CreatePen để khởi tạo bút :
 CPen pen;
 pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
 Phương pháp thứ ba là khởi tạo đối tượng CPen nhờ cấu trúc LOGPEN
bằng hàm CreatePenIndirect:
 CPen pen;
 LOGPEN lp;
 lp.lopnStyle=PS_SOLID;
 lp.lopnWidth=1;
 lp.lopnColor=RGB(255,0,0);
 pen.CreateIndirect(&lp);

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 38

 3.4. Vẽ trên Windows


 b/ Chổi tô :
 Chổi tô có 3 loại cơ bản: đồng nhất (solid), sọc (hatch) và mẫu (pattern).
 Chổi đồng mầu được lập chỉ với tham số giá trị mầu COLORREF :
 CBrush brush(RGB(255,0,0));
hoặc có thể thực hiện khai báo không truyền tham số và khởi tạo chổi tô
đồng mầu với hàm CreateSolidBrush :
 CBrush brush;
 brush.CreateSolidBrush(RGB(255,0,0));
 Chổi sọc được khởi tạo ngoài tham số giá trị mầu còn cần thêm tham số
xác định kiểu sọc :
 CBrush brush(HS BDIAGONAL,RGB(255,0,0));
_

hoặc khởi tạo với hàm CreateSolidBrush :


 CBrush brush;
 brush.CreateHatchBrush(HS BDIAGONAL ,RGB(255,0,0));
_

kiểu gạch có thể :


HS_BDIAGONAL, HS_CROSS, HS_DIAGCROSS,
HS_FDIAGONAL, HS_HORIZONTAL, HS_VERTICAL

19
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 39

 3.5. Tạo một chương trình vẽ đồ thị với thư viện sẵn có
 Tạo một project mới với kiểu Dialog Based.

 Copy thư mục “ToolInter” vào thư mục của project đã tạo.

 Đưa file “ToolInter\bin\ToolInter.lib” hoặc “…\ToolInterd.lib” (tùy theo


chế độ biên dịch của đề án) vào đề án bằng chức năng “Add Files to
Project …”

 Trong file “stdafx.h” thêm dòng sau


 #include "ToolInter/ToolInter.h“

(đặt sau dòng: #endif // _AFX_NO_AFXCMN_SUPPORT)

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 40

 3.5. Tạo một chương trình vẽ đồ thị với thư viện sẵn có
 A) Với khung giao diện CView:

 Trong file “xxxView.h” thêm biến cho lớp CxxxView


 CGraph m_graph;

 Trong file “xxxView.cpp”, thêm mã nguồn sau cho hàm CxxxView


::OnDraw(CDC* pDD) để thực hiện vẽ đồ thị:
 CRect r;
 GetClientRect(&r);
 m_graph.SetRectControl(r);
 m_graph.SetDC(pDC);

 m_graph.DrawBackGround(RGB(255,255,255)); //đặt mầu nền


 m_graph.DrawTable(); //vẽ bảng lưới của đồ thị
 … //thực hiện các lệnh vẽ đồ thị

20
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 41

 3.5. Tạo một chương trình vẽ đồ thị với thư viện sẵn có
 B) Với hộp thoại:

 Trên giao diện chỉnh sửa hộp thoại, thêm Static Text (kéo kích thước
của nó theo vùng muốn thể hiện đồ thị) và đổi ID của nó.

 Thêm khai báo biến cho đối tượng Static Text vừa tạo bằng chức
năng “ClassWizard…”

 Trong file “xxxDlg.h” thêm biến cho lớp CxxxDlg


 CGraph m_graph;

 Trong file “xxxDlg.cpp”, thêm mã nguồn sau cho hàm CxxxDlg


::OnPaint() để thực hiện vẽ đồ thị:
 m_graph.SetRectControl(m_Static_Graph);
 m_graph.DrawBackGround(RGB(255,255,255)); //đặt mầu nền
 m_graph.DrawTable(); //vẽ bảng lưới của đồ thị

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 42

 3.5. Tạo một chương trình vẽ đồ thị với thư viện sẵn có
 Thực hiện vẽ đồ thị:
 m_graph.DrawBackGround(RGB(255,255,255)); //đặt mầu nền
 m_graph.DrawTable(); //vẽ bảng lưới của đồ thị

 m_graph.SetScaleXY(1.0); //đặt tỉ lệ của trục Y theo trục X


 m_graph.SetScaleYX(1.0); //đặt tỉ lệ của trục X theo trục Y

 m_graph.SetGridStyle(PS_DOT); //đặt kiểu vẽ đường lưới


 m_graph.SetGridWidth(2); //đặt độ rộng đường lưới
 m_graph.SetGraphStyle(PS_DOT);//đặt kiểu vẽ đường đồ thị
 m_graph.SetGraphWidth(2); //đặt độ rộng đường đồ thị
 //kiểu vẽ đường có thể là PS_SOLID,PS_DASH,PS_DASHDOTDOT

21
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 43

 3.5. Tạo một chương trình vẽ đồ thị với thư viện sẵn có
 Thực hiện vẽ đồ thị:
 m_graph.SetColorGraph(RGB(255,0,255)); //đặt mầu vẽ của đường

 //vẽ 1 đường cong theo tọa độ x và y

 const int n=10; double x[n],y[n];

 for (int i=0;i<n;i++) { x[i]=i/2.0;y[i]=1.0/(i+1.0);}

 m_graph.DrawPline(x,y,n);

 //vẽ các hình cơ bản

 m_graph.Ellipse(4,1,1,2);

 m_graph.Rectangle(-1,-1,2,2);

 m_graph.DrawTextWithColor(m_graph.GetCurrentX(),m_graph.GetCurre
ntY(),“Welcome to my Graph",RGB(0,255,0),TA_CENTER|TA_TOP );

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 44

 3.6. Sử dụng các phép biến hình


 Copy thư mục “PpsTools” vào thư mục của project đã tạo ở trên.

 Đưa file “PpsTools\bin\PpsTools.lib” hoặc “…\ PpsToolsd.lib” (tùy theo


chế độ biên dịch của đề án) vào đề án bằng chức năng “Add Files to
Project …”

 Trong file “stdafx.h” thêm dòng sau


 #include " PpsTools / PpsTools.h“

 Khai báo sử dụng ma trận:


 matrix m; //hoặc khai báo m(3,3) thì không cần sử dụng SetSize()

 m.SetSize(3,3); //đặt kích thước ma trận

 m(0,0)=1; //đặt giá trị cho một phần tử của ma trận

22
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 45

 3.6. Sử dụng các phép biến hình


 Khai báo sử dụng ma trận:
 matrix m;

 m.SetSize(3,3); //đặt kích thước ma trận

 m(i,j)=1; //đặt giá trị cho một phần tử của ma trận

 vector x(3),y;

 X(i)=1;

 y=m*x

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 46

 3.6. Sử dụng các phép biến hình


 Định nghĩa ma trận thuần nhất 2D:

 void SetIdentityMatrix(matrix &m)

 {

 m.SetSize(3,3);

 for (int i=0;i<GetRow(m);i++)

 for (int j=0;j<GetCol(m);j++)

 m(i,j) = (i==j ? 1 : 0);

 }

23
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 47

 3.6. Sử dụng các phép biến hình


 Định nghĩa ma trận tịnh tiến:

 void SetTranslationMatrix(matrix &m, const double &tx, const double


&ty)

 {

 SetIdentityMatrix(m);

 m(0,2)=tx;

 m(1,2)=ty;

 }

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 48

 3.6. Sử dụng các phép biến hình


 Định nghĩa ma trận quay:

 void SetRotationMatrix(matrix &m, const double & angle)

 {

 SetIdentityMatrix(m);

 m(0,0)=cos(angle);

 m(1,1)=cos(angle);

 m(1,0)=sin(angle);

 m(0,1)=-sin(angle);

 }

24
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 49

 3.6. Sử dụng các phép biến hình


 Định nghĩa ma trận tỉ lệ:

 void SetScalationMatrix(matrix &m, const double &sx, const double &sy)

 {

 SetIdentityMatrix(m);

 m(0,0)=sx;

 m(1,1)=sy;

 }

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 50

y
P3
ty P2

P1


 P2 = mT.P2 = mR.mT.P1 = m.P1 O tx x

25
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 51

 3.7. Giải hệ phương trình bằng phương pháp số


 Giải hệ phương trình đại số tuyến tính:

 a.x = b
 int Gauss_Jordan(const smatrix & a, const vector & b, vector & x);

 int linear(const smatrix & a, const vector & b, vector & x);

 int Jacobi(const smatrix& a, const vector & b, vector & x, const double &
eps=1e-10, const int & Max=100);

 int Gauss_Seidel(const smatrix & a, const vector & b,vector & x, const
double & eps=1e-10, const int & Max=100);

 a : ma trận hệ số

 b : véc tơ vế phải

 x : chứa xấp sỉ đầu, đồng thời chứa kết quả giải bài toán

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 52

 3.7. Giải hệ phương trình bằng phương pháp số


 Giải hệ phương trình phi tuyến:

 f(x) = 0

 Fx(x(k)).x(k) = –f(x(k)) (*)

x(k+1) = x(k) + x(k)

 int Newton_Raphson(vector & x, functionNR & func, const


double & eps=1e-10, const int& Max=100);

 x là véc tơ chứa xấp xỉ đầu, đồng thời chứa kết quả bài toán

 func là tên hàm được định nghĩa theo cú pháp

 void func(smatrix & a, vector & c, const vector & x)

 Hàm này có nhiệm vụ định nghĩa ma trận Jacobi Fx(x(k)) (chứa trong a)
và véc tơ –f(x(k)) (chứa trong b) ở bước lặp thứ k với giá trị x = x(k)

26
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 53

 3.7. Giải hệ phương trình bằng phương pháp số


 Ví dụ giải hệ phương trình phi tuyến: l2
2
l1. cos(1 )  l2 . cos( 2 )  l3 . cos(3 )  d1  0 l3

 l1. sin(1 )  l2 . sin( 2 )  l3 . sin(3 )  d 2  0 3
 void Func(smatrix & a, l1
vector & c,const vector & x) 1

d2

 {
 a.SetSize(2);
d1
 c.SetSize(2);

 a(0,0)=-m_l2*sin(x(0)); a(0,1)=m_l3*sin(x(1));
 a(1,0)=m_l2*cos(x(0)); a(1,1)=-m_l3*cos(x(1));

 c(0)=m_l1*cos(m_phi1)+m_l2*cos(x(0))-m_l3*cos(x(1))-m_d1;
 c(1)=m_l1*sin(m_phi1)+m_l2*sin(x(0))-m_l3*sin(x(1))-m_d2;
 }

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

3. Lập trình Windows với MFC 54

 3.7. Giải hệ phương trình bằng phương pháp số


 Ví dụ giải hệ phương trình phi tuyến: l2
2
l1. cos(1 )  l2 . cos( 2 )  l3 . cos(3 )  d1  0 l3

 l1. sin(1 )  l2 . sin( 2 )  l3 . sin(3 )  d 2  0 3
 double eps=0.001; l1
int maxloop=300; 1
d2

 int n=2;
 vector x(2);
d1
 m_phi1 = …; //giá trị góc khâu 1
 x[0]=m_phi2; x[1]=m_phi3; //lấy xấp xỉ đầu=giá trị vị trí trước đó

 if (Newton_Raphson(x,Func,eps,maxloop)==0)
 {
 m_phi2=x(0);m_phi3=x(1);
 }

27
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 55

 4.1. OpenGL là gì?


 OpenGL = Open Graphic Library

 Được phát triển đầu tiên bởi Silicon Graphic, Inc., là một giao
diện phần phần mềm hướng thủ tục theo chuẩn công nghiệp hỗ
trợ đồ họa 3 chiều.

 Cung cấp khoảng 120 tác vụ để vẽ các primitive trong nhiều


mode khác nhau.

 Là một giao diện phần mềm độc lập với phần cứng (hardware –
independent software interface) hộ trợ cho lập trình đồ họa.

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 56

 4.1. OpenGL là gì?


 OpenGL = Open Graphic Library

28
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 57

 4.1. OpenGL là gì?


 OpenGL = Open Graphic Library

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 58

 4.1. OpenGL là gì?


 OpenGL = Open Graphic Library

29
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 59

 4.1. OpenGL là gì?


 Để sử dụng các nội dung trên của OpenGL trong đề án chương
trình, thêm các dòng sau vào header file (nên đưa vào stdafx.h):

 #include <gl\gl.h>

 #include <gl\glu.h>

 #include <gl\glaux.h>

 #pragma comment(lib, "opengl32.lib")

 #pragma comment(lib, "glu32.lib")

 #pragma comment(lib, "glaux.lib")

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 60

 4.2. Vấn đề cơ bản của OpenGL


 4.2.1. Các kiểu dữ liệu
 OpenGL định nghĩa một số kiểu dữ liệu tương đương với các các kiểu
truyền thống của C

Kiểu dữ liệu Kiểu tương đương Kiểu dữ liệu Kiểu tương đương
GLbyte signed char GLubyte unsigned char
GLshort short GLboolean unsigned char
GLint int GLushort unsigned short
GLsizei long GLuint unsigned long
GLfloat float GLenum unsigned long
GLclampf float GLbitfield unsigned long
GLdouble double GLvoid void
GLclampd double HGLRC HGDIOBJ

30
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 61

 4.2. Vấn đề cơ bản của OpenGL


 4.2.2. Ngữ cảnh diễn tả
 Có 5 hàm "WGL" được cung cấp trong triển khai OpenGL trong
WindowNT chịu trách nhiệm quản lý các ngữ cảnh diễn tả

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 62

 4.2. Vấn đề cơ bản của OpenGL


 4.2.2. Định dạng điểm ảnh
 Trước khi chương trình có thể tạo lập một ngữ cảnh diễn tả, nó phải
đặt định dạng điểm ảnh của thiết bị.

 Các thuộc tính này được gộp vào trong bề mặt vẽ sử dụng chế độ
mầu RGBA hoặc chỉ số, hoặc vùng đệm điểm và các thông tin đồ hoạ
khác của OpenGL.

31
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 63

 4.2. Vấn đề cơ bản của OpenGL


 4.2.2. Cấu trúc định dạng điểm ảnh
 Mỗi thiết bị thể hiện OpenGL cung cấp một số chỉ định của các định
dạng điểm ảnh.

 Các định dạng điểm ảnh sẵn có của chúng là các khả năng thể hiện
cơ sở.

 Thuộc tính của một định dạng điểm ảnh được mô tả chi tiết bởi cấu
trúc PIXELFORMATDESCRIPTOR, nó có 26 trường thông tin
typedef struct tagPIXELFORMATDESCRIPTOR
{
WORD nSize; WORD nVersion; DWORD dwFlags;
BYTE iPixelType; BYTE cColorBits; BYTE cRedBits;
BYTE cRedShift; BYTE cGreenBits; BYTE cGreenShift;
BYTE cBlueBits; BYTE cBlueShift; BYTE cAlphaBits;
BYTE cAlphaShift; BYTE cAccumBits; BYTE cAccumRedBits;
BYTE cAccumGreenBits; BYTE cAccumBlueBits; BYTE cAccumAlphaBits;
BYTE cDepthBits; BYTE cStencilBits; BYTE cAuxBuffers;
BYTE iLayerType; BYTE bReserved;
DWORD dwLayerMask; DWORD dwVisibleMask; DWORD dwDamageMask;
} PIXELFORMATDESCRIPTOR, * PIXELFORMATDESCRIPTOR, FAR * LPPIXELFORMATDESCRIPTOR;

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 64

 4.2. Vấn đề cơ bản của OpenGL


 4.2.3. Khởi tạo và sử dụng cấu trúc định dạng điểm ảnh
 Giá trị mặc định để làm việc tốt trên tất cả các hệ thống như sau:

PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), //kích thước cấu trúc
1, //số phiên bản
PFD_DRAW_TO_WINDOW | //các cờ đặc tính
PFD_SUPPORT_OPENGL|PFD_TYPE_RGBA,
24, //dùng 24 bit mầu
0,0,0,0,0,0, //không sử dụng chúng
0,0,0,0,0,0,0, //không vùng đệm alpha
//hoặc accum
32, //32 nit vùng đệm sâu
0,0, //không vùng đệm khung
//hoặc vùng đệm phụ
PFD_MAIN_PLANE, //kiểu lớp chính
0, //dự trữ
0,0,0 //không được cung cấp
};

32
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 65

 4.2. Vấn đề cơ bản của OpenGL


 4.2.3. Khởi tạo và sử dụng cấu trúc định dạng điểm ảnh
 Lựa chọn sử dụng một định dạng điểm ảnh:
CClientDC clientDC(this);
int pixelFormat = ChoosePixelFormat(clientDC.m_hDC,&pfd);
BOOL success = SetPixelFormat(clientDC.m_hDC,pixelFormat,&pfd);

 4.2.4. Tạo lập ngữ cảnh diễn tả (Rendering context)


 Phải tạo lập và làm hiện hành một ngữ cảnh mô tả trước khi có thể
vẽ trên cửa sổ với các hàm OpenGL
 Tạo lập và làm hiện hành nó thường đặt trong lời đáp thông điệp
WM_CREATE, tức là đặt trong hàm OnCreate()
... //Khởi tạo và lựa chọn cấu trúc dữ liệu điểm ảnh ở đây
HGLRC m_hRC = wglCreateContext(clientDC.m_hDC);

 Hủy bỏ ngữ cảnh diễn tả thường đặt trong lời đáp thông điệp WM_
DESTROY, tức là đặt trong hàm OnDestroy()
wglDeleteContext(m_hRC);

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 66

 4.2. Vấn đề cơ bản của OpenGL


 4.2.5. Tiến hành vẽ
 Để tiến hành vẽ với OpenGL đã khởi tạo trong MFC, thực hiện vẽ
trong hàm OnDraw() của lớp quan sát:

void CxxxView::OnDraw(CDC* pDC)


{
CxxxDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
wglMakeCurrent(pDC->m_hDC,m_hRC);
DrawWithOpenGL(); //gọi các lệnh vẽ của OpenGL ở đây
wglMakeCurrent(pDC->m_hDC,NULL);
}

33
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 67

 4.3. Các lệnh vẽ cơ bản của OpenGL


 4.3.1. Cú pháp của các hàm vẽ OpenGL
 OpenGL có hơn 100 hàm vẽ khác nhau, tất cả chúng bắt đầu bằng
các tiền tố là gl.
 Các hàm OpenGL với các hậu tố khác nhau phụ thuộc vào kiểu tham
số mà chúng có thể chấp nhận.

 Ví dụ lệnh glVertex có 24 dạng dùng để định nghĩa các điểm:


glVertex2d() glVertex2f() glVertex3d() glVertex3f()
glVertex4d() glVertex4f() glVertex2i() glVertex2s()
glVertex3i() glVertex3s() glVertex4i() glVertex4s()
glVertex2dv() glVertex2fv() glVertex3dv() glVertex3fv()
glVertex4dv() glVertex4fv() glVertex2iv() glVertex2sv()
glVertex3iv() glVertex3sv() glVertex4iv() glVertex4sv()
hậu tố v chỉ đối mục của hàm được cho trong một vector.

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 68

 4.3. Các lệnh vẽ cơ bản của OpenGL


 4.3.1. Cú pháp của các hàm vẽ OpenGL

Hậu tố Ý nghĩa
b Cho đối mục GLbyte
d GLdouble hoặc GLclampd
f GLfloat hoặc GLclampf
i GLint hoặc GLsizei
s GLshort
ub GLubyte hoặc GLboolean
ui GLuint , GLenum , GLbitfield
us GLushort
bv GLbyte cho trong 1 vector
dv GLdouble hoặc GLclampd cho trong 1 vector
fv GLfloat hoặc GLclampf cho trong 1 vector
iv GLint hoặc GLsizei cho trong 1 vector
sv GLshort cho trong 1 vector
ubv GLubyte hoặc GLboolean cho trong 1 vector
uiv GLuint , GLenum , GLbitfield cho trong 1 vector
usv GLushort cho trong 1 vector

34
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 69

 4.3. Các lệnh vẽ cơ bản của OpenGL


 4.3.2. Các hàm đặt trạng thái vẽ
 Đặt mầu xóa:
 void glClearColor(GLclampf red, GLclampf green, GLclampf blue,
GLclampf alpha)
 red, green, blue: tổ hợp các giá trị đỏ, xanh lá cây, xanh da trời của
một mầu có thể là các giá trị từ 0.0 tới 1.0
 alpha: xác định sự pha trộn mầu.
 Xóa vùng đệm mầu:
 void glClear (GLbitfield mask)
 mask: là một dẫy các cờ bit chỉ ra các vùng đệm để xoá.
 Vùng đệm mầu (với GL_COLOR_BUFFER_BIT) là vùng nhớ nắm giữ
ảnh thật được biểu diễn lên màn hình.
 Đặt mầu vẽ hiện hành: có 32 phiên bản với các tham số
 void glColor3f(GLfloat red, GLfloat green, GLfloat blue)
 red, green, blue: tổ hợp các giá trị đỏ, xanh lá cây, xanh da trời của
một mầu có thể là các giá trị từ 0.0 tới 1.0
 Sau khi đặt mầu vẽ, bất kỳ đối tượng nào được tạo bởi OpenGL sẽ được
vẽ với mầu đã chọn.

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 70

 4.3. Các lệnh vẽ cơ bản của OpenGL


 4.3.2. Các lệnh vẽ hình
 void glBegin (GLenum mode);
 void glVertex…(…)
 … //định nghĩa các điểm của đối tượng vẽ ở đây
 void glEnd ();
 mode: là cờ hiệu xác định đối tượng được vẽ

35
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 71

 4.3. Các lệnh vẽ cơ bản của OpenGL


 4.3.2. Các lệnh vẽ hình
 glBegin (GL_POINTS);
 glVertex2fv(p0);

 glVertex2fv(p1);

 glVertex2fv(p2);

 glVertex2fv(p3);

 glVertex2fv(p4);

 glVertex2fv(p5);

 glVertex2fv(p6);

 glVertex2fv(p7);

 glEnd ();

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 72

 4.3. Các lệnh vẽ cơ bản của OpenGL


 4.3.2. Các lệnh vẽ hình
 glBegin (GL_LINES);
 glVertex2fv(p0);

 glVertex2fv(p1);

 glVertex2fv(p2);

 glVertex2fv(p3);

 glVertex2fv(p4);

 glVertex2fv(p5);

 glVertex2fv(p6);

 glVertex2fv(p7);

 glEnd ();

36
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 73

 4.3. Các lệnh vẽ cơ bản của OpenGL


 4.3.2. Các lệnh vẽ hình
 glBegin (GL_LINE_STRIP);
 glVertex2fv(p0);

 glVertex2fv(p1);

 glVertex2fv(p2);

 glVertex2fv(p3);

 glVertex2fv(p4);

 glVertex2fv(p5);

 glVertex2fv(p6);

 glVertex2fv(p7);

 glEnd ();

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 74

 4.3. Các lệnh vẽ cơ bản của OpenGL


 4.3.2. Các lệnh vẽ hình
 glBegin (GL_LINE_LOOP);
 glVertex2fv(p0);

 glVertex2fv(p1);

 glVertex2fv(p2);

 glVertex2fv(p3);

 glVertex2fv(p4);

 glVertex2fv(p5);

 glVertex2fv(p6);

 glVertex2fv(p7);

 glEnd ();

37
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 75

 4.3. Các lệnh vẽ cơ bản của OpenGL


 4.3.2. Các lệnh vẽ hình
 glBegin (GL_POLYGON);
 glVertex2fv(p0);

 glVertex2fv(p1);

 glVertex2fv(p2);

 glVertex2fv(p3);

 glVertex2fv(p4);

 glVertex2fv(p5);

 glVertex2fv(p6);

 glVertex2fv(p7);

 glEnd ();

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 76

 4.3. Các lệnh vẽ cơ bản của OpenGL


 4.3.2. Các lệnh vẽ hình
 glBegin (GL_QUADS);
 glVertex2fv(p0);

 glVertex2fv(p1);

 glVertex2fv(p2);

 glVertex2fv(p3);

 glVertex2fv(p4);

 glVertex2fv(p5);

 glVertex2fv(p6);

 glVertex2fv(p7);

 glEnd ();

38
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 77

 4.3. Các lệnh vẽ cơ bản của OpenGL


 4.3.2. Các lệnh vẽ hình
 glBegin (GL_QUAD_STRIP);
 glVertex2fv(p0);

 glVertex2fv(p1);

 glVertex2fv(p2);

 glVertex2fv(p3);

 glVertex2fv(p4);

 glVertex2fv(p5);

 glVertex2fv(p6);

 glVertex2fv(p7);

 glEnd ();

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 78

 4.3. Các lệnh vẽ cơ bản của OpenGL


 4.3.2. Các lệnh vẽ hình
 glBegin (GL_TRIANGLES);
 glVertex2fv(p0);

 glVertex2fv(p1);

 glVertex2fv(p2);

 glVertex2fv(p3);

 glVertex2fv(p4);

 glVertex2fv(p5);

 glVertex2fv(p6);

 glVertex2fv(p7);

 glEnd ();

39
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 79

 4.3. Các lệnh vẽ cơ bản của OpenGL


 4.3.2. Các lệnh vẽ hình
 glBegin (GL_TRIANGLE_STRIP);
 glVertex2fv(p0);

 glVertex2fv(p1);

 glVertex2fv(p2);

 glVertex2fv(p3);

 glVertex2fv(p4);

 glVertex2fv(p5);

 glVertex2fv(p6);

 glVertex2fv(p7);

 glEnd ();

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 80

 4.3. Các lệnh vẽ cơ bản của OpenGL


 4.3.2. Các lệnh vẽ hình
 glBegin (GL_TRIANGLE_FAN);
 glVertex2fv(p0);

 glVertex2fv(p1);

 glVertex2fv(p2);

 glVertex2fv(p3);

 glVertex2fv(p4);

 glVertex2fv(p5);

 glVertex2fv(p6);

 glVertex2fv(p7);

 glEnd ();

40
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 81

 4.3. Các lệnh vẽ cơ bản của OpenGL


 4.3.2. Các lệnh vẽ hình
 glBegin (GL_TRIANGLE_FAN);
 glVertex2fv(p0);

 glVertex2fv(p1);

 glVertex2fv(p2);

 glVertex2fv(p3);

 glVertex2fv(p4);

 glVertex2fv(p5);

 glVertex2fv(p6);

 glVertex2fv(p7);

 glEnd ();

 glFlush(); //đảm bảo cho bất kỳ các lệnh OpenGL trên vùng
//đệm sẽ được thể hiện lên màn hình.

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 82

 4.3. Các lệnh vẽ cơ bản của OpenGL


 4.3.3. Các hàm định dạng đối tượng vẽ
 Đặt kích thước của một điểm:
 void glPointSize (GLfloat size)

 Định nghĩa độ rộng của các đường thẳng:


 void glLineWidth (GLfloat width)

 Định nghĩa kiểu đường:


 void glLineStipple (GLint factor, GLushort pattern)

 factor: chỉ định cách lặp lại mẫu ; pattern: chứa mẫu vẽ theo chấm

 Ví dụ:
 glLineStipple(1, 0x00FF); // 0x00FF = 0000000011111111

 glEnable(GL_LIXE_STIPPLE);

41
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 83

 4.3. Các lệnh vẽ cơ bản của OpenGL


 4.3.3. Các hàm định dạng đối tượng vẽ
 Định nghĩa cách vẽ các đa giác:
 void glPolygonMode (GLenum face, GLenum mode)
 face: có thể là GL_FRONT, GL_BACK hoặc GL_FRONT_AND_BACK;
xác định mặt được định nghĩa
 mode: có thể là GL_POINT (vẽ các điểm ở các đỉnh của đa giác),
GL_LINE (vẽ đa giác dạng khung dây), hoặc là GL_FILL (vẽ đa giác
đặc).

 Một đa giác được xem như là mặt trước khi các đỉnh của nó được
định nghĩa theo thứ tự ngược chiều quay kim đồng hồ, bạn có thể
bảo với OpenGL đổi chiều khái niệm của nó về mặt trước đa giác:
 void glFrontFace (GLenum mode)
 mode: có thể là GL_CW để lựa chọn thứ tự các đỉnh theo chiều
quay kim đồng hồ, trong khi GL_CCW (được OpenGL đặt mặc
định) lựa chọn các đỉnh theo ngược chiều kim đồng hồ.

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 84

 4.4. Vẽ 3 chiều trong OpenGL


 4.4.1. Lựa chọn ma trận phép chiếu
 Để lựa chọn ma trận thực hiện phép chiếu, sử dụng hàm:
 void glMatrixMode (GLenum mode)
 mode: có thể là GL_MODELVIEW, GL_PROJECTION hoặc GL_TEXTURE,
là một hằng đại diện cho ma trận muốn thao tác.
 Sử dụng hằng GL_PROJECTION để lựa chọn phép chiếu phối cảnh tới
các đối tượng muốn biểu diễn.
 Dùng hàm glLoadIdentity() để khởi tạo ma trận chiếu đơn vị
thuần nhất.

42
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 85

 4.4. Vẽ 3 chiều trong OpenGL


 4.4.2. Định nghĩa khối quan sát
 Để bảo OpenGL giới hạn một khối quan sát là một vùng 3D mà các
đối tượng tồn tại trong đó, ta sử dụng hàm:
 void glFrustum (GLdouble left, GLdouble right, GLdouble
bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
 6 đối mục GLdouble định nghĩa các toạ độ trái, phải, trên, dưới, gần và
xa của khối quan sát.
 Bất kỳ một đối tượng hoặc một phần đối tượng nằm ngoài khối quan
sát sẽ không xuất hiện trên màn hình.

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 86

 4.4. Vẽ 3 chiều trong OpenGL


 4.4.2. Định nghĩa khối quan sát
 Ví dụ:
 glFrustum (-1.0,1.0,-1.0,1.0,2.0,7.0) ;
 Sẽ đặt mặt cắt gần là 2 đơn vị từ mắt và đặt mặt phẳng cắt xa là 7 đơn
vị từ mắt.
 Nếu vẽ một khối lập phương có vị trí [(-0.5,-0.5,-0.5);(0.5-0.5-0.5)]
thì sẽ không xuất hiện trên màn hình do nằm ngoài khối quan sát.
 Để hiển thị được vật thể, sử dụng phép tịnh tiến đối tượng vào trong
khối quan sát.

43
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 87

 4.4. Vẽ 3 chiều trong OpenGL


 4.4.3. Phép biến đổi mô hình quan sát
 Để thực hiện các phép biến đổi này, cần chuyển về làm việc với chế
độ ma trận mô hình quan sát:
 glMatrixMode (GL_MODEVIEW);
 glLoadIdentity();
 Phép tịnh tiến mô hình:
 void glTranslatef(GLfloat x, GLfloat y, GLfloat z)

 Phép tỉ lệ mô hình:
 void glScalef (GLfloat x, GLfloat y, GLfloat z)

 Phép xoay mô hình:


 void glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
 angle: xác định góc xoay (theo độ) quanh 1 trục và theo chiều ngược
chiều kim đồng hồ
 (x,y,z): xác định véc tơ trục quay

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 88

 4.5. Chiếu sáng các đối tượng 3D


 4.5.1. Các kiểu ánh sáng
 OpenGL cung cấp 4 kiểu ánh sáng:
 bao quanh (ambient)
 khuếch tán (diffuse)
 phản chiếu (specular)
 phát ra (emitted)

44
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 89

 4.5. Chiếu sáng các đối tượng 3D


 4.5.2. Định nghĩa một nguồn sáng
 OpenGL cho phép sử dụng 8 nguồn sáng khác nhau.
 Mỗi nguồn sáng có những đặc tính riêng. Các đặc tính của chúng
gồm ánh sáng bao quanh, ánh sáng khuyếch tán và vị trí.
 Phải chỉ rõ tổ hợp phần trăm red, green và blue chứa đựng trong
kiểu ánh sáng và toạ độ vị trí của nguồn ánh sáng.
 Các mảng sau chứa đựng các giá trị vị trí cho định nghĩa nguồn
sáng:
 GLfloat ambientlight [] = {0.3f,0.3f,0.3f,0.1f};
 GLfloat diffuselight[] = {0.5f,0.5f,0.5f,1.0f};
 GLfloat specularlight[] = {0.0f, 0.0f, 0.0f,1.0f};
 GLfloat positionlight[] = {0.0f, 0.0f,1.0f 0.0f};
 Mảng positionlight[] nắm giữ vị trí của nguồn sáng xác định bằng các
toạ độ X, Y, Z và W (W chỉ có giá trị 1.0 và 0.0).
 Nếu toạ độ W là 0.0, OpenGL coi là nguồn sáng định hướng (ánh
sáng mặt trời), ngược lại nếu giá trị 1.0 coi đó là vị trí nguồn sáng
(nguồn sáng từ bóng đèn).

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 90

 4.5. Chiếu sáng các đối tượng 3D


 4.5.2. Định nghĩa một nguồn sáng
 Khi đã có các mảng định nghĩa nguồn sáng, có thể đưa vào OpenGL
 glLightfv(GL_LIGHT0, GL_AMBIENT, ambientlight0);
 glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuselight0);
 glLightfv(GL_LIGHT0, GL_SPECULAR, specularlight0);
 glLightfv (GL_LIGHT0, GL_POSITION, position light0);
 Đối mục đầu tiên là nguồn sáng được định nghĩa, có thể nhận giá trị
từ GL_LIGHT0 đến GL_LIGHT7
 Đối mục thứ 2 là một trong các hằng xác định đặc tính của ánh sáng
bạn muốn thay đổi :
 GL_AMBIENT, GL_CONSTANT_ATTENUATION, GL_DIFFUSE,
 GL_POSITION, GL_QUADRATIC_ATTENUATION, GL_SPECULAR
 GL_SPOT_CUTOFF, GL_SPOT_DIRECTION, GL_SPOT_EXPONENT

 Đối mục thứ 3 là địa chỉ của mảng chứa các giá trị mà đặc tính ánh
sáng được đặt.

45
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 91

 4.5. Chiếu sáng các đối tượng 3D


 4.5.2. Định nghĩa một nguồn sáng
 Để nguồn sáng có hiệu lực, sử dụng hàm:
 glEndable(GL_LIGHTING); //bật chế độ chiếu sáng
 glEndable(GL_LIGHT0); //bật nguồn sáng 0

 Chú ý:
 Vị trí của nguồn sáng bị tác động bởi các phép biến đổi mô hình quan
sát giống như các đối tượng 3D khác.

 Phép biến đổi xảy ra khi gọi glLight() để xác định vị trí hay định hướng
nguồn sáng.

 Vì lý do này, nên gọi glMatrixMode(GL_MODELVIEW) và glLoadIdentity()


trước khi gọi glLight()

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 92

 4.5. Chiếu sáng các đối tượng 3D


 4.5.3. Định nghĩa vật liệu vật thể 3D
 Định nghĩa các đặc tính vật liệu qua các hàm:
 void glMaterialfv (GLenum face, GLenum pname, const GLfloat
*params);
 face: hằng xác định phía của các bề mặt đa giác được định nghĩa vật
liệu, GL_FRONT, GL_BACK hoặc GL_FRONT_AND_BACK
 pname: xác định đặc tính của vật liệu muốn định nghĩa, có thể là
GL_AMBIENT, GL_AMBIENT_AND_DIFFUSE,
GL_DIFFUSE, GL_COLOR_INDEXES,
GL_EMISSION, GL_SHININESS, GL_SPECULAR
 params: là mảng chứa đựng các giá trị RGBA định nghĩa các đặc tính
vật liệu.
GLfloat materialAmbient[] ={0.0f, 0,7f, 0.0f, 1.0f};
GLfloat materialSpeculaer[]={1.0f, 1.0f, 1.0f, 1.0f};

46
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 93

 4.5. Chiếu sáng các đối tượng 3D


 4.5.4. Định nghĩa vector chuẩn của bề mặt được chiếu sáng
 void glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz);
 Định nghĩa vector chuẩn của một bề mặt, dựa vào đó để tính toán
việc chiếu sáng và đánh bóng bề mặt.

Có cung cấp
Không có
véc tơ pháp
véc tơ pháp

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 94

 4.5. Chiếu sáng các đối tượng 3D


 4.5.4. Định nghĩa vector chuẩn của bề mặt được chiếu sáng
 void glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz);
 Định nghĩa vector chuẩn của một bề mặt, dựa vào đó để tính toán
việc chiếu sáng và đánh bóng bề mặt.

 4.5.5. Xác định mô hình tô bóng và kiểm tra độ sâu


 Để chọn mô hình tô bóng:
 glShadeModel(GL_FLAT); glShadeModel(GL_SMOOTH);
 Để kiểm tra đặc tính độ sâu:
 glEnable(GL_DEPTH_TEST);
 Vì OpenGL sử vùng đệm xác định cho kiểm tra độ sâu nên phải xoá
vùng này trước khi diễn tả cảnh, ví dụ thực hiện xoá cả vùng đệm
màu và vùng đệm sâu:
 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);

47
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 95

 4.6. Tạo lập mô hình 3D


 4.6.1. Sử dụng ngăn xếp ma trận
 Ngăn xếp ma trận (matrix stack) rất giống với ngăn xếp máy tính mà
bạn sử dụng, ngoại trừ ngăn xếp ma trận lưu giữ các giá trị của các
ma trận, hơn thế nữa kiểu của các giá trị đó bạn có thể lưu trữ trong
ngăn xếp máy tính.

 Mỗi ma trận chuyển đổi có một ngăn xếp ma trận của chính bản thân
nó.

 Để ghi lại ngữ cảnh của ma trận hiện hành, chỉ cần gọi hàm sau:

glPushMatrix();
 Sau khi đặt ma trận hiện hành vào trong ngăn xếp, bạn có thể thực
hiện tất cả các phép chuyển đổi bạn muốn mà không phải lo lắng về
sự thay đổi ma trận gốc.

 Khi bạn muốn trả lại ma trận gốc bạn gọi hàm glPopMatrix().

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 96

 4.6. Tạo lập mô hình 3D


 4.6.2. Vùng đệm kép
 Các vùng đệm kép được gọi là vùng đệm trước (vùng đệm hiển thị)
và vùng đệm sau (vùng đệm ẩn).

 Khi đặt OpenGL làm việc với vùng đệm kép, các lệnh vẽ của bạn luôn
luôn đi tới vùng đệm sau hiện hành, do đó người sử dụng sẽ không
thấy trên màn hình những gì bạn đang vẽ. Sau khi chương trình vẽ
ảnh xong, nó hoán đổi vùng đệm trước và sau, khi đó ảnh mới xuất
hiện trên màn hình.

 Cài đặt môi trường vùng đệm kép:


 PIXELFORMATDESCRIPTOR
 { sizeo (PIXELFORMATDESCRIPTOR), 1,
 PFD DRAW_TO_WINDOW |D_SUPPORT_OPENGL |
 PFD_DOUBLEBUFFER, …..
 };
 Gọi hàm SwapBuffers() sau khi vẽ ảnh mới để hoán đổi vùng đệm.

48
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 97

 4.6. Tạo lập mô hình 3D


 4.6.3. Danh sách hiển thị
 Danh sách hiển thị có thể được coi là một vùng đệm cho một nhóm
lệnh OpenGL nào đó.
 Khi một danh sách hiển thị được gọi ra, nó sẽ thực hiện các lệnh
chứa trong nó, theo đúng thứ tự mà các lệnh đó được gọi ra khi tạo
danh sách hiển thị.
 Mục đích chủ yếu của danh sách hiển thị chính là dành cho việc vẽ
lại nhiều lần một vật thể, hoặc vẽ các vật thể có hình dạng giống hệt
nhau hoặc dịch chuyển, quay theo một cách nào đó. Việc làm này
thực sự mang lại hiệu quả khi muốn vẽ lại một vật thể phức tạp.
 Danh sách hiển thị được chứa trong bộ nhớ nhóm lệnh mà ta đặt
vào. Khi ta muốn gọi lại nhóm lệnh này, ta chỉ phải gọi lại danh sách
hiển thị chứa nhóm lệnh.
 Ngoài ra, danh sách hiển thị lưu các lệnh theo một cách đã được tối
ưu hoá cho nên nó được thực hiện nhanh hơn.

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 98

 4.6. Tạo lập mô hình 3D


 4.6.3. Danh sách hiển thị
 Khởi tạo danh sách hiển thị:
 int listIndex ;
 listIndex = glGenLists(1);
 // glGenLists(1) sẽ trả lại một số nguyên tương ứng với 1 danh sách hiển
thị mới. Hàm này đảm bảo listIndex không trùng với những danh sách
hiển thị đã có. Tham số là số danh sách hiển thị mà ta cần tạo mới.
 if (listIndex != 0)
 {
 glNewList(listIndex , GL_COMPILE);
 //khởi tạo một danh sách hiển thị mới
 …… //gọi các lệnh vẽ của OpenGL để vẽ vật thể
 glEndList(); //kết thúc một danh sách hiển thị
 }

 Gọi thực hiện một danh sách hiển thị:


 glCallLits(listIndex); // đối số là tên của danh sách hiển thị

49
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

5. Công cụ hỗ trợ mô phỏng 3D 99

 5.1. Tệp tin mô hình 3D - STL


 5.1.1. Tệp tin STL là gì?
 STL = STereoLithography là dạng thường sử dụng trong hỗ trợ
mô phỏng 3 chiều do:
 Được hỗ trợ bởi tất cả các phần mềm xây dựng mô hình 3D
 Cấu trúc rất đơn giản, dễ hiểu và dễ sử dụng

 Tệp tin STL chỉ mô tả hình dạng bề mặt của các đối tượng 3D mà
không kèm theo thông tin về mấu sắc, dán ảnh hay các lệnh thuộc
tính của đối tượng, đơn vị, tỉ lệ, ….

 Tệp tin mô hình STL có hai định dạng :

 Tệp tin văn bản (theo mã ASCII)


 Tệp tin nhị phân (binary).

 ASCII - American Standard Code for Information Interchange

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 100

 5.1. Tệp tin mô hình 3D - STL


 5.1.2. Định dạng tệp tin STL theo mã ACSII
 Tệp tin STL dạng văn bản : có thể mở để xem nội dung bằng bất kỳ
phần mềm soạn thảo văn bản nào.

 Ví dụ :
 solid NAP HOP ascii – chuỗi tên tùy chọn
 facet normal 0.000000e+000 0.000000e+000 1.000000e+000
 outer loop
 vertex 1.079286e+001 1.400000e+001 9.100000e+001
 vertex 8.426600e+001 1.400000e+001 9.100000e+001
 vertex 1.322431e+001 2.809329e+001 9.100000e+001
 endloop
 endfacet
 ......
 endsolid NAP HOP ascii – chuỗi tên tùy chọn
 Mỗi facet định nghĩa 1 mặt tam giác
 Gồm 1 vector pháp và 3 đỉnh

50
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

4. Thư viện đồ họa mở OpenGL 101

 5.1. Tệp tin mô hình 3D - STL


 5.1.3. Định dạng tệp tin STL nhị phân
 Kích thước tệp tin STL nhị phân nhỏ hơn ở dạng ASCII
 Định dạng tệp tin có cấu trúc theo bảng sau:

Không được sử dụng

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

5. Công cụ hỗ trợ mô phỏng 3D 102

 5.2. Sử dụng thư viện OpenGLCtrl


 5.2.1. Lợi ích của thư viện này
 Khởi tạo môi trường OpenGL nhanh chóng và thuận lợi

 Hỗ trợ tương tác giao tiếp bằng chuột

 Đóng gói các hàm OpenGL theo các lớp quản lý các tác vụ riêng:

 COpenGLCtrl: quản lý môi trường giao diện OpenGL đưới dạng một điều
khiển (Control)

 Cấu trúc GL_MATERIAL và GL_LIGHT quản lý vật liệu và ánh sáng

 Cấu trúc STRUCT_OBJECTGLLIST quản lý đối tượng được vẽ bằng danh


sách hiển thị

 Hỗ trợ đọc tệp tin mô hình 3D với định dạng STL và hiển thị chúng
nhanh chóng.
 Chú ý: Đây là thư viện do Vũ Lê Huy xây dựng, do đó không có sẵn trong VC.

51
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

5. Công cụ hỗ trợ mô phỏng 3D 103

 5.2. Sử dụng thư viện OpenGLCtrl


 5.2.2. Đưa thư viện vào đề án
 Copy thư mục “OpenGLCtrl” vào thư mục của project đã tạo.

 Đưa file “OpenGLCtrl\bin\OpenGL.lib” hoặc “…\OpenGLd.lib” (tùy


theo chế độ biên dịch của đề án) vào đề án bằng chức năng “Add
Files to Project …”

 Trong file “stdafx.h” thêm dòng sau


 #include “OpenGLCtrl/Inc/OpenGLCtrl.h“

 Khai báo sử dụng điều khiển OpenGLCtrl trong khung View:


 Tạo một lớp kế thừa từ COpenGLCtrl, ví dụ tên lớp CMyOpenGLCtrl
 Thêm hàm void DrawInOpenGL() cho lớp vừa tạo, các lệnh vẽ trong
OpenGL sẽ được đặt trong hàm này.
 Thêm khai báo một đối tượng kiểu CMyOpenGLCtrl cho lớp CxxxView, ví
dụ: CMyOpenGLCtrl m_OpenGL;

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

5. Công cụ hỗ trợ mô phỏng 3D 104

 5.2. Sử dụng thư viện OpenGLCtrl


 5.2.3. Sử dụng đối tượng COpenGLCtrl
 Khởi tạo OpenGLCtrl trong khung View:
 Tạo hàm xử lý sự kiện OnCreate() bằng chức năng “Add Windows
Message Handle …”
 Thêm các lệnh khởi tạo sau:

 CRect rect;

 GetClientRect(rect); //lấy kích thước khung View để cài đặt cho OpenGLCtrl

 m_openGL.Create(rect, this, 100);

// khởi tạo OpenGLCtrl với kích thước khung View (tham số đầu tiên), cha
của cửa sổ OpenGLCtrl là khung View (tham số thứ 2) và chỉ danh (ID)
của cửa sổ OpenGLCtrl là 100 (tham số thứ 3).

 m_openGL.SetScaleWithClient(); //đặt tỉ lệ vẽ theo kích thước OpenGLCtrl

 m_openGL.SetMouseStyleDone(CMouseEvent::MOUSE_ROTATE);

// Đặt thao tác chuột trái mặc định ban đầu là quay mô hình.

52
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

5. Công cụ hỗ trợ mô phỏng 3D 105

 5.2. Sử dụng thư viện OpenGLCtrl


 5.2.3. Sử dụng đối tượng COpenGLCtrl
 Đặt lại kích thước khung OpenGLCtrl theo khung View:
 Thêm hàm xử lý sự kiện OnSize(UINT nType, int cx, int cy)
 Thêm các lệnh sau vào cuối hàm sự kiện này:

 CRect rect;

 GetClientRect(rect); //lấy kích thước khung View để cài đặt cho OpenGLCtrl

 m_openGL.MoveWindow(rect);

// đặt lại kích thước và vị trí của khung OpenGLCtrl theo kích thước khung
View hiện thời.

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

5. Công cụ hỗ trợ mô phỏng 3D 106

 5.2. Sử dụng thư viện OpenGLCtrl


 5.2.4. Sử dụng danh sách hiển thị và đọc tệp tin mô hình STL
 Trong lớp CMyOpenGLCtrl, tạo thêm biến (Số lượng biến này tùy
thuộc số danh sách hiển thị):
 STRUCT_OBJECTGLLIST m_objectDraw;
 Tạo một hàm LoadModel để thực hiện đọc và vẽ mô hình từ tệp tin
STL vào danh sách hiển thị:
 void CMyOpenGLCtrl::LoadModel(const CString &sfilename)
 {
 STLfile stlfile; //khai báo biến quản lý đọc tệp tin STL
 stlfile.ReadBinary(sfilename); //thực hiện đọc tệp tin nhị phân
 m_objectDraw.m_Max = stlfile.Max;
 m_objectDraw.m_Min = stlfile.Min;
 MakeCurrent(); //đặt môi trường OpenGL thành hiện hành để thực hiện
vẽ
 m_objectDraw.BeginNewList(); //bắt đầu một danh sách hiển thị
mới
 glPushMatrix();
 stlfile.Draw(); //vẽ mô
hình vào danh sách hiển thị
 glPopMatrix();
 m objectDraw EndNewList(); //kết thúc danh sách

53
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

5. Công cụ hỗ trợ mô phỏng 3D 107

 5.2. Sử dụng thư viện OpenGLCtrl


 5.2.4. Sử dụng danh sách hiển thị và đọc tệp tin mô hình STL
 Gọi mô hình đã được vẽ trong danh sách hiển thị vào hàm
DrawInOpenGL() của lớp CMyOpenGLCtrl:
 void CMyOpenGLCtrl::DrawInOpenGL()
 {
 //Một số lệnh đặt tham số môi trường vẽ
 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
 glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
 glShadeModel(GL_SMOOTH);
 glEnable(GL_NORMALIZE);

 //Thực hiện gọi và vẽ mô hình từ danh sách hiển thị


 double scale=10.0/m_objectDraw.GetSizeX();
 glPushMatrix();
 glScalef(scale,scale,scale); // đặt tỉ lệ mô hình cho vừa
khung OpenGL
 m_objectDraw.Draw(); // vẽ mô hình trong danh sách
hiển thị
 glPopMatrix();

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

5. Công cụ hỗ trợ mô phỏng 3D 108

 5.2. Sử dụng thư viện OpenGLCtrl


 5.2.4. Đặt vật liệu và chiếu sáng
 Trong thư viện OpenGLCtrl, vật liệu và chiếu sáng đã được đóng gói
vào các cấu trúc
 GL_MATERIAL
 GL_LIGHT

 Mỗi đối tượng được vẽ với STRUCT_OBJECTGLLIST đã có định nghĩa


sẵn một biến thành viên quản lý vật liệu của nó với tên biến là
STRUCT_OBJECTGLLIST ::m_glMaterial

 Các cấu trúc này có một số giá trị gán mặc định có thể được gọi
thông qua các phương thức:

 ::SetStyleDefault(int style); //đặt tham số lựa chọn bộ giá trị mặc


định

 ::Default(); //đặt các giá trị mặc định

54
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

5. Công cụ hỗ trợ mô phỏng 3D 109

 5.3. Sử dụng thư viện OpenGLSetting


 5.3.1. Nhiệm vụ của thư viện này
 Đặt vật liệu và chiếu sáng với nhiều tham số khá rắc rối, đặc biệt là
khi phải thiết đặt chúng một cách thủ công.

 Thư viện OpenGLSetting cho phép thiết đặt tham số vật liệu và ánh
sáng thông qua giao diện hộp thoại một cách tường minh.

 Trong thư viện này định nghĩa sẵn 2 hộp thoại:

 CDlgSettingLight - Hộp thoại thiết đặt tham số


ánh sáng

 CDlgSettingMaterial - Hộp thoại thiết đặt tham số vật liệu

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

5. Công cụ hỗ trợ mô phỏng 3D 110

 5.3. Sử dụng thư viện OpenGLSetting


 5.3.2. Đưa thư viện vào đề án
 Copy thư mục “OpenGLSetting” vào thư mục của project đã tạo.

 Đưa file“OpenGLSetting\bin\OpenGLSetting.lib”hoặc“OpenGLSettingd
.lib” (tùy theo chế độ biên dịch của đề án) vào đề án bằng chức
năng “Add Files to Project …”

 Trong file “stdafx.h” thêm dòng sau


 #include “OpenGLSetting/Inc/OpenGLSetting.h“

 Khai báo sử dụng hộp thoại thiết đặt ánh sáng:


 CDlgSettingLight dlg;
 dlg.SetData(m_glLight, &m_openGL);
 dlg.DoModal();

 Sử dụng hộp thoại đặt vật liệu CDlgSettingMaterial tương tự.

55
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

5. Công cụ hỗ trợ mô phỏng 3D 111

 5.4. Thực hiện mô phỏng chuyển động


 Sử dụng sự kiện thời gian
 Tạo chức năng Run() và khởi tạo sự kiện thời gian
 SetTimer(ID_TIMER_DEMO,100,0)
//tham số: Chỉ danh sự kiện, khoảng trễ (ms), con trỏ hàm xử lý sự kiện
(mặc định đặt là 0 thì sẽ dùng hàm OnTimer() mặc định)

 Tạo chức năng Stop() và hủy bỏ sự kiện thời gian


 KillTimer(ID_TIMER_DEMO);

 Thêm hàm xử lý sự kiện OnTimer(UINT nIDEvent), với tham


số là chỉ danh của sự kiện thời gian gọi đến hàm này (thường
được dùng khi một chương trình có nhiều sự kiện thời gian).
 Trong hàm OnTimer() thêm các tính toán di chuyển các mô hình
3D và cập nhật việc hiển thị mô hình:
 … //Thực hiện tính toán di chuyển vị trí mô hình 3D
 m_openGL.Invalidate(FALSE); //cập nhật hiển thị

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

6. Ví dụ - Chương trình RobotDemo 112

 6.1. Giới thiệu chương trình


 Giao diện chính:

56
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

6. Ví dụ - Chương trình RobotDemo 113

 6.1. Giới thiệu chương trình


 Đồ thị kết quả tính:

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

6. Ví dụ - Chương trình RobotDemo 114

 6.2. Các lớp trong chương trình


 Các lớp cơ bản được tạo bởi MFC:
 AboutDlg CMainFrame
 CRobotDemoApp CRobotDemoDoc CRobotDemoView

57
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

6. Ví dụ - Chương trình RobotDemo 115

 6.2. Các lớp trong chương trình


 Các lớp cơ bản được tạo bởi MFC:
 AboutDlg CMainFrame
 CRobotDemoApp CRobotDemoDoc CRobotDemoView
 Các lớp được tạo mới
 CDlgGraphs - Hộp thoại hiển thị các kết quả dạng đồ thị
 CDlgGraphTrajectory - Lớp hộp thoại kế thừa từ CDlgGraphs, hiển
thị đồ thị quỹ đạo X, Y và Z theo thời gian
 CDlgResultTable - Hộp thoại hiển thị kết quả dạng bảng số
 CDlgSelectElement - Hộp thoại lựa chọn khâu để đặt vật liệu
 CElement - Lớp quản lý một khâu
 CModel - Lớp quản lý mô hình rô bốt
 COpenGLCtrlDemo - Lớp kế thừa từ COpenGLCtrl, thực hiện
quản lý việc vẽ mô hình Rô bốt trên OpenGL
 CTrajectory - Lớp quản lý quỹ đạo nhập vào ban đầu

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

6. Ví dụ - Chương trình RobotDemo 116

 6.3. Lớp CElement


 Lớp này có nhiệm vụ quản lý một khâu, bao gồm mô hình 3D (m_glList), kích
thước chiều dài khâu (m_l), tọa độ gốc của khâu (m_OrgPosition), góc xoay
của khâu (m_angle)

58
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

6. Ví dụ - Chương trình RobotDemo 117

 6.4. Lớp CModel


 Lớp này có nhiệm vụ quản lý toàn bộ mô hình Rô bốt bao gồm các khâu
(m_listElement), quỹ đạo (m_trajectory), biến khớp (m_parameter), …

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

6. Ví dụ - Chương trình RobotDemo 118

 6.5. Một số điểm cần sửa đổi cho mô hình Rô bốt mới
 Cập nhật tệp tin STL cho mô hình Rô bốt mới, mỗi khâu đặt trong
một file với cú pháp:
 elementX.STL
 Với X là số thứ tự của khâu, khâu 0 là khâu đế
 Chú ý khai báo trong file “OpenGLCtrlDemo.cpp”:
 SUBDIRECTORY_MODEL_FILE
 EXTENT_MODEL_FILE

 Mô hình Rô bốt sẽ được tải vào bởi hàm COpenGLCtrlDemo::


CreateModel() được gọi đến trong CRobotDemoView::OnCreate()

Element2.STL Element1.STL

Element3.STL Element0.STL

59
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

6. Ví dụ - Chương trình RobotDemo 119

 6.5. Một số điểm cần sửa đổi cho mô hình Rô bốt mới
 Đặt lại kích thước các khâu trong hàm:
 void CModel::SetModelSize()
 {
 m_listElement[0].m_l=500;
 m_listElement[0].m_theta=90;
 m_listElement[1].m_l=500;
z
 m_listElement[2].m_l=500;
 m_listElement[3].m_l=100; P
 m_listElement[3].m_theta=-90;
 }
0 
 y
x

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

6. Ví dụ - Chương trình RobotDemo 120

 6.5. Một số điểm cần sửa đổi cho mô hình Rô bốt mới
 Đặt lại các tham số vị trí các khâu trong các hàm:
 Đặt lại góc xoay và vị trí các khâu mô hình cho bước chạy thứ
m_idStep trong hàm CModel::RunNext()
 void CModel::RunNext()

 {

 ...

 m_listElement[1].m_Angle[2]=m_parameter[0][m_idStep];

 m_listElement[2].m_Angle[2]=m_parameter[1][m_idStep]+m_parameter[0][m_
idStep];

 m_listElement[3].m_Translate[2]=m_parameter[2][m_idStep];

 UpdatePosition();

 }

60
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

6. Ví dụ - Chương trình RobotDemo 121

 6.5. Một số điểm cần sửa đổi cho mô hình Rô bốt mới
 Đặt lại các tham số vị trí các khâu trong các hàm:
 Đặt lại việc gán giá trị các biến khớp trong CModel::Solve()
 void CModel::Solve()

 {

 …

 x[0]=(m_listElement[1].m_Angle[2]-0.1)/scaleDegRad;

 x[1]=(m_listElement[2].m_Angle[2]+0.1)/scaleDegRad;

 x[2]=m_listElement[3].m_Translate[2]-0.1;

 …

 …

 m_idStep=preIdStep;

 }

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

6. Ví dụ - Chương trình RobotDemo 122

 6.5. Một số điểm cần sửa đổi cho mô hình Rô bốt mới
 Đặt lại các tham số vị trí các khâu trong các hàm:
 Đặt lại việc gán giá trị các biến khớp trong CModel::Solve()
 void CModel::Solve()
 {
 …
 for (i=0;i<m_trajectory[0].GetSize();i++)
 //vong lap thuc hien giai cac bai toan tren toan bo quy dao
 {
 m_idStep=i;
 //Giai bai toan vi tri
 if (Newton_Raphson(x,Func,eps,maxloop)==0)
 {
 x(0)=NormalAngleRad(x(0));
 x(1)=NormalAngleRad(x(1));
 if (x(0)>PI) x(0)-=2*PI;
 if (x(1)>PI) x(1)-=2*PI;
 m_parameter[0].Add(x(0)*scaleDegRad);
 m_parameter[1].Add(x(1)*scaleDegRad);
 m_parameter[2].Add(m_listElement[3].m_l-x[2]);
 }
 …
 …

61
3/20/2015

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

6. Ví dụ - Chương trình RobotDemo 123

 6.5. Một số điểm cần sửa đổi cho mô hình Rô bốt mới
 Đặt lại các tham số vị trí các khâu trong các hàm:
 Đặt lại việc gán giá trị các biến khớp trong CModel::Solve()
 …
 //Giai bai toan van toc
 GetMatrixVelocity(ma,vb,i);
 if (Gauss_Jordan(ma,vb,vt)==0)
 {
 m_velocity[0].Add(vt(0)*scaleDegRad);
 m_velocity[1].Add(vt(1)*scaleDegRad);
 m_velocity[2].Add(vt(2));
 }

 //Giai bai toan gia toc


 GetMatrixAcceleration(ma,vb,i);
 if (Gauss_Jordan(ma,vb,at)==0)
 {
 m_acceleration[0].Add(at(0)*scaleDegRad);
 m_acceleration[1].Add(at(1)*scaleDegRad);
 m_acceleration[2].Add(at(2));
 }
 }
 m_idStep=preIdStep;
 }

Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử

6. Ví dụ - Chương trình RobotDemo 124

 6.5. Một số điểm cần sửa đổi cho mô hình Rô bốt mới
 Sửa lại giá trị các phần tử của các ma trận trong các phương trình
vị trí, vận tốc và gia tốc ở trong các hàm:
 void CModel::Func(smatrix & a,vector & c,const vector & x)
 void CModel::GetMatrixVelocity(smatrix &m, vector &c, const int &
idStep)
 void CModel::GetMatrixAcceleration(smatrix &m, vector &c, const int
&idStep)

62

You might also like