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 ng thẳng trên k iến trúc phần c ứng của máy tính hiện t ại, chỉ loại đườ ng 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 ng thẳng lý tưở ng? ng? 8. Trình bày cách thể hiện đườ ng 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? phía nào đườ ng 11. Trình bày cách kiểm tra một điểm nằm ở phía 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? -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: i:
Chƣơng 1: Giớ i thiệu 1. Đồ họa máy tính là Các ứ ng 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 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 ng thẳng đƣợ c v ẽ ra thật s ự thẳng là: các đườ ng ng thẳng song song v ớ i trục tọa độ hay các đườ ng 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 ng lỗi lấy mẫu đượ c gọi là răng cưa khi vẽ các đườ ng ng thẳng, đa giác…độ chính xác phụ thuộc vào độ phân độ 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ý ử lý đồ họa:
Các thuật ngữ:
Các bƣớ c xử lý ử 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); (x,y) thuộc vùng tô phủ if Inside(x, y) { // N ếu 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 tron g đ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, y ) i + a = d i + dy ; Vớ i di > 0 ta có: Di = F(xi+2, yi + 1,5) = F(xi, y i) + a + b = d i + 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
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 ; 11.
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
0010
0011
0100
0000
0001
1100
1000
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=
Co giãn 2D theo gốc tọa độ
S=
0
0
P’ = P + T
T=
P’= S * P tứ c
′′ ∗ ′′ − ∗ =
0
0
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 0
S= 0 0
0 0 1
0
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
0 0 1
0
Phép kéo 2D trong tọa độ đồng nhất
1 SHx = 0 0 1
SHy =
0
1 0
0 0 1
đối vớ i trục x
0 1 0
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
Rx =
0 0
0
0
0
0 0
0 0 1 0
0
0 1 0 0
0 0
0 0 0 1
đối vớ i trục z
0 0 0 1
đối vớ i trục y
0 0 0 1
đố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’=
/
1 0 = 0 0
0 1 0 0
0 0 1 1/
=
/
∗
P = Mper * P
′′ ′
∗
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
∗
z=0
x’= Ma trận biến đổi
+
=
+1
P = Mper * P
′′ ′ 1 0 = 0 0
0 1 0 0
0 0 0 1/
y’=
∗ +
=
+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
5
1b 5a
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
2
3b
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(x j) = f(x j) tại một số điểm x j cố định
và đạo hàm của g và f bằng nhau tại x j N ội suy Hermite
Ta xây dựng đườ ng cong bậc ba f(t) = 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
F’(t) = 3
2
2
Vớ i t=0 -> Vớ i t=1 ->
3
+
2
+
+
đi qua 2 điểm P0 x0 , P1 x1
1 *
+2
+
x’0=f’(0) = c ; x’1=f’(1) = 3a + 2b +c ;
x0=f(0) = d x1=f(1) = a + b + c + d
Ta có phép nhân ma trận
′′ − − − − 0 1 0 3
0 1 0 2
0 1 1 1
1 1 * 0 0
0
=
1
0 1
Ta xây dựng ma tr ận Hermit Mh bằng cách nghịch đảo ma trận ở trên
Mh =
2 3 0 1
2 3 0 0
1 2 1 0
Ta có phương trình tính đườ ng cong bậc ba ở trên
− − − − ∗ ′′ T
F(t) = t * Mh * Gh =
3
2
1 *
2 3 0 1
2 3 0 0
1 2 1 0
1 1 0 0
0 1
0
1
1 1 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 3 2+ 1 F(1) = 2 3 F(2) = 2 3 + 3 2 2 2+ F(3) = 3 2 F(4) = 3
Đườ 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 . T
T
F(t) = t * Mh * Gh = t * Mh * Mhb * Gb
′′ ′ ∗ − ′ ∗ − − − − − − − 0
Trong đó Gh =
0
1
Gb =
0
2
Gh = Mhb * Gb
3
1
1
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ế = 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ó 0
Mhb =
1 0 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
Mb = Mh * Mhb =
1 3 3 1
3 6 3 0
3 3 0 0
1 0 0 0
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 T. vớ i ma trận t
CHƢƠNG 9: ÁNH SÁNG
CácMô hìmônhhìtạnh sáóngng llàà cácđể luậtế đơnập màugiả sắềtc vàươngcườngtácđộsgiữ ángậ tạ ểvàấ ánhảcácsáđing.ểm trên bề ặ nv
ob
thi t l
a v t th i t t c
m t.
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 là hệ số khuếch tán. khuếch tán của môi trường và Thành phầ n phả n chiếu có dạ ng : ( ) 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, Trong đó 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 k huế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.