You are on page 1of 19

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; dydt = 3/5
Vẽ:
x 1 2 3 4 5 6
y 2 2 3 4 4 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 y d
0 0 4
1 1 2
2 2 0
3 3 -2
4 3 8
5 4 6
6 5 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 y d
1 2 1
2 3 -3
3 3 3
4 4 -1
5 4 5
6 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, y-1)
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ổ.

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

𝑠𝑥 0 𝑥′ 𝑠𝑥 0 𝑥
S= 0 𝑠𝑦 P’= S * P tức = 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 0 𝑑𝑥
T= 0 1 𝑑𝑦
0 0 1

Phép co giãn 2D tại gốc tọa độ trong tọa độ đồng nhất

𝑠𝑥 0 0
S= 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

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

Phép kéo 2D trong tọa độ đồng nhất

1 𝑎 0
SHx = 0 1 0 đối với trục x
0 0 1
1 0 0
SHy = 𝑏 1 0 đối với trục y
0 0 1
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 0 𝑑𝑥
0 1 0 𝑑𝑦
T=
0 0 1 𝑑𝑧
0 0 0 1

Co giãn 3D tại gốc tọa độ trong hệ tọa độ đồng nhất

𝑠𝑥 0 0 0
0 𝑠𝑦 0 0
S=
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

𝑐𝑜𝑠𝛳 −𝑠𝑖𝑛𝛳 0 0
𝑠𝑖𝑛𝛳 𝑐𝑜𝑠𝛳 0 0
Rz = đối với trục z
0 0 1 0
0 0 0 1

1 0 0 0
0 𝑐𝑜𝑠𝛳 −𝑠𝑖𝑛𝛳 0
Ry = đối với trục y
0 𝑠𝑖𝑛𝛳 𝑐𝑜𝑠𝛳 0
0 0 0 1

𝑐𝑜𝑠𝛳 0 𝑠𝑖𝑛𝛳 0
0 1 0 0
Rx = đối với trục x
−𝑠𝑖𝑛𝛳 0 𝑐𝑜𝑠𝛳 0
0 0 0 1

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. Phép chiếu phối cảnh


2. Phép chiếu song song – trực giao – có trục đo – cùng kích thước
3. Phép chiếu song song – trực giao – có trục đo
4. Phép chiếu song song – trực giao – có trục đo
5. Phép chiếu song song – xiên
6. 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’= = y’= =
𝑧 𝑧/𝑑 𝑧 𝑧/𝑑

Ma trận biến đổi P = Mper * P

𝑥′ 1 0 0 0 𝑥
𝑦′ 0 1 0 0 𝑦
= ∗
𝑧′ 0 0 1 0 𝑧
𝑊 0 0 1/𝑑 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’= =𝑧 y’= =𝑧
𝑧+𝑑 +1 𝑧+𝑑 +1
𝑑 𝑑
Ma trận biến đổi P = Mper * P

𝑥′ 1 0 0 0 𝑥
𝑦′ 0 1 0 0 𝑦
= ∗
𝑧′ 0 0 0 0 𝑧
𝑊 0 0 1/𝑑 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 sắp xếp theo chiều sâu Newell-Newell-Sancha
Sắp xếp các đối tượng theo chiều sâu dựa trên giá trị z.

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

1a 1b

5a 5b

3a 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)

You might also like