Các vấn đề của Đồ họa máy tính 1. Đồ họa là gì? Các ứng dụng của đồ họa máy tính? 2.

Các công nghệ hiển thị? Tại sao các thuật toán dựa trên đường quét (scanline) lại phù hợp với kiến trúc phần cứng của máy tính hiện tại? Với các thuật toán vẽ đường thẳng trên kiến trúc phần cứng của máy tính hiện tại, chỉ loại đường thẳng nào được vẽ ra mới thực sự thẳng? Yếu điểm của thiết bị mành? 3. Trình bày thuật toán tô phủ loang? Nhược điểm của thuật toán. 4. Trình bày thuật toán tô phủ loang Smith? 5. Trình bày thuật toán Fishkin? 6. Định lý Jordan hay việc kiểm tra 1 điểm có thuộc miền trong đa giác hay không? 7. Thế nào là một đường thẳng lý tưởng? 8. Trình bày cách thể hiện đường thẳng dưới dạng tham số t. 9. Trình bày thuật toán vẽ đoạn thẳng DDA? 10. Trình bày thuật toán vẽ đoạn thẳng Bresenham? 11. Trình bày cách kiểm tra một điểm nằm ở phía nào đường thẳng? 12. Trình bày thuật toán vẽ đoạn thẳng điểm giữa? 13. Trình bày thuật toán vẽ đường tròn bằng thuật toán điểm giữa? 14. Các phép biến đổi? Trình bày phép tịnh tiến 2D, co giãn 2D theo gốc tọa độ, quay 2D quanh tâm? 15. Tọa độ đồng nhất? Tại sao người ta sử dụng tọa độ thuần nhất ? 16. Các phép biến đổi với tọa độ đồng nhất? 17. Kết hợp các phép biến đổi? 18. Trình bày phép kéo? 19. Biểu diễn ma trận của các phép biến đổi 3D? 20. Phép chiếu là gì? Phân loại phép chiếu? 21. Phép chiếu phối cảnh? Điểm biến mất? 22. Phép chiếu song song? 23. Các thuật toán xác định bề mặt hiện? 24. Thuật toán xác định mặt quay vào trong? 25. Thuật toán ưu tiên theo danh sách Schumacker? 26. Thuật toán sắp xếp theo chiều sâu Newell-Newell-Sancha. 27. Thuật toán BSP? 28. Thuật toán Warnock? 29. Thuật toán Weiler-Atherton? 30. Thuật toán bộ đệm Z? 31. Tại sao thuật toán bộ đệm Z lại thong dụng? 32. Mô hình ánh sáng ? Mô hình tạo bóng ? 33. Mô hình sáng cục bộ? 34. Mô hình sáng toàn cục? 35. Các mô hình tạo bóng? Trả lời:

Chƣơng 1: Giới thiệu
1. Đồ họa máy tính là Các ứng dụng của đồ họa máy tính là: Trong các giao diện người sử dụng trên màn hình máy tính. Vẽ biểu đồ trong kinh doanh, khoa học và công nghệ. Vẽ bản đồ. Trong y học: siêu âm, chiếu chụp,.. Mô phỏng và hoạt ảnh cho trực quan hóa khóa học.

-

Các hệ thống đa phương tiện, phim ảnh, truyền hình,.....

2. Các công nghệ hiển thị: có 2 công nghệ chính là: Các thiết bị hiển thị véc-tơ. Các thiết bị hiển thị mành. (Các thiết bị hiển thị tinh thể lỏng là mới được áp dụng gần đây.) Các thuật toán đường quét phù hợp với kiến trúc phần cứng của máy tính hiện tại vì một số ƣu điểm sau: Không tốn nhiều bộ nhớ. Khả năng tô phủ các vùng hiển thị với một màu hoặc một mẫu nhất định là tốt và giá thành thấp. Các loại đƣờng thẳng đƣợc vẽ ra thật sự thẳng là: các đường thẳng song song với trục tọa độ hay các đường thẳng có góc 45 độ so với trục tọa độ, Yếu điểm của thiết bị mành: Có sự rời rạc được tạo ra do cách biểu diễn thông qua điểm. Xảy ra hiện tượng lỗi lấy mẫu được gọi là răng cưa khi vẽ các đường thẳng, đa giác…độ chính xác phụ thuộc vào độ phân giải của thiết bị đầu ra.

Chƣơng 2: Các khái niệm cơ bản
2. Đoạn thẳng lý tƣởng là: Đoạn thẳng trông phải thẳng. Phải bắt đầu và kết thúc đúng điểm. Phải có mật độ điểm đều nhau. Phải có mật độ điểm không phụ thuộc vào độ dài và hệ số góc của đoạn thẳng. Phải được vẽ ra một cách nhanh chóng. 3. Các bƣớc xử lý đồ họa: Các thuật ngữ:

Các bƣớc xử lý luồng đồ họa 3D:

Các bƣớc xử lý đồ họa 2D:

Chƣơng 3: Các thuật toán mành hóa
5. Thuật toán tô phủ (Fill Problem) Bài toán tô phủ loang(Flood fill problem): Với hai màu khác nhau c và c’, một tập các điểm A có cùng màu c được bao quanh bởi các điểm có màu khác với c và c’, tìm thuật toán thay màu của tất cả các điểm thuộc A và chỉ các điểm này thành màu c’. Thuật toán tô phủ: void BFA(int x, int y){ if Inside(x, y) { Set(x,y) ; BFA(x, y-1) ; BFA(x, y+1); BFA(x-1, y) ; BFA(x+1, y); } } Thuật toán này dùng để tô phủ, với hàm Inside là để kiểm tra xem điểm (x,y) có thuộc vùng cần tô phủ không. Nếu (x,y) thuộc vùng tô phủ thì tô phủ nó và kiểm tra 4 điểm ở xung quanh nó. Nhược điểm của thuật toán này là phải dùng đến 4 lần gọi đệ quy. Cải tiến của thuật toán tô phủ đơn giản này là thuật toán tô phủ Smith với hai lần gọi đệ quy. // Các biến toàn cục Int x, y, lx, rx ; Fill (int seedx, int seedy){ x := seedx; y := seedy; if not (Inside(x, y)) then exit; // Nếu (x, y) không thuộc vùng tô phủ thì thoát push(x, y); // push (x,y) vào stack while StackNotEmpty() do { // đến khi stack còn không rỗng thì pop điểm (x,y) ra pop(x, y); if Inside(x, y) { // Nếu (x,y) thuộc vùng tô phủ FillRight(); FillLeft(); // Tô phủ các đoạn có chứa điểm

ScanHi(); ScanLo(); //Quét các đoạn trên và dưới đoạn hiện tại } } } FillRight(){ // Tô phủ các điểm bên phải điểm đang xét đến điểm phải nhất của đoạn int tx; tx := x; //Đi từ trái sang phải và thiết lập các điểm của đoạn trong khi đi While Inside(tx, y) and (tx < = XMAX) do Set(tx, y); tx := tx +1; } rx := tx -1; // Ghi lại chỉ số của điểm phải nhất trong đoạn } FillLeft(){ //Tô phủ các điểm bên trái điểm đang xét đến điểm trái nhất của đoạn int tx; tx := x; //Đi từ phải sang trái và thiết lập các điểm của đoạn trong khi đi While Inside(tx, y) and (tx >= XMIN) do { Set(tx, y); tx:= tx -1; } lx := tx +1; //Ghi lại chỉ số của điểm trái nhất trong đoạn } ScanHi(){//Quét các điểm giữa lx và rx trong dòng quét,Cho vào ngăn xếp đoạn trái nhất //trong các đoạn tìm thấy, không thiết lập bất cứ điểm nào trong giai đoạn này int tx; if y+1 > YMAX then exit; // nếu điểm đang xét vượt ra ngoài biên thì thoát tx := lx; //Đặt tx là bằng điểm trái nhất while tx <= rx do{ // Đi từ điểm trái nhất sang điểm phải nhất while( not Inside(tx, y+1) and (tx <= rx) )do tx := tx +1; //bỏ qua những điểm không thuộc vùng tô phủ if(tx <= rx){ push(tx, y+1); //Chỉ lưu điểm đầu tiên của đoạn while Inside(tx, y+1) and (tx <= rx) do tx := tx + 1; //Quét tất cả các điểm trong đoạn } } } ScanLo(){//Quét các điểm giữa lx và rx trong dòng quét,Cho vào ngăn xếp đoạn trái nhất //trong các đoạn tìm thấy, không thiết lập bất cứ điểm nào trong giai đoạn này int tx; if y -1 < YMIN then exit; // nếu điểm đang xét vượt ngoài biên dưới thì thoát tx := lx; //Đặt tx là bằng điểm trái nhất while tx <= rx do { // Đi từ điểm trái nhất sang điểm phải nhất while not Inside(tx, y-1) and (tx <= rx) do tx := tx +1; // Bỏ qua những điểm không thuộc vùng tô phủ

if(tx <= rx){ push(tx, y-1); //chỉ lưu điểm đầu tiên của đoạn while Inside(tx, y-1) and (tx <= rx) do tx:= tx + 1; } } } Ví dụ về thuật toán Smith:

6. Thuật toán vẽ đƣờng thẳng đơn giản - Dựa vào phương trình đường thẳng : y = mx + b - Ta có cách tiếp cận đơn giản là: tăng x rồi tính y - Đây là cách đơn giản nhất nhưng cũng bộc lộ các nhược điểm, đó là phải sử dụng các phép tính toán với số thực, và làm tròn tọa độ nên đô chính xác không cao. 7. Thuật toán vẽ đoạn thẳng DDA DDA – digital diferential analyzer (phân tích số hóa vi phân) - Xét đường thẳng theo phương trình tham số theo t đi qua 2 điểm (x1, y1) và (x2, y2) x(t) = x1 + t(x2 – x1) y(t) = y1 + t(y2 - y1) - Bắt đầu với t = 0. - Tại mỗi bước tăng t thêm một lượng dt - Chọn dt = max(|dx|, |dy|) - Ta có : xmới = xcũ + dx/dt ; ymới = ycũ + dy/dt ; *) Thuật toán :

line (int x1, int y1, int x2, int y2){ float x,y ; int dx = x2-x1 ; int dy = y2 – y1; int n = max(asb(dx), asb(dy)) ; float dt = n; float dxdt = dx/dt; float dydt = dy/dt; x = x1; y = y1; while(n--) // Vẽ các điểm cho hết { point(round(x), round(y)); // Vẽ các điểm (x,y) sau khi dã được làm tròn x += dxdt; y += dydt; } }

Trong thuật toán này thì x hoặc y luôn tăng lên 1 và vẫn phải dùng đến các phép cộng số thực và 2 phép làm tròn. Ví dụ: vẽ đoạn thẳng qua 2 điểm (1,2) và (6,5) dx = 6-1 = 5; dy = 5-2 = 3 n = max(5,3) = 5; dt = 5; dxdt = 5/5=1; Vẽ: x 1 2 3 y 2 2 3

dydt = 3/5 4 4 5 4 6 5

8. Thuật toán vẽ đoạn thẳng Bresenham - Giả sử đoạn thẳng đượcvẽ ởgóc phần tám thứ nhất thì x luôn tăng lên 1, ta chỉ cần tính y. - Giả thiết đoạn thẳng chúng ta cần vẽ là từ (0,0) đến (a,b) với a, b là số nguyên, và 0 <= b <= a (vì (a,b) nằm ở góc phần tám thứ nhất). Ta có: xi = xi-1 + 1 = i yi = yi-1 + b/a = i*b/a Ở đây chỉ cần làm tròn y tới số nguyên gần nhất Y bắt đầu với giá trị 0, vậy tới giá trị nào thì y bắt đầu tăng lên 1, ta phải so sánh y(hay là b/a, 2b/a, 3b/a….) với giá trị ½, đến khi nào y > ½ thì tăng y lên 1. Và y vẫn giữ nguyên giá trị 1 cho đến khi giá trị đó lớn hơn 3/2 …. Ta chọn giá trị ban đầu là d = 2b –a, sau mỗi lần thì cộng thêm 2b vào. Khi d >0 thì ta kiểm tra xem d có lớn hơn 2a, tiếp tục lấy d-2a, để kiểm tra xem d có lớn hơn 0 hay không. *) Thuật toán Bresenham(int a, int b){ // vẽ đoạn thẳng theo thuật toán Bresenham int d, x, y; d = 2b – a; x = 0; y=0; while true do { draw(x,y); // vẽ (x, y) if x = a then exit ; if (d >= 0) { y = y +1; // Nếu d > 0 thì tăng y lên 1 và tính d sau đó cập nhật lại d = d – 2a; }

x = x+1; // Tại mỗi bước ta đều tăng x lên 1 và tăng d lên 2b để kiểm tra d có lớn hơn 0 không d = d + 2b; } } Ví dụ : Vẽ đoạn thẳng đi qua 2 điểm (0,0) và (6,5) Ta có d = 2b – a = 2*5 – 6 = 4 x 0 1 2 3 4 5 6 y 0 1 2 3 3 4 5 d 4 2 0 -2 8 6 4

9. Kiểm tra một điểm nằm trên hay dƣới một đoạn thẳng Giả thiết L là một đoạn thẳng không thẳng đứng được định nghĩa bởi phương trình: F(x,y) = ax + by + c = 0 Với 0 <= a <= -b , đoạn thẳng này có hệ số góc từ 0 đến 1. Ta có một hệ quả quan trọng là F(x,y) > 0 với những điểm nằm trên đoạn thẳng và F(x,y) < 0 với những điểm nằm dưới đoạn thẳng. 10. Thuật toán vẽ đoạn thẳng điểm giữa Giả thiết L là một đoạn thẳng không thẳng đứng được định nghĩa bởi phương trình: F(x,y) = ax + by + c = 0 (1) Với 0 <= a <= -b , đoạn thẳng này có hệ số góc từ 0 đến 1. Ta có một hệ quả quan trọng là F(x,y) > 0 với những điểm nằm trên đoạn thẳng và F(x,y) < 0 với những điểm nằm dưới đoạn thẳng. Các điểm pi (xi, yi) được sinh ra có tính chất là tọa độ x luôn được tăng lên 1 mỗi lần: xi+1 = xi + 1; do đó chỉ cần tính yi Mặt khác ta có phương trình đt: y = mx + c (2) Trong đó m là hệ số góc của phương trình, ta có: m = dy / dx = (y2 – y1) / (x2 – x1); (3) Thay (3) vào (2) ta có: y = dy/dx * x + c (4)  - ydx + xdy +c = 0 (5) Đồng nhất thức (1) và (5) ta có : ax + by + c = 0 và xdy – ydx + c = 0 = > a = dy và b = -dx Ta có : D0 = F(x0,+1, y0 + 0,5) = F(x0, y0) + a + b/2 = F(x0, y0) + dy – dx/2 ; nhưng vì (x0, y0) nằm trên đoạn thẳng nên F(x0, y0) = 0 và D0 = dy – dx/2 ; Với di <= 0 ta có: Di = F(xi+2, yi + 0,5) = F(xi, yi) + a = di + dy ; Với di > 0 ta có: Di = F(xi+2, yi + 1,5) = F(xi, yi) + a + b = di + dy - dx ; Đại lượng ban đầu là d = dy – dx/2, vì không muốn làm phép chia nên ta nhân 2 với các đại lượng ta có: d = 2dy – dx; *) Thuật toán:

DrawLine(int x0, int y0, int x1, int y1){ Int x, y, dx, dy, d, posInc, negInc; dx = x1 – x0; dy = y1 – y0; d = 2dy – dx; posInc = 2dy; // Giá trị tăng them khi d <=0 negInc = 2(dy - dx); // Giá trị tăng them khi d >0 x = x0; y = y0; draw(x, y); while(x < x1) do { if(d <= 0) d = d + posInc; else{ d = d + negInc; y = y +1; } x = x + 1; Draw(x,y); } } Ví dụ : Vẽ đoạn thẳng qua 2 điểm (1,2) và (6,5) Ta có : dx = 6-1 = 5 và dy = 5-2 = 3 và d = 1 posInc = 6 và negInc = -4 x 1 2 3 4 5 6 y 2 3 3 4 4 5 d 1 -3 3 -1 5 1

11. Thuật toán vẽ đƣờng tròn điểm giữa Ta cũng sử dụng đại lượng quyết định để quyết định xem nên chọn điểm nào để vẽ : Phương trình đường tròn : f(x, y) = (x - xc)2 + (y - yc)2 – r2 ; Ta vẽ đường tròn trong đoạn có hệ số góc từ 0 đến -1, với x chạy từ 0 đến y ; với mỗi bước tiếp theo của (x, y) ta sẽ có điểm tiếp theo là (x+1, y) hay (x+1, y1) Kiểm tra : M nằm trong đường tròn(f < 0) chọn điểm tiếp theo là E M nằm ngoài (f>0) chọn điểm tiếp theo là SE SE được chọn nếu dmới = dcũ + (2xp - 2 yp +5) = dcũ + 2 ((x+1) – (y-1) +1) E được chọn nếu dmới = dcũ + (2xp +3) = dcũ + 2 (x+1) +1 D ban đầu bằng d0 = f(1, r-1/2) = 5/4 – r đặt P = D - 1/4 nên P0 = 1- r ; *) Thuật toán :

Chƣơng 4 : Các thuật toán cắt xén
Các thuật toán cắt xén chia làm hai loại : Cắt xén đoạn thẳng – thực hiện việc cắt các đoạn thẳng bằng một hình chữ nhật hoặc một đa giác lồi và cắt xén đa giác – cắt toàn bộ đa giác bằng một đa giác khác.Thuật toán Cohen-Sutherland là thuật toán dùng cách mã hóa các đầu đoạn thẳng. 12. Thuật toán cắt xén đoạn thẳng Cohen-Sutherland Bài toán : Cho một đoạn [P1, P2], phải cắt nó với một cửa sổ hình chữ nhật và trả về đoạn đƣợc cắt [Q1, Q2] hoặc trả về đoạn rỗng nếu đoạn [P1,P2] nằm hoàn toàn ngoài cửa sổ cắt. Bắt đầu bằng mã hóa chín khu vực phân chia bởi đường thẳng chứa các cạnh của cửa sổ bằng mã 4 bit. Nếu một điểm bất kỳ, c(P) = x3x2x1x0 với xi bằng 0 hoặc 1 theo mã này. 0110 0100 1100 0010 0000 1000 0011 0001 1001

Các bit xi có ý nghĩa như sau : x0 = 1 khi và chỉ khi P nằm hoàn toàn bên phải của đường biên phải. x1 = 1 khi và chỉ khi P nằm hoàn toàn bên trên của đường biên trên. x2 = 1 khi và chỉ khi P nằm hoàn toàn bên trái của đường biên trái. x3 = 1 khi và chỉ khi P nằm hoàn toàn bên dưới của đường biên dưới. *) Thuật toán có 3 bước như sau : Bƣớc 1 : Mã hóa P1 và P2. Đặt c1 = c(P1) và c2 = c(P2) Bƣớc 2 : Kiểm tra xem một đoạn có thể loại bỏ một cách dễ dàng bằng toán tử OR hay AND :

(a) c1 OR c2 = 0 hoặc (b) c1 AND c2 != 0 Trong trường hợp (a), đoạn đó nằm hoàn toàn trong cửa sổ vì cả hai đầu của đoạn nằm trong cửa sổ và cửa sổ là hình lồi. Trả về Q1 = P1, Q2 = P2 . Trong trường hợp (b), đoạn đó nằm hoàn toàn ngoài cửa sổ, vì cả hai đầu của đoạn nằm ở một nửa của mặt phẳng không chứa cửa sổ. Trả về đoạn rỗng. Bƣớc 3 : Nếu một đoạn không được loại bỏ một cách dễ dàng thì ta tiến hành chưa đoạn đó ra, sau đó lại quay lại với bước 1. (a) Trước hết, tìm điểm đầu mút P sẽ xác định đường sẽ sử dụng để cắt. Nếu c1 = 0000, thì P1 không cần clip và đặt P là P2 và Q là P1. Nếu c1 != 0000, thì đặt P là P1 và Q là P2. (b) Đường thẳng dùng để clip được xác định bằng bit bên trái nhất mà khác không trong c(P). (c) Lặp lại Bước 1-3 cho đoạn vừa cắt. Ví dụ : Ta có c(P1) = 0110 và c(P2) = 1001

Vì c(P1) và c(P2) không bị loại bỏ một cách đơn giản nên ta phải chia P1 P2 thành các đoạn. Ta có c(P1) = 0110 != 0 nên đặt P1 P2 thành P Q. Đoạn thẳng dùng để clip được xác định bằng bit trái nhất khác 0 trong c(P1) là bít x2, tức là đường biên trái. Vậy đường biên trái cắt P Q tại A(0010) Tiếp tục cắt thì ta có bit trái nhất của A ở đây là x1, tức là đường biên trên. Vậy đường biên trên cắt AQ tại B (0000). Tại B(0000) thì c(B) = 0000 nên ta đặt B là P2 và Q là P1. Làm tương tự ta có các điểm cắt C, D. Vậy sau khi cắt thì ta còn đoạn BD là nằm bên trong cửa sổ. Thuật toán cắt xén đa giác Sutherland-Hodgman Thực hiện bằng cách cắt toàn bộ đa giác với một cạnh của cửa sổ ( chính xác là bằng nửa mặt phẳng chứa đa giác xác định bởi cạnh của cửa sổ ) , sau đó cắt tiếp đa giác mới với cạnh tiếp theo , và tiếp tục đến khi đa giác được cắt hết bởi bốn cạnh của cửa sổ . Có 4 trường hợp tính số điểm giao của cạnh cửa số với đa giác (ko hiểu tại sao ở đây lại tính cả hướng ?)

Case 1 : toàn bộ tia AB là nằm trong cửa sổ -> lấy toàn bộ cạnh này Case 2 : lấy tia AB’ điểm kết quả là B’ Case 3 : toàn bộ tia AB nằm ngoài cửa sổ -> không có điểm kết quả Case 4 : lấy tia A’B điểm kết quả là A’,B CHƢƠNG 5 CÁC PHÉP CHIẾU VÀ BIẾN ĐỔI Các loại phép biến đổi Bảo tồn khoảng cách (Isometry) + Phản xạ + Quay + Tịnh tiến Bảo tồn góc (Similarity) + Co giãn đồng nhất Bảo tồn các đường thẳng song song (Affine) + Co giãn không đồng nhất Bảo tồn đường thẳng (Collineation) + Phép chiếu phối cảnh Không bảo tồn đường thẳng + Vặn + Biến hình Xét điểm P(x,y) thực hiện biến đổi để trở thành điểm P’(x’,y’) Tịnh tiến 2D 𝑥 𝑑𝑥 𝑥′ P= 𝑦 P’= T= 𝑑𝑦 𝑦′ Co giãn 2D theo gốc tọa độ 𝑠𝑥 S= 0 0 𝑠𝑦 P’= S * P tức 𝑠𝑥 𝑥′ = 0 𝑦′ 𝑥 0 ∗ 𝑦 𝑠𝑦 P’ = P + T

Quay 2D ngược chiều kim đồng hồ quanh tâm R= 𝑐𝑜𝑠𝛳 𝑠𝑖𝑛𝛳 −𝑠𝑖𝑛𝛳 𝑐𝑜𝑠𝛳 P’= R * P tức 𝑥′ 𝑐𝑜𝑠𝛳 = 𝑦′ 𝑠𝑖𝑛𝛳 𝑥 −𝑠𝑖𝑛𝛳 ∗ 𝑦 𝑐𝑜𝑠𝛳

Sử dụng tọa độ đồng nhất để kết hợp 3 phép biển đối trên lại cùng bằng phép nhân.2 tọa độ (x,y,W) và (x/W,y/W,1) thể hiện cùng một điểm. Phải có ít nhất 1 tọa độ khác 0 , (0,0,0) không xác định .Nếu W=0 , điểm đó ở vô cùng Phép tịnh tiến 2D trong tọa độ đồng nhất 1 T= 0 0 0 𝑑𝑥 1 𝑑𝑦 0 1

Phép co giãn 2D tại gốc tọa độ trong tọa độ đồng nhất 𝑠𝑥 S= 0 0 0 𝑠𝑦 0 0 0 1

Phép quay ngược chiều kim đồng hồ tại gốc tọa độ 2D trong tọa độ đồng nhất 𝑐𝑜𝑠𝛳 R = 𝑠𝑖𝑛𝛳 0 Phép kéo 2D trong tọa độ đồng nhất 1 𝑎 SHx = 0 1 0 0 1 SHy = 𝑏 0 0 0 1 đối với trục x −𝑠𝑖𝑛𝛳 𝑐𝑜𝑠𝛳 0 0 0 1

0 0 1 0 0 1

đối với trục y

Kết hợp các phép biến đổi 2D : Để quay 1 vật thể quanh điểm P1 ,sử dụng chuỗi 3 phép biến đổi cơ bản : Tịnh tiến sao cho P1 trùng gốc tọa độ - Quay – Tịnh tiến sao cho điểm gốc tọa độ trở về P1 Tịnh tiến 3D trong hệ tọa độ đồng nhất 1 0 T= 0 0 0 1 0 0 0 𝑑𝑥 0 𝑑𝑦 1 𝑑𝑧 0 1

Co giãn 3D tại gốc tọa độ trong hệ tọa độ đồng nhất 𝑠𝑥 0 S= 0 0 0 𝑠𝑦 0 0 0 0 𝑠𝑧 0 0 0 0 1

Quay 3D tại gốc tọa độ trong hệ tọa độ đồng nhất : cần xác định trục quay 𝑐𝑜𝑠𝛳

𝑠𝑖𝑛𝛳 Rz = 0 0 1 0 Ry = 0 0

−𝑠𝑖𝑛𝛳 𝑐𝑜𝑠𝛳 0 0

0 0 1 0

0 0 0 1 0 0 0 1 0 0 0 1

đối với trục z

0 𝑐𝑜𝑠𝛳 𝑠𝑖𝑛𝛳 0

0 −𝑠𝑖𝑛𝛳 𝑐𝑜𝑠𝛳 0 0 𝑠𝑖𝑛𝛳 1 0 0 𝑐𝑜𝑠𝛳 0 0

đối với trục y 𝑐𝑜𝑠𝛳

0 Rx = −𝑠𝑖𝑛𝛳 0

đối với trục x

PHÉP CHIẾU Phép chiếu của đối tượng 3D được xác định bởi các tia chiếu xuất phát từ tâm chiếu đi qua các điểm của đối tượng và giao với mặt phẳng chiếu . Nếu khoảng cách từ tâm chiếu đến mặt phẳng chiếu là hữu hạn thì phép chiếu là phối cảnh , nếu khoảng cách đó là vô hạn thì đó là phép chiếu song song. Phép chiếu phối cảnh có tâm ở vô cùng sẽ trở thành phép chiếu song song.

Khi xác định phép chiếu phối cảnh , phải xác định chính xác tâm chiếu . Khi xác định phép chiếu song song , phải xác định chính xác hướng chiếu. Phép chiếu phối cảnh có khuynh hướng cho ảnh giống thật , tuy nhiên nói chung là không bảo toàn được góc cũng như các đường thằng song song nên không để dùng để biểu diễn chính xác bề mặt hoặc kích thước đối tượng. Phép chiếu song song sử dụng để xác định chính xác kích thước và các đường thằng song song vì qua phép chiếu chúng vẫn song song với nhau , tuy nhiên nói chung các góc không được bảo toàn. a. Phép chiếu phối cảnh Phep chiếu phối cảnh được đặc trưng bởi định luật phối cảnh xa gần và điểm ảo (điểm biến mất). Phối cảnh xa gần chỉ ra rằng kích thước của hình chiếu sẽ nhỏ đi nếu khoảng cách từ tâm chiếu đến mặt phẳng chiếu tăng lên và ngược lại.

Tập các đường thẳng song song qua phép chiếu phối cảnh sẽ giao nhau ở một điểm .Các điểm này được gọi là điểm biến mất. Điểm ảo chính được xác định bởi giao của các đường thằng song song với một trong ba trục chính x,y,z. Các phép chiếu phối cảnh được phân loại theo số điểm ảo chính : 1 điểm , 2 điểm , 3 điểm .

Phép chiếu phối cảnh 2 chiều ( có 2 điểm ảo chính) b. Phép chiếu song song Phép chiếu trực giao đặc trưng bởi hướng chiếu vuông góc với mặt phẳng chiếu . Khi hướng chiếu song song với trục chính thì tạo ra các phép chiếu mặt bằng cạnh . Phép chiếu trực lượng là 1 trường hợp của trực giao khi mà hướng chiếu không song song với các trục chính . Phép chiếu khi mà hướng chiếu không vuông góc với mặt phẳng chiếu là phép chiếu xiên Phép chiếu song song được đặc trưng bởi vec-to hướng chiếu V và mặt phẳng quan sát . Mặt phẳng quan sát được xác định bởi điểm nhìn tham chiêu Ro và vec-to pháp tuyến N . Nếu V có cùng hướng với N (song song, cùng chiều) thì có phép trực giao , nếu không ta có phép chiếu xiên.

Trực giao (mặt bên) Phép chiếu trực giao có trục đo ( trực lượng ? ) sử dụng mặt phẳng chiếu không vuông góc với trục tọa độ , do đó có thẻ cho phép nhìn thấy nhiều mặt của vật thể cùng một lúc .Các đường song song được bảo toàn , tuy nhiên các góc thì không .

1. 2. 3. 4. 5. 6.

Phép chiếu phối cảnh Phép chiếu song song – trực giao – có trục đo – cùng kích thước Phép chiếu song song – trực giao – có trục đo Phép chiếu song song – trực giao – có trục đo Phép chiếu song song – xiên Phép chiếu song song – xiên

Phép chiếu cùng kích thước có véc-tơ pháp tuyến của mặt phẳng chiếu tạo với các trục tọa độ các góc bằng nhau. Chỉ có 8 hướng thỏa mãn điều kiện. Ảnh chiếu từng cặp tạo với nhau các góc 120 độ. c. Cơ sở toán học của các phép chiếu Điểm P trên đối tượng có tọa độ (x,y,z) ta cần xác định tọa độ điểm ảnh (x’,y’,z’) nằm trên mặt phẳng chiếu. Để đơn giản ta giả thiết mặt phẳng vuông góc với trục z. - Với phép chiếu phối cảnh , ta chiếu điểm P lên mặt phẳng chiếu đặt tại z=d và tâm chiếu đặt tại gốc tọa độ

x’=
Ma trận biến đổi 𝑑

∗𝑥 𝑧

= 𝑥

𝑧/𝑑

y’= 𝑑

∗𝑦 𝑧

= 𝑦

𝑧/𝑑

P = Mper * P

1 𝑥′ 0 𝑦′ = 0 𝑧′ 0 𝑊
z=0

0 1 0 0

0 0 1 1/𝑑

0 𝑥 0 𝑦 ∗ 0 𝑧 0 1

- Với một phép chiếu phối cảnh khác , ta đặt tâm chiếu trên tại z=-d , mặt phẳng chiếu tại

x’=
Ma trận biến đổi 𝑑

∗𝑥 𝑧

+𝑑

= 𝑧 𝑑 𝑥

+1

y’= 𝑑

∗𝑦 𝑧+𝑑

= 𝑧 𝑑 𝑦

+1

P = Mper * P

1 𝑥′ 0 𝑦′ = 0 𝑧′ 0 𝑊

0 1 0 0

0 0 0 1/𝑑

0 𝑥 0 𝑦 ∗ 0 𝑧 1 1

Công thức này cho phép d tiến tới vô cùng để trở thành phép chiếu song song - Phép chiếu song song lên mặt phẳng chiếu z=0 với hướng chiếu trùng với véc-tơ Oz Tọa độ điểm P’(x’,y’,z’) x’=x ; y’=y ; z=0 ; Ma trận biến đổi 𝑥

′ 1 𝑦′ 0 = 0 𝑧′ 0 𝑊

0 1 0 0

0 0 0 0 𝑥

0 𝑦 0 ∗ 𝑧 0 1 1

CHƢƠNG 6 MÔ HÌNH HÓA ĐỐI TƢỢNG Có hai nhiệm vụ chính trong việc tạo ra bức ảnh của một cảnh ba chiều đó là mô hình hóa và kết xuất . Mô hình hóa phải ra tạo ra được các mô hình mô tả chính xác được hình dạng và diện mạo của đối tượng . Kết xuất đồ họa , lấy các mô hình làm đầu vào và tạo ra các giá trị điểm ảnh cuối cùng . Cấu trúc mành của các thiết bị hiển thị , thuật toán dựa trên đường quét hoạt động hiệu quả với các điểm , cạnh , đa giác . Vì thế , phương pháp hiệu quả nhất hiện nay trong việc mô hình hóa là mô hình hóa bằng đa giác . Ưu điểm chính của phương pháp này là có khả năng xử lý dễ và nhanh . Nếu trong các thể hiện bằng đa giác , mà chỉ quan tâm đến các cạnh mà không quan tâm đến các mặt thì đó là mô hình khung lưới . Ưu điểm của mô hình khung lưới là đơn giản , nhanh chóng , dễ dàng hình dung kết cấu nhưng lại không cho phép người dùng hình dung toàn bộ chi tiết của vật thể . Khi một vật thể được mô hình hóa bằng đa giác , phải đảm bảo các đa giác liền kề nhau thì chung cạnh , các cạnh chung đỉnh thì phải có tọa độ định giống nhau . Vì thế , người ta sử dụng kiểu cấu trúc dữ liệu con trỏ , trong đó con trỏ lưu trừ giá trị các đỉnh , trỏ đến danh sách các cạnh , các cạnh trỏ đến các điểm.

Tạo lưới là quá trình phân tách một bề mặt phức tạp , các đa giác nhiều cạnh thành các đối tượng đơn giản hơn như tam giác , tức giác. Trong đó tam giác là phù hợp nhất vì nằm trên một mặt phẳng , có thể dễ dàng mành hóa .Các đa giác thường được chuyển thành các quạt tam giác bằng cách giữ một đỉnh làm đỉnh chung của mọi tam giác, dùng đỉnh đó là 2 đỉnh tiếp theo tạo thành một tam giác. Tách đa giác thành các tam giác : dùng cách kiểm tra điểm nằm ở mặt phẳng nào , có thể tách đa giác thành các tam giác . Nếu mọi điểm nằm ngoài tam giác -> lưu lại tam giác , bỏ đỉnh đó và tiếp tục với đỉnh trái nhất tiếp theo . Nếu có một đỉnh nằm trong , tạo nên một tam giác mới với điểm nằm trong trái nhất .

CHƢƠNG 7 XÁC ĐỊNH CÁC BỀ MẶT HIỆN Để tiết kiệm thời gian và bộ nhớ , chúng ta cần loại các thành phần không đóng góp vào bức ảnh cuối cùng . Một đối tượng có thể không hữu hình vì 3 lý do : - Nằm ngoài vùng hiển thị - Quay vào trong - Bị che bởi các đối tượng khác gần người quan sát hơn. Có 3 dạng của thuật toán xác định mặt hiện : - Chính xác theo đối tượng - Chính xác theo ảnh - Ưu tiên theo danh sách a. Trước tiên , thực hiện bước tiền xử lý là loại bỏ mặt quay vào trong

V : véc-to hướng nhìn . N véc tơ pháp tuyến của cạnh đa giác V*N >0 : mặt sau (mặt quay vào trong) V*N <0 : mặt trước V*N =0 : song song với hướng nhìn b. Thuật toán ưu tiên theo danh sách Schumacker - Gán thứ tự ưu tiên cho các mặt - Xác định điểm nhìn - Loại bỏ mặt quay vào trong Vấn đề của thuật toán là xác định thứ tự - vì thế không phải lúc nào cũng thực hiện được c.Thuật toán BSP tree BSP nguyên bản có 2 bước : + Tiền xử lý chuyển danh sách đa giác đầu vào sang dạng cấu trúc cây nhị phân gọi là cây BSP. + Thuật toán duyệt sẽ duyệt qua cây BSP và vẽ các đa giác ra bộ đệm khung theo thứ tự từ sau ra trước. Xây dựng cây BSP : - Chọn đa giác bất kỳ P và đặt vào gốc - Kiểm tra các đa giác còn lại , nếu nằm cùng phía với điểm nhìn , gán chúng vào cành bên trái . Nếu nằm khác phía với điểm nhìn , gán chúng vào cành bên phải . Nếu đa giác giao với mặt phẳng chứa P thì cắt ra làm đôi và gắn mỗi nửa đa giác vào cành con - Lặp lại với các cành con

Duyệt cây đa giác và vẽ đa giác ra bộ đệm Show BSP(v,T){ if T is empty then return; P:= root of T if viewer is in front of P { show BSP (back subtree of T) draw P show BSP (front subtree of T) } else { show BSP (front subtree of T) draw P show BSP (back subtree of T) } } Ở đây ta đang xét hướng nhìn là phía trước của P nên ta cần quan tâm đến biểu thức trong if
Điểm nhìn 1

1a 4 1b 5a 5

2

5b 3 3a 3b

Chọn 4 là gốc , duyệt cây theo thứ tự sau
4

1a

1b

5a

5b

3a

3b

2

Thứ tự vẽ đa giác : 3b -> 5b -> 3a -> 2 -> 1b -> 5a -> 4 -> 1a (Tại sao lại này thì đi mà hỏi cái thằng nghĩ ra cái thuật toán) Các loại bề mặt hiện khác – ông nào giỏi thì tự đi mà học . Hiểu được chết liền . ĐƢỜNG CONG Mục đính của các thuật toán là vẽ các đường cong thõa mãn một số ràng buộc trong đó quan trọng là ràng buộc nội suy , ràng buộc độ trơn tức là g(xj) = f(xj) tại một số điểm xj cố định và đạo hàm của g và f bằng nhau tại xj Nội suy Hermite Ta xây dựng đường cong bậc ba f(t) = 𝑎𝑡 3 + 𝑏𝑡 2 + 𝑐𝑡 + 𝑑 đi qua 2 điểm P0 x0 , P1 x1 và có đạo hàm tại 2 điểm P0 P1 là x’0 ,x’1 Đưa f(t) về dạng ma trận 𝑎 𝑏 F(t) = 𝑡 3 𝑡 2 𝑡 1 * 𝑐 𝑑 F’(t) = 3𝑎𝑡 2 + 2𝑏𝑡 + 𝑐 Với t=0 -> Với t=1 -> x0=f(0) = d x1=f(1) = a + b + c + d x’0=f’(0) = c ; x’1=f’(1) = 3a + 2b +c ;

Ta có phép nhân ma trận 0 1 0 3 0 1 0 2 0 1 1 1 𝑥0 𝑎 1 𝑥1 𝑏 1 * = 𝑥′ 𝑐 0 0 𝑑 𝑥′1 0

Ta xây dựng ma trận Hermit Mh bằng cách nghịch đảo ma trận ở trên 2 −2 1 1 −3 3 −2 −1 Mh = 0 0 1 0 1 0 0 0 Ta có phương trình tính đường cong bậc ba ở trên F(t) = tT * Mh * Gh = 𝑡 3 𝑡 2 𝑡 𝑥0 2 −2 1 1 𝑥1 −3 3 −2 −1 ∗ 𝑥′ 1 * 0 0 1 0 0 𝑥′1 1 0 0 0

Các hàm cơ sở của phép nội suy Hermit được suy ra bằng cách nhân ma trân tT với ma trận Hermit F(1) = 2𝑡 3 − 3𝑡 2 + 1 F(2) = −2𝑡 3 + 3𝑡 2 F(3) = 𝑡 3 − 2𝑡 2 + 𝑡 F(4) = 𝑡 3 − 𝑡 2 Đường cong Bezier Ta vẽ đường cong đi qua 2 điểm P0 , P1 và 2 điểm nằm trên đường tiếp tuyến đi qua P0 , P1 là P2 và P3 . Hai điểm này được gọi là điểm điều khiển . F(t) = tT * Mh * Gh = tT * Mh * Mhb * Gb 𝑥0 𝑥1 Trong đó Gh = 𝑥′ 0 𝑥′1 𝑥0 𝑥2 Gb = 𝑥 3 𝑥1

Gh = Mhb * Gb

Ta có x’0 và x’1 là hệ số góc của tiếp tuyến tại điểm P0 và P1 . Vì thế 𝑥 ′ 0 = 𝛼 ∗ 𝑥2 − 𝑥0 ; 𝑥 ′ 1 = 𝛽 ∗ 𝑥1 − 𝑥3 Do P2 , P3 là 2 điểm tùy ý chạy trên tiếp tuyến nên ta có thể chọn alpha , beta tùy ý Do trong sách chọn 𝛼 = 3 𝑣𝑠 𝛽 = 3 nên tao cũng thế. Ta có 1 0 Mhb = −3 0 0 0 3 0 0 0 0 −3 0 1 0 3

Nhân ma trận Hermit Mh với ma trân Mhb ta được ma trận Bezier −1 3 −3 1 3 −6 3 0 = −3 3 0 0 1 0 0 0

Mb = Mh * Mhb

Tương tự Hermit , các hàm cơ sở của Bezier được suy ra bằng cách nhân ma trận Bezier với ma trận tT. CHƢƠNG 9: ÁNH SÁNG Các mô hình sáng là các luật đơn giản về tương tác giữa vật thể và ánh sáng. Mô hình tạo bóng là để thiết lập màu sắc và cường độ sáng tại tất cả các điểm trên bề mặt. Mô hình sáng cục bộ: Mô hình sáng cục bộ là mộ hình sáng trực tiếp từ một nguồn sáng hữu hình. Nó bỏ qua sự phản quang giữa đối tượng và bỏ qua sự truyền ánh sáng trong môi trường. Mô hình sáng cục bộ dựa trên lý thuyết tia, coi ánh sáng phản quang có 3 thành phần: thành phần môi trường(ambient), thành phần khuếch tán(diffuse) và thành phần phản xạ(specular).

Ánh sáng môi trường là một thiết lập ánh sáng có cường độ không đổi trong một cảnh vật. Ánh sáng môi trường là một kiểu mô hình tự phát sáng để bắt chước sự phản quang giữa vật thể. Thành phần ánh sáng môi trường có dạng: 𝑰𝒂 (𝝀) 𝒌𝒂 (𝝀) trong đó 𝑰𝒂 (𝝀) cường độ ánh sáng môi trường với bước sóng 𝝀 và 𝒌𝒂 (𝝀) 𝝐 [0, 1] là hệ số phản quang của môi trường Thành phần ánh sáng khuếch tán có dạng : 𝑰𝒅 (𝝀) 𝒌𝒅 (𝝀) 𝒓𝒅 trong đó 𝑰𝒅 (𝝀) cường độ nguồn sáng đến điểm p và 𝒌𝒅 (𝝀) 𝝐 [0, 1] là hệ số phản quang khuếch tán của môi trường và 𝒓𝒅 là hệ số khuếch tán. Thành phần phản chiếu có dạng : 𝑰𝒑 (𝝀) 𝒌𝒔 𝒓𝒔 Trong đó 𝒓𝒔 là hệ số phản chiếu và 𝒌𝒔 là hệ số phản chiếu , là một hàm của góc theeta, nhưng thường được đặt từ 0 đến 1. a) Mô hình sáng Bouknight: là mô hình sáng chỉ quan tâm đến ánh sáng môi trường và ánh sáng khuếch tán. I(𝝀) = 𝑰𝒂 (𝝀) 𝒌𝒂 (𝝀) + 𝑰𝒅 (𝝀) 𝒌𝒅 (𝝀) 𝒓𝒅 b) Mô hình phản chiếu Phong: là mô hình sáng quan tâm đến cả ánh sáng môi trường, ánh sáng khuếch tán và ánh sáng phản chiếu. I(𝝀) = 𝑰𝒂 (𝝀) 𝒌𝒂 (𝝀) + 𝑰𝒅 (𝝀)( 𝒌𝒅 (𝝀) 𝒓𝒅 + 𝒌𝒔 𝒓𝒔 ) Mô hình sáng toàn cục: Mô hình truyền ánh sáng toàn cục tính đến sự truyền ánh sáng gián tiếp có phản quang trong cảnh vật. Các mô hình tạo bóng: Trong đó chủ yếu xét tạo bóng Gouraud và tạo bóng Phong. a) Tạo bóng Gouraud: là sự mô phỏng các bề mặt nhẵn và mờ. Đặc điểm là tính vectơ pháp tuyến ở các đỉnh, tiếp theo tính cường độ của mỗi đỉnh đa giác và sau đó nội suy ra toàn bộ đa giác. Đặc trưng của mô hình tạo bóng Gouraud là chỉ quan tâm tới giá trị độ sáng tại một điểm A mà không quan tâm đến vecto pháp tuyến tại A.(nội suy cường độ ánh sáng tại mỗi đỉnh của đa giác)

Ví dụ:giả sử đã biết độ sáng tại I1, I2, I3, ta tính độ sáng tại điểm I theo thuật toán dòng quét. Ta tính độ sáng tại điểm A, B bằng nội suy tuyến tính các giá trị độ sáng tại I1-I3 và I2-I3. Giả sử tỷ lệ khoảng cách giữa các đỉnh được quy định như hình vẽ. Ta tính được độ sáng: Tại A: 𝐼𝑎 = α 𝐼1 + (1- α) 𝐼3 Tại B: 𝐼𝑏 = β 𝐼2 + (1- β) 𝐼3 Vậy tại I ta tính được độ sáng: I = φ 𝐼𝑎 + (1- φ) 𝐼𝑏 = φα𝐼1 + (β - φβ) 𝐼2 + (φβ – φα - β) 𝐼3 + 1 b) Tạo bóng Phong: là sự mô phỏng các bề mặt bóng Đặc điểm là tính vecto pháp tuyến tại tất cả các điểm (còn gọi là tạo bóng nội suy vecto pháp tuyến). Đặc trưng của mô hình tạo bóng Phong là quan tâm tới giá trị độ sáng tại một điểm A và cả đến vecto pháp tuyến tại A.

Tương tự như trên ta tính được độ sáng tại điểm I.