Tải bản đầy đủ (.pdf) (23 trang)

Đề cương ôn tập Đồ họa máy tính

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.16 MB, 23 trang )

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

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’=
T=
𝑑𝑦
𝑦′

P’ = P + T

Co giãn 2D theo gốc tọa độ
𝑠𝑥
S= 0


0
𝑠𝑦

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
𝑠𝑥
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

−𝑠𝑖𝑛𝛳
𝑐𝑜𝑠𝛳
0

0
0
1

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
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

𝑐𝑜𝑠𝛳
0
Rx =
−𝑠𝑖𝑛𝛳
0

0
0
1
0

0
0
0
1


đối với trục z

0
−𝑠𝑖𝑛𝛳
𝑐𝑜𝑠𝛳
0

0
0
0
1

đối với trục y

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

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’=

𝑧/𝑑

𝑑∗𝑦
𝑧

=

𝑦
𝑧/𝑑

P = Mper * P


1
𝑥′
0
𝑦′
=
0
𝑧′
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
z=0

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

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(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 ->

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

𝑥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
0
0
0
1


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

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
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.



×