Giáo trình Đồ họa máy tính - Chương 5, Phần 2: Giới thiệu đồ họa ba chiều

CHƯƠNG 5  
GIỚI THIỆU ĐỒ HỌA BA CHIỀU  
Các đối tượng trong thế giới thực phần lớn là các đối tượng ba chiều, nên việc thể hiện  
các đối tượng ba chiều trên máy tính là một công việc hết sức cần thiết để đưa tin học gần  
gũi với thực tế hơn. Cũng giống như các cách biểu diễn các đối tượng ba chiều trên mặt  
phẳng khác (như của máy ảnh, camera, ... ), biểu diễn bằng máy tính cũng phải tuân theo  
các quy luật về phối cảnh, sáng, tối, ... nhằm giúp người xem có thể tưởng tượng lại hình  
ảnh một cách gần đúng nhất. Ngoài ra biểu diễn trên máy tính có ưu thế giúp ta có thể  
quan sát đối tượng ở nhiều góc cạnh khác nhau, các khoảng cách khác nhau.  
Chương này sẽ giới thiệu một số kĩ thuật biểu diễn các đối tượng ba chiều trên máy tính,  
từ các đối tượng đơn giản như các hình khối, các đa diện, ... đến các đối tượng tương đối  
phức tạp như các mặt đã được tìm hiểu ở các chương trước.  
1. TỔNG QUAN VỀ ĐỒ HỌA BA CHIỀU  
Khi chúng ta mô hình hóa và hiển thị một cảnh ba chiều, ta cần phải xem xét rất nhiều  
khía cạnh vấn đề khác nhau chứ không đơn giản là thêm vào tọa độ thứ ba cho các đối  
tượng. Bề mặt đối tượng thể xây dựng bởi nhiều tổ hợp khác nhau của các mặt phẳng  
và các mặt cong. Ngoài ra, đôi khi chúng ta cũng cần tả một số thông tin về bên trong  
các đối tượng. Các công cụ hỗ trợ đồ họa (graphics package) thường cung cấp một số  
hàm hiển thị các thành phần bên trong, những đường nét tiêu biểu hoặc hiển thị một phần  
của đối tượng ba chiều (solid object). Ngoài ra, các phép biến đổi hình học thường được  
sử dụng nhiều hơn và đa dạng hơn trong đồ họa ba chiều so với trong đồ họa hai chiều.  
Phép biến đổi hệ quan sát trong không gian ba chiều phức tạp hơn nhiều so với trong  
không gian hai chiều do chúng ta phải chọn lựa nhiều tham số hơn khi mô tả một cảnh ba  
chiều sẽ xuất hiện trên màn hình như thế nào.  
Hình 5.1 Một cảnh đồ họa ba chiều  
Các mô tả về một cảnh ba chiều phải đi qua một quy trình xử gồm nhiều công đoạn như phép biến  
đổi hệ tọa đquan sát và phép chiếu chuyển cảnh từ hệ tọa độ quan sát ba chiều xuống hệ tọa độ thiết bị hai  
chiều. Những phần nhìn thấy được của cảnh, ứng với một hệ quan sát được chọn nào đó, phải được xác  
định cuối cùng, các thuật toán vẽ mặt sẽ được áp dụng nhằm tạo ra hình ảnh trung thực (gần với thực tế)  
của cảnh.  
1.1. Sơ lược về quy trình hiển thị  
Quy trình xử lí thông tin trong đồ họa ba chiều một chuỗi các bước nối tiếp nhau, kết  
quả của mỗi bước sẽ đầu vào của bước tiếp theo.  
Hình 5.2 – Quy trình hiển thị đối tượng ba chiều  
Quy trình bắt đầu bằng việc xây dựng các mô hình đối tượng. Các mô hình này thường  
được tả trong không gian ba chiều (x,y,z). Các mô hình thường thể hiện vật thể  
(solid) hoặc bề mặt (boundaries) của đối tượng. Như vậy ta có hai kiểu mô hình hóa.  
Trong solid modeling các đối tượng đồ họa cơ sở thường được dùng để tả các đối  
tượng thể tích (volume). Trong boundary representations(B-reps), các đối tượng được  
định nghĩa bởi bề mặt của chúng.  
Các mô hình thường được biểu diễn trong một hệ tọa độ cục bộ, mà ta gọi hệ tọa độ  
đối tượng. Trong hệ tọa độ này chỉ bản thân đối tượng được định nghĩa, vậy gốc tọa  
độ đơn vị đo lường thường được chọn sao cho việc biểu diễn đối tượng tiện lợi nhất.  
Bước đầu tiên trong quy trình hiển thị biến đổi đối tượng từ không gian đối tượng  
(object-space) vào một không gian chung gọi là không gian thực (world space). Trong  
không gian này các đối tượng, nguồn sáng, và người quan sát cùng tồn tại. Bước này  
được gọi là giai đoạn biến đổi mô hình (modeling transformation).  
Bước tiếp theo là một bước tối ưu hóa. Trong giai đoạn loại bỏ đơn giản (trivial rejection)  
ta cần loại trừ tất cả các đối tượng không thể nhìn thấy. Điều này giúp chúng ta tránh  
được việc xử một số phần không cần thiết của cảnh (scene) mà ta đang chuẩn bị hiển  
thị ở các bước sau.  
Tiếp theo ta phải chiếu sáng (illumination) các đối tượng thể nhìn thấy được bằng cách  
gán cho chúng màu sắc dựa trên các đặc tính của các chất tạo nên vật và các nguồn sáng  
tồn tại trong cảnh.  
Sau khi chiếu sáng, ta phải thực hiện một phép biến đổi hệ tọa độ để đặt vị trí quan sát  
(viewing position) về gốc tọa độ mặt phẳng quan sát (viewing plane) về một vị trí  
mong ước. Bước này gọi là bước đổi hệ quan sát. Sau bước này, các đối tượng được  
chuyển từ không gian thực sang không gian quan sát (eye space).  
Trong không gian quan sát, ta phải thực hiện việc xén các đối tượng trong cảnh để cảnh  
nằm gọn trong một phần không gian chóp cụt mà ta gọi viewing frustum. Bước này sẽ  
loại bỏ hoàn toàn các đối tượng (các mảnh đối tượng) không nhìn thấy được trong ảnh.  
Bước tiếp theo ta sẽ chiếu các đối tượng xuống mặt phẳng hai chiều. Bước Projection  
thực hiện phép biến đổi từ không gian quan sát sang không gian màn hình (screen-space).  
Trong bước rời rạc hóa (rasterization) ta sẽ chuyển đối tượng thành các pixel. Cuối cùng,  
toàn cảnh sẽ được hiển thị lên màn hình.  
1.2. Mô hình khung nối kết (Wireframe Model)  
1.2.1. Khái niệm  
Một phương pháp thông dụng đơn giản để mô hình hóa đối tượng là mô hình khung  
nối kết.  
Một mô hình khung nối kết gồm một tập các đỉnh tập các cạnh nối giữa các đỉnh  
đó. Khi thể hiện bằng mô hình này, các đối tượng ba chiều vẻ rỗng và không giống  
thực tế lắm. Để hoàn thiện hơn, người ta dùng các kĩ thuật tạo bóng và loại bỏ các đường  
mặt khuất. (Chúng ta sẽ đề cập vấn đề này các chương sau). Tuy nhiên vẽ bằng mô  
hình này thường nhanh nên người ta thường dùng nó trong việc xem phác thảo (preview)  
các đối tượng, đặc biệt là trong các hệ CAD.  
1.2.2. Biểu diễn các vật thể ba chiều bằng mô hình khung nối kết  
Với mô hình khung nối kết, hình dạng của đối tượng ba chiều được biểu diễn bằng hai  
danh sách (list) : danh sách các đỉnh (vertices) và danh sách các cạnh (edges) nối các đỉnh  
đó. Danh sách các đỉnh cho biết thông tin hình học đó vị trí các đỉnh, còn danh sách  
các cạnh xác định thông tin về sự kết nối, nó cho biết cặp các đỉnh tạo ra cạnh. Chúng ta  
hãy quan sát một vật thể ba chiều được biểu diễn bằng mô hình khung nối kết như sau :  
Bảng danh sách các cạnh đỉnh biểu diễn vật thể  
Vertex List  
Edge List  
Vertex  
x
0
0
0
0
0
1
1
1
1
1
y
0
z
0
Edge  
1
Vertex1  
Vertex2  
1
2
back side  
1
2
3
4
5
6
7
8
9
10  
1
2
3
4
5
2
1
2
3
1
0
2
3
1
1
3
4
4
0.5  
0
1.5  
1
4
5
5
5
1
6
0
0
front side  
6
7
7
1
0
7
8
8
1
1
8
9
9
0.5  
0
1.5  
1
9
10  
6
10  
10  
11  
12  
13  
14  
15  
16  
17  
6
7
8
9
10  
5
3
Hình 5.3 Vật thể ba chiều được biểu diễn bằng mô hình khung nối kết  
nhiều cách để đặc tả mô hình khung nối kết trên máy tính như dùng xâu, mảng, ... và  
mỗi cách đều có các ưu điểm riêng trong từng ứng dụng cụ thể. Ở đây ta minh họa các  
biểu diễn mô hình khung nối kết bằng cấu trúc dữ liệu mảng như sau :  
#define MAXVERTS  
#define MAXEDGES  
50 //số đỉnh tối đa thể biểu diễn  
100 //số cạnh tối đa  
typedef struct {  
float  
x, y, z;  
} POINT3D;  
typedef struct {  
int  
int  
NumVerts; //Số đỉnh trong mô hình  
NumEdges; //Số cạnh trong mô hình  
POINT3D Vert[MaxVerts];  
int  
Edge[MaxEdges][2];  
}WIREFRAME;  
Ngoài ra, đôi khi trong mô hình wireframe người ta còn mô tả các mặt (phẳng) của đối  
tượng. Mỗi mặt được định nghĩa bởi một đa giác bao. Ví dụ, đối tượng trong hình 5.3 có  
7 mặt.  
1.3. Vẽ các đối tượng theo mô hình khung nối kết bằng cách sử dụng các phép chiếu  
Để vẽ các đối tượng biểu diễn bằng mô hình khung nối kết, đơn giản chúng ta chỉ cần vẽ  
các cạnh trong danh sách các cạnh mà thôi. Tuy nhiên do các đỉnh cạnh đều được định  
nghĩa trong ba chiều nên vấn đề đặt ra ở đây là làm thế nào để vẽ các đường thẳng ba  
chiều trong mặt phẳng hai chiều. Để làm điều này, chúng ta phải thực hiện phép chiếu từ  
ba chiều vào hai chiều để bỏ bớt một chiều. Có hai loại phép chiếu đơn giản thường dùng  
đó là phép chiếu song song (parallel projection) và phép chiếu phối cảnh (perspective  
projection). Phép chiếu song song sử dụng các đường thẳng song song đi qua các đỉnh  
của đối tượng, trong khi đó phép chiếu phối cảnh dùng các đường thẳng qua các đỉnh của  
đối tượng hội tụ về một điểm gọi là tâm chiếu (center of projection). Các đường thẳng  
trên được gọi là tia chiếu và giao điểm của các đường thẳng này với mặt phẳng chiếu  
(hay còn gọi mặt phẳng quan sát (view plane)) chính là các hình chiếu của các đỉnh  
hay còn gọi điểm chiếu. Trong phần này, chúng ta giả sử rằng mặt phẳng chiếu mặt  
phẳng z=0.  
Phép chiếu song song bảo toàn được mối quan hệ giữa các chiều của đối tượng, đây  
chính là kĩ thuật được dùng trong phác thảo để tạo ra phần khung của đối tượng ba chiều.  
Người ta dùng phương pháp này để quan sát chính xác các mặt khác nhau của đối  
tượng. Tuy nhiên, phép chiếu song song không cho một biểu diễn thực của đối tượng ba  
chiều.  
Trong khi đó, phép chiếu phối cảnh tạo ra được biểu diễn thực hơn nhưng lại không bảo  
toàn được mối liên hệ giữa các chiều. Các đường thẳng càng xa sẽ có các ảnh chiếu nhỏ  
hơn.  
Nói chung, kĩ thuật để vẽ một đường thẳng ba chiều là :  
Chiếu mỗi điểm đầu mút thành các điểm hai chiều.  
Vẽ đường thẳng nối hai điểm ảnh qua phép chiếu.  
Hình 5.4 – Phép chiếu song song (a) và phép chiếu phối cảnh (b)  
Sở dĩ chúng ta làm được điều này vì các phép chiếu mà chúng ta sử dụng bảo toàn đường thẳng.  
1.4. Phép chiếu song song (parallel projection)  
Khi hướng của tia chiếu vuông góc với mặt phẳng chiếu ta có phép chiếu trực giao  
(orthographic projection). Ngược lại, ta có phép chiếu xiên (oblique projection).  
1.4.1. Phép chiếu trực giao  
Xét điểm ba chiều, P  
Px , Py , Pz  
, cách đơn giản nhất bỏ đi thành phần z để chiếu P thành  
P'  
Px , Py . Điều này tương đương với chiếu điểm đó lên mặt phẳng xy theo phương của trục z. Mặt  
phẳng xy là mặt phẳng quan sát. Xem hình vẽ minh họa 5.5, ở đây điểm chiếu chính là giao điểm của tia a  
qua P và song song với trục z vuông góc với mặt phẳng xy. Tia a là tia chiếu.  
Dễ dàng thấy rằng phép chiếu này bảo toàn đường thẳng.  
Hình 5.5 – Phép chiếu trực giao  
Phép chiếu trực giao trên thường được gọi là phép nhìn từ trên xuống (top-view) hoặc  
dưới lên (bottom-view). Có hai phép chiếu khác cũng khá thông dụng là:  
Phép nhìn từ phía trước (front-view): Tia chiếu song song với trục x và mặt phẳng quan  
sát là yz. Phép chiếu này loại bỏ thành phần x của P.  
Phép nhìn từ phía bên cạnh (side-view): Tia chiếu song song với trục y và mặt phẳng  
quan sát là xz. Phép chiếu này loại bỏ thành phần y của P.  
Hình 5.6 minh họa ba phép chiếu trực giao đã đề cập ở trên lên một vật thể là ngôi nhà.  
Nhận xét rằng với phép chiếu nhìn từ phía trước ta không phân biệt được tường trước và  
tường sau vì chúng nằm chồng lên nhau, cũng tương tự cho trường hợp phép chiếu nhìn  
từ phía bên cạnh.  
Hình 5.6 Kết quả của ba phép chiếu trực giao  
1.4.2. Phép chiếu xiên  
Hình 5.7 – Phép chiếu xiên  
Hình 5.7 minh họa một phép chiếu xiên. Điểm  
xP , yP Px , Py là hình chiếu của P qua phép chiếu trực giao. là góc hợp bởi tia chiếu đoạn nối  
xP , yP Px , Py . Giả sử đoạn nối này có độ dài là L. là góc giữa đoạn nối trên với trục y.  
P
Px , Py , Pz qua phép chiếu xiên sẽ nhận được điểm  
P'  
.
1.5. Phép chiếu phối cảnh (perspective projection)  
1.5.1. Phép chiếu phối cảnh đơn giản nhất  
Phép chiếu phối cảnh phụ thuộc vào vị trí tương đối của hai đối tượng đó mắt nhìn và  
mặt phẳng quan sát.  
Quan sát hình sau, với mặt phẳng quan sát là yz và mắt nhìn  
Khoảng cách giữa mắt E và mặt phẳng quan sát được gọi tầm nhìn (eye distance).Để xác định hình chiếu  
của x, y, z , ta nối P với E và tìm giao điểm P’ của đường thẳng này với mặt phẳng quan sát. Lúc này  
P’ chính là điểm cần tìm.  
E
E,0,0  
được đặt dọc theo trục x.  
P
Hình 5.8 – Phép chiếu phối cảnh đơn giản  
Trong phép chiếu phối cảnh các tia chiếu không song song với nhau mà hội tụ về một điểm duy nhất  
mắt.  
Chúng ta giả sử P không nằm phía sau mắt nhìn, tức x E . P có thể nằm sau mặt  
phẳng quan sát, hay trên mặt phẳng quan sát, hay giữa mắt mặt phẳng quan sát. Ta có,  
tia từ mắt đến P có dạng :  
r
t
E,0,01 t  
x, y, z t  
Tia này giao với mặt quan sát (mặt phẳng x=0) khi x = 0 nên giá trị t ứng với trường hợp  
này là :  
1
t'  
1 x / E  
Suy ra các tọa độ của điểm chiếu là :  
y
y'  
1 x / E  
z
z'  
1 x / E  
Phép chiếu phối cảnh gần giống phép chiếu trực giao chỉ khác là hai tọa độ y, z được nhân lên thêm  
1
một lượng t'  
. Hệ số tỉ lệ này dẫn đến khái niệm phối cảnh theo luật xa gần (perspective  
1 x / E  
foreshortening) nghĩa là : vật càng xa mắt (theo chiều âm của trục x, để luôn có x E ) thì t’ càng nhỏ  
dẫn đến y’, z’ càng nhỏ do đó vật sẽ thấy nhhơn, ngược lại nếu vật càng gần mắt thì sẽ thấy lớn hơn.  
Cũng tương tự như trên, ta có thể dễ dàng kiểm chứng phép chiếu phối cảnh cũng bảo  
toàn đường thẳng.  
Nhận xét rằng phép chiếu song song là một trường hợp đặc biệt của phép chiếu phối cảnh. Nếu chúng  
ta cho tầm nhìn E càng ngày càng lớn tiến dần đến cực thì các tia chiếu qua mắt sẽ trở nên song song và  
1
hệ số t'  
trở thành 1. Lúc này phép chiếu phối cảnh trở thành phép chiếu song song.  
1 x / E  
1.5.2. Các trường hợïp khác  
Trường hợp trên có mắt nhìn nằm trên trục x và mặt phẳng quan sát là yz. Cũng như  
trong phép chiếu trực giao ta cũng thể hoán đổi vị trí của mắt mặt phẳng quan sát  
để thể nhìn đối tượng ở các góc cạnh khác nhau. Ví dụ trong trường hợp mắt nằm trên  
trục z và mặt phẳng quan sát là xy thì các kết quả sẽ tương tự :  
1
t'  
1 z / E  
x
x'  
1 z / E  
y
y'  
1 z / E  
2. BIỂU DIỄN ĐỐI TƯỢNG BA CHIỀU  
Các cảnh đồ họa thể chứa nhiều dạng đối tượng khác nhau: cây, hoa, mây, núi, nước, sắt thép, cỏ,  
…Chính vì vậy, không ngạc nhiên khi có nhiều phương pháp khác nhau có thể sử dụng để tả các đối  
tượng sao cho phù hợp với thuộc tính của các loại đối tượng này. Các mặt đa giác và mặt bậc hai cung cấp  
cho chúng ta một tả gần đúng của các đối tượng Euclid đơn giản như là các khối ellipse, khối đa diện;  
các mặt tròn xoay, và các đối tượng dùng để thiết kế các mô hình máy bay, bánh răng và các cấu trúc công  
nghệ khác thường được biểu diễn thông qua mặt cong (curves); các phương pháp tiếp cận thủ tục  
(procedural method) như Fractal cho phép chúng ta biểu biễn một cách chính xác các đối tượng như mây,  
thảm cỏ và các đối tượng tự nhiên khác.  
Sơ đồ biểu diễn một đối tượng lập thể thường được chia ra làm hai loại, dù không phải tất  
cả các biểu diễn đều thể được phân chia một cách rõ ràng thuộc loại nào trong hai loại  
này. Phương pháp biểu diễn bề mặt ((B-reps)) mô tả các đối tượng ba chiều bằng một tập  
hợp các bề mặt giới hạn phần bên trong của đối tượng với môi trường bên ngoài. Ví dụ  
kinh điển của B-reps là việc biểu diễn các mặt đa giác và các mảnh tròn xoay. Phương  
pháp biểu diễn theo phân hoạch không gian (space-partitioning representation) thường  
được dùng để tả các thuộc tính bên trong của đối tượng bằng cách phân hoạch phần  
bên trong của đối tượng thành một tập hợp nhiều đối tượng nhỏ hơn.  
Trong đồ họa máy tính, các đối tượng lập thể thể được tả bằng các bề mặt  
(surfaces) của chúng. Ví dụ : Một hình lập phương được xây dựng từ sáu mặt phẳng, một  
hình trụ được xây dựng từ sự kết hợp của một mặt cong và hai mặt phẳng, và hình cầu  
được xây dựng chỉ từ một mặt cong. Thông thường để biểu diễn một đối tượng bất kì ,  
người ta dùng các phương pháp xấp xỉ để đưa các mặt về dạng các mặt đa giác (polygon  
faces). Tuy nhiên trong trường hợp các đối tượng thực sự phức tạp, người ta thường dùng  
một hay nhiều mặt cong trơn (smoothly curved surfaces) ghép nối lại với nhau. Mỗi  
thành phần dùng để ghép nối được gọi là patch (mặt vá).  
2.1. Biểu diễn mặt đa giác  
Phương pháp B-reps chung nhất thường dùng để biểu diễn các đối tượng ba chiều là dùng  
một tập hợp các mặt đa giác xác định bề mặt của đối tượng. Rất nhiều hệ thống đồ họa  
lưu trữ các đối tượng như một tập hợp các mặt đa giác. Với cách biểu diễn này ta có  
thể đơn giản hóa việc biểu diễn tăng tốc độ hiển thị các đối tượng bởi tất cả các bề  
mặt đều được tả bởi các phương trình tuyến tính. Vì lí do này, mô tả các đối tượng  
thông qua các mặt đa giác thường được dùng cho các đối tượng đồ họa cơ sở.  
Trong một số trường hợp, ta chỉ một khả năng chọn lựa sử dụng biểu diễn đa giác.  
Tuy nhiên, một số hệ thống đồ họa còn cho phép các khả năng biểu diễn khác ví dụ như  
bằng các mặt cong spline.  
Hình 5.9 – Mô hình wireframe của một hình trụ  
Biểu diễn bằng mặt đa giác của các đa diện cho chúng ta một định nghĩa chính xác về các  
đặc tính của các đối tượng này. Nhưng đối với những đối tượng khác ta chỉ nhận được  
một biểu diễn gần đúng. Hình 5.9 cho chúng ta biểu diễn một hình trụ như một tập hợp  
các mặt đa giác. Biểu diễn dạng wireframe cho phép chúng ta hiển thị đối tượng rất  
nhanh. Khi cần thể hiện đối tượng thực hơn, ta có thể dùng kĩ thuật tạo bóng nội suy  
(interpolating shading).  
2.1.1. Biểu diễn bằng bảng đa giác  
Ta biểu diễn một mặt đa giác bằng một tập hợp các đỉnh và các thuộc tính kèm theo. Khi  
thông tin của mỗi mặt đa giác được nhập, dữ liệu sẽ được điền vào trong các bảng sẽ  
được dùng cho các xử tiếp theo, hiển thị biến đổi. Các bảng dữ liệu tả mặt đa  
giác có thể tổ chức thành hai nhóm: các bảng hình học và các bảng thuộc tính. Các bảng  
lưu trữ dữ liệu hình học chứa tọa độ của các đỉnh và các tham số cho biết về định hướng  
trong không gian của mặt đa giác. Thông tin về thuộc tính của các đối tượng chứa các  
tham số tả độ trong suốt, tính phản xạ và các thuộc tính texture của đối tượng.  
Một cách tổ chức thuận tiện để lưu trữ các dữ liệu hình học tạo ra ba danh sách: một  
bảng lưu đỉnh, một bảng lưu cạnh một bảng lưu đa giác. Các giá trị tọa độ cho mỗi  
đỉnh trong đối tượng được chứa trong bảng lưu đỉnh. Bảng cạnh chứa các con trỏ trỏ đến  
bảng đỉnh cho biết đỉnh nào được nối với một cạnh của đa giác. Và cuối cùng, bảng lưu  
đa giác chứa các con trỏ trỏ tới bảng lưu cạnh cho biết những cạnh nào tạo nên đa giác.  
Ngoài ra, ta cũng thể thêm một số thông tin bổ sung vào các bảng trên để xử lí nhanh  
hơn khi cần truy xuất thông tin. Ví dụ, ta có thể thêm một con trỏ từ một cạnh đến các đa  
giác chứa nó. Tương tự, ta có thể thêm thông tin trong bảng lưu đỉnh để biết những cạnh  
nào kề với một đỉnh cho trước .  
Vì các bảng lưu thông tin về đối tượng thể rất phức tạp nên việc kiểm tra tính đúng  
đắn đầy đủ của dữ liệu rất quan trọng.  
2.1.2. Phương trình mặt phẳng  
Để thực hiện việc hiển thị một đối tượng ba chiều, ta phải xử dữ liệu nhập thông qua  
một quy trình gồm nhiều bước. Trong một số bước này, đôi khi ta cần thông tin về định  
hướng của đối tượng cả thông tin về định hướng của từng mặt của đối tượng trong  
không gian. Những thông tin này có thể lấy được thông qua tọa độ của các đỉnh và  
phương trình mô tả các mặt đa giác của đối tượng.  
Phương trình biểu diễn mặt phẳng dạng:  
Ax By Cz D 0 (5.1)  
trong đó  
x, y, z một điểm bất của mặt phẳng và A, B, C, D là các hằng số diễn tả thông tin không  
gian của mặt phẳng. Như đã biết, để xác định phương trình mặt phẳng, ta chỉ cần biết ba điểm không thẳng  
hàng trên mặt phẳng này. Như vậy, để xác định phương trình mặt phẳng qua một đa giác, ta sẽ sử dụng tọa  
độ của ba đỉnh đầu tiên  
x1 , y1  
,
x2 , y2  
,
x3 , y3 , trong đa giác này. Từ (5.1) ta có:  
Axk Byk Czk D 0, k 0,1,2,3 (5.2)  
Dùng quy tắc Cramer, ta có thể xác định A, B, C, D theo công thức:  
1
y1 z1  
A 1 y2 z2  
y3 z3  
x1  
B x2  
x3  
1
1
1
z1  
z2  
z3  
1
(5.3)  
x1 y1  
C x2 y2  
x3 y3  
1
1
1
x1 y1 z1  
D   x2 y2 z2  
x3 y3 z3  
Khai triển các định thức trên ta được công thức tường minh của các hệ số:  
A y1 z2 z3  
y2  
z2  
z3 z1  
x3 x1  
y3 y1  
x2 y3z1 y1z3  
y3  
z3  
z1 z2  
x1 x2  
y1 y2  
x3  
B z1 x2 x3  
Hướng của mặt phẳng  
C x1  
y2 y3  
x2  
x3  
(5.4)  
D -x1  
y2z3 y3z2  
y1z2 y2z1  
thường được xác định thông qua vector pháp tuyến của nó. Vector pháp tuyến n  
B, C là các hệ số của phương trình mặt phẳng ta vừa tính trong (5.4).  
A, B,C , trong đó A,  
Hình 5.10 – Vector pháp tuyến của mặt phẳng  
Vì ta thường làm việc với các mặt bao quanh đối tượng nên ta cần phân biệt hai mặt của  
mặt phẳng. Mặt tiếp giáp với phần bên trong của đối tượng ta gọi mặt trong, mặt kia là  
mặt ngoài. Nếu các cạnh của đa giác được tả theo chiều ngược chiều kim đồng hồ,  
vector pháp tuyến của mặt phẳng sẽ hướng từ trong ra ngoài (giả sử hệ tọa độ biểu diễn  
đối tượng hệ tọa độ bàn tay phải). dụ, trong hình 5.11, vector pháp tuyến của mặt  
phải của khối lập phương đơn vị (mặt được tô) có phương trình mặt phẳng là x-1=0 và có  
vector pháp tuyến tương ứng là (1,0,0);  
Hình 5.11 – Vector pháp tuyến hướng từ trong ra ngoài  
Phương trình mặt phẳng còn có thể dùng để xác định vị trí tương đối giữa một điểm trong  
không gian với mặt phẳng. Nếu điểm P(x,y,z) không nằm trên mặt phẳng, lúc đó ta có:  
Ax + By + Cz + D 0  
Ta có thể xác định P nằm ở phía trong hay nằm phía ngoài của mặt phẳng nhờ vào dấu  
của biểu thức Ax + By + Cz + D:  
Nếu Ax + By + Cz + D < 0, điểm P(x,y,z) nằm trong.  
Nếu Ax + By + Cz + D > 0, điểm P(x,y,z) nằm ngoài.  
Dấu hiệu kiểm tra trên đúng cho hệ tọa độ bàn tay phải và phương trình mặt phẳng được  
tính từ tọa độ các đỉnh đa giác cho theo chiều ngược chiều kim đồng hồ.  
Đôi khi, sẽ rất hữu ích nếu ta khảo sát các đường mặt thông qua phương trình tham số  
của nó.  
Phương trình tham số của một mặt một phương trình có hai tham số u, v. Một điểm bất  
kì trên mặt sẽ tọa độ được biểu diễn dưới dạng vector tham số : p(u, v) = (x(u, v), y(u,  
v), z(u, v)). Với mỗi cặp giá trị (u, v) ta sẽ một bộ các tọa độ (x, y, z) biểu diễn một  
điểm trên bề mặt đã cho. Các mặt sẽ được phân biệt với nhau bằng các bộ hàm x(), y(),  
z() khác nhau.  
Để giới hạn không gian của các mặt, thông thường người ta định lại các tọa độ biên sao cho u, v  
tương ứng biến đổi trong đoạn  
bằng các phương trình sau :  
0,1 . Ví dụ, một mặt cầu với bán kính r, tâm tại gốc tọa độ thể biểu diễn  
x(u, v) = r sin(u) cos(2v)  
y(u, v) = r sin(u) sin(2v)  
z(u, v) = r cos(u)  
Trong đó u, v thay đổi trong đoạn  
0,1 .  
Một mặt phẳng thể được xác định bằng một điểm với vector vị trí c và hai vector a, b  
không cùng phương (xem hình 5.12).  
Hình 5.12 – Minh họa cách xác định mặt phẳng  
Nhận xét rằng bất điểm nào trên mặt phẳng cũng thể được biểu diễn bằng một  
vector tổng sau : p(u, v) = c + au + bv. Đây chính là phương trình tham số của mặt phẳng.  
Trong phương trình trên u, v có thể biến đổi trong khoảng  
, , do đó mặt phẳng sẽ trải dài đến  
tận. Tuy nhiên trong các trường hợp cụ thể ta chỉ muốn dùng một phần của mặt phẳng, một hình bình  
hành thôi chẳng hạn. Các phần như vậy được gọi là planar patch, lúc đó ta có thể tưởng tượng mặt phẳng  
như sự ghép nối của các planar patch này.  
Một planar patch được xác định bằng cách giới hạn khoảng biến đổi của các tham số u, v  
trong phương trình trên. Ví dụ nếu cho u, v biến đổi trong đoạn [0, 1] ta sẽ một patch  
như hình vẽ 5.13.  
Trong hình vẽ này u, v được biến đổi trong một khoảng không gian gọi là không gian  
tham số (parametric space), việc ánh xạ tương ứng các giá trị u, v đã được giới hạn trên  
sẽ tạo ra một patch trong không gian tương ứng gọi là không gian đối tượng.  
Hình 5.13 – Cách tạo ra một patch  
2.1.3. Lưới đa giác (polygon meshes)  
Một số hệ đồ họa cung cấp một số hàm cho phép mô hình hóa các đối tượng. Một mặt  
phẳng thể được diễn tả thông qua một hàm như fillArea. Nhưng khi ta cần lợp nhiều  
planar patch liên tiếp, dùng các hàm lưới (mesh function) sẽ thuận tiện hơn. Một dạng  
thông dụng của lưới đa giác là dãy các tam giác (triagle strip). Hàm này vẽ n-2 tam giác  
kề nhau khi biết n đỉnh. Dạng này của lưới đa giác dùng trong hầu hết các thư viện đồ  
họa chuẩn hiện nay như OpenGL hay DirectX. Một dạng hàm tương tự là lưới các tứ giác  
(quardrilateral mesh). Hàm này vẽ một lưới (n-1)x(m-1) tứ giác lồi từ dãy nxm đỉnh.  
Khi đa giác được tả bởi nhiều hơn ba đỉnh, các đỉnh của nó có thể không đồng phẳng.  
Điều này có thể dẫn đến các lỗi tính toán. Một phương pháp đơn giản là phân đa giác này  
thành các tam giác.  
Hình 5.14 - Triangle strip và quadrilateral mesh  
2.2. Các đường cong và mặt cong  
Hình ảnh của các đường cong và mặt cong có thể được tạo ra từ một tập hợp các hàm  
toán học định nghĩa các đối tượng hoặc từ một tập hợp các điểm trên đối tượng. Khi đối  
tượng được tả bằng các hàm toán học, thường các thư viện đồ họa cung cấp sẵn  
những hàm cho phép chiếu các đối tượng lên mặt phẳng hiển thị. Đối với các đường  
cong, các hàm này sẽ vẽ một loạt các điểm dọc theo hình chiếu của đường tả bởi hàm  
toán học. Đối với các mặt cong, một lưới đa giác xấp xỉ với mặt cong sẽ được tạo ra.  
Thường thì các hệ đồ họa tạo ra các lưới tam giác để đảm bảo tính đồng phẳng của các  
cạnh thuộc cùng một polygon patch.  
Một đường cong hoặc mặt cong có thể được diễn tả bằng phương trình toán học dạng  
tham số hoặc không tham số. Tuy nhiên, trong đồ họa máy tính, thường thì dạng tham số  
sẽ thuận tiện cho xử lí hơn.  
Khi đối tượng được tả bởi một tập hợp các điểm rời rạc, đối tượng sẽ được hiển thị  
thông qua một mặt cong xấp xỉ nào đó dựa trên những điểm đã cho. Các loại đường cong  
mặt cong dạng spline hoặc Bezier là những đường cong và mặt cong xấp xỉ thường  
dùng.  
Các mặt cong có thể có hình dạng rất phức tạp, đặc biệt khi nó bao gồm nhiều patch kết  
hợp lại với nhau. Trước tiên, chúng ta chỉ khảo sát các mặt cong khá đơn giản, kế tiếp  
chúng ta sẽ khảo sát các mặt phức tạp hơn.  
2.3. Các mặt có quy luật (ruled surfaces)  
2.3.1. Định nghĩa  
Ta có hai định nghĩa tương đương :  
Một mặt có quy luật một mặt được tạo bằng cách quét (sweep) một đường thẳng trong  
không gian theo một cách nào đó.  
Một mặt được gọi là có quy luật nếu qua bất điểm nào thuộc đều có ít nhất một  
đường thẳng nằm hoàn toàn trên nó.  
Hình 5.15 – Minh họa một mặt có quy luật  
2.3.2. Phương trình tham số  
mặt có quy luật hoàn toàn dựa trên cơ sở đường thẳng với phương trình dạng tham  
số p  
v
1 v  
p0 vp1 , nên ta có thể suy ra dạng của một cách tương tự như sau:  
p u, v  
1 v p0  
u
vp1  
u
   
(5.5)  
Nếu u biến đổi từ ustart đến uend , ta thấy mặt cong sẽ tập hợp của các đường thẳng  
nối các cặp điểm tương ứng p0(u’) (thuộc đường cong p0(u)) và p1(u’) (thuộc đường cong  
p1(u)) với u’ nằm trong (ustart, uend).  
Nếu không giới hạn u, v ta sẽ mặt cong trải dài ra vô tận, các mặt cong “ruled patch”  
sẽ được tạo bằng cách giới hạn u, v trong đoạn [0, 1].  
2.3.3. Khảo sát các mô hình minh họa  
Hình trụ (Cylinder)  
Hình trụ là hình được tạo ra khi một đường thẳng L, gọi đường sinh (generator) được  
quét dọc theo một đường cong p0(u), gọi đường chuẩn (directrix), đường cong p0(u)  
nằm trên một mặt phẳng nào đó.  
Hình 5.16 – Minh họa một hình trụ  
Từ phương trình tổng quát của mặt cong có quy luật :  
p
u,v  
p0  
u
vd  
u
, trong đó d  
u
p1  
u
p0  
u
(5.6)  
do khi quét các đường thẳng luôn song song với nhau nên ta có d là hằng số, và phương  
trình tham số của hình trụ là :  
p
u,v  
Một trong những dạng quen thuộc của hình trụ là hình trụ tròn (circular cylinder) ứng với trường hợp  
đường chuẩn là hình tròn. Nếu đường tròn nằm trên mặt phẳng xy chúng ta sẽ có  
p0 cos ,sin ,0  
p0  
u
vd  
u
u
    
u
Hình 5.17 – Minh họa một hình trụ tròn  
Hình nón (Cone)  
Hình nón là hình được tạo ra khi một đường thẳng di chuyển dọc theo một đường cong  
phẳng cho trước (plane curve), các đường thẳng này còn có thêm tính chất nữa là luôn đi  
qua một điểm cố định gọi đỉnh của hình nón.  
Hình 5.18 – Minh họa hình nón  
Phương trình tham số của hình nón có dạng tương tự dạng tổng quát nhưng p0  
số :  
u hằng  
p u,v  
1 v  
p0 vp1  
u
(5.7)  
Trong trường hợp này tất cả các đường thẳng sẽ đi qua p0 ứng với v = 0. Đường cong  
phẳng tất cả các đường thẳng đi qua ứng với v = 1.  
2.4. Các mặt tròn xoay (surfaces of revolution)  
Mặt tròn xoay được tạo ra khi chúng ta quay tròn một đường cong phẳng C nào đó quanh một trục.  
Hình vẽ 5.19 minh họa một đường cong C nằm trong mặt phẳng xz và quay quanh trục z. C thường được  
gọi mặt cắt nghiêng và được cho bởi phương trình tham số c  
v
x
v
, z  
  trong đó v biến đổi trong  
v
khoảng vstart ,vend nào đó.  
Hình 5.19 – Minh họa một mặt tròn xoay  
Đối với mặt tròn xoay, mỗi điểm  
kiểm soát của tham số u, u là góc mà mỗi điểm được quay quanh trục. Các vị trí khác nhau của đường cong  
C quanh trục được gọi là các đường kinh tuyến (meridians). Khi điểm ,0, z  

được quay bởi u  
radian, nó sẽ trở thành cos , x sin , z  
. Nếu quay điểm này đủ một vòng quanh trục chúng ta  
x
v
, z  
v

thuộc C được quét xung quanh một trục tọa độ dưới sự  
x
v
   
v
x
v
   
u
v
u
v
sẽ nhận được một hình tròn. Như vậy, ứng với v là hằng số, đường biên sẽ là các đường tròn và các đường  
này được gọi là các đường vĩ tuyến của mặt. Kinh tuyến tại v có bán kính là x(v) và nằm trên độ cao z(v) so  
với mặt phẳng xy, do đó một điểm bất kì trên mặt dạng này sẽ có vector vị trí :  
p u,v  
x
v
   
cos u  
, x  
v
   
sin  
u
, z  
v
  
(5.8)  
Nhận xét : Nếu đường cong c(v) là đường thẳng song song với trục z và cách z một đơn  
vị, tức là c(v) = (1, v) thì khi đường này quét quanh trục z sẽ tạo ra một hình trụ.  
Mặt cầu là trường hợp đơn giản nhất của dạng mặt tròn xoay. Đường cong C trong trường  
hợp này chính là nửa đường tròn cho bởi các điểm  
từ -/2 đến /2. Lúc này phương trình hình cầu sẽ dạng :  
 (5.9)  
Rcos  
v
, Rsin  
v
 , v chạy trong khoảng  
p u,v  
Rcos  
v
cos u  
, Rcos  
v
sin  
u
, Rsin v  
trong đó -/2 v  /2, 0 u 2.  
Hình 5.20 - Minh họa mặt cầu  
2.5. Các mặt cong bậc hai  
Một lớp mặt cong rất thông dụng là các mặt cong bậc hai. Chúng được biểu diễn bởi các  
phương trình bậc hai. Mặt cầu cũng thuộc lớp mặt cong này. Ngoài ra còn có mặt  
ellipsoid, paraboloid và hyperboloid. Các mặt bậc hai thường là các đối tượng cơ sở của  
các hệ đồ họa. Những đối tượng khác phức tạp hơn có thể được tạo ra từ những đối tượng  
này. Phương trình tổng quát biểu diễn các mặt cong loại này là:  
Ax2 + By2 + Cz2 + Dxy + Eyz + Fzx + Gx + Hy + Iz + J = 0  
2.5.1. Mặt cầu  
Trong hệ tọa độ Decartes, mặt cầu bán kính R với tâm đặt tại gốc tọa độ xác định bởi tập  
các điểm tọa độ (x,y,z) thỏa phương trình:  
x2 + y2 + z2 = R2  
(5.10)  
Phương trình (5.10) thường gọi là phương trình chính tắc của mặt cầu.  
Như phần trước đã đề cập, ta có thể biểu diễn mặt cầu bằng phương trình tham số:  
x = Rcoscos,  
y = Rcossin,  
-/2    /2  
-      
(5.11)  
z = Rsin   
Hình 5.21 – Các tham số biểu diễn mặt cầu  
2.5.2. Ellipsoid  
Ellipsoid có thể coi là một mở rộng của mặt cầu với ba bán kính khác nhau Rx, Ry, Rz  
(xem hình 5.22). Phương trình chính tắc của một ellipsoid có dạng:  
2
2
2
y
x
z
1 (5.12)  
2
x
2
y
2
z
R
R
R
Và phương trình tham số của ellipsoid theo hai góc dạng:  
x = Rx coscos,  
y = Ry cossin,  
z = Rz sin  
-/2    /2  
-      
(5.13)  
Hình 5.22 - Ellipsoid với các bán kính Rx, Ry, Rz  
2.6. Vẽ  
B-Spline  
đường  
cong  
và  
mặt  
cong  
bằng  
Bezier  
và  
Chúng ta đã khảo sát các đường cong và mặt cong tương đối đơn giản và tìm ra các công  
thức toán học tương ứng để biểu diễn chúng. Tuy nhiên trong thực tế việc tìm ra các công  
thức để biểu diễn các đường mặt phức tạp không đơn giản chút nào. Trong phần này  
chúng ta sẽ khảo sát các phương pháp cho phép tạo ra các đường cong và mặt cong khác  
nhau dựa trên dữ liệu tả chúng.  
Bài toán đặt ra ở đây là : Với một đường cong cho trước mà ta chưa xác định được công  
thức hay công thức rất phức tạp, tập nhỏ các điểm phân biệt p1, p2, ... mô tả hình dáng  
của đường cong này, làm thế nào để xây dựng được đường cong ban đầu với một độ  
chính xác nào đó.  
Có hai cách giải quyết đó là :  
Định tọa độ của một số điểm nào đó thuộc đường cong, sau đó tìm các phương trình toán  
học hiệu chỉnh chúng để chúng đi qua hết các điểm trên và trùng khớp với đường cong  
ban đầu.  
Cách khác là xác định một số các điểm gọi điểm kiểm soát (control points) và dùng  
một giải thuật nào đó để xây dựng đường cong dựa trên các điểm này. Do đường cong  
nguyên thủy đường cong do máy tính tạo ra thường không đồng nhất ở lần đầu tạo ra,  
chúng ta sẽ di chuyển một số điểm điều khiển và cho phát sinh lại đường cong mới dựa  
trên tập các điểm mới tạo. Quá trình này lặp đi lặp lại cho tới khi tìm ra đường cong thỏa  
mãn phù hợp với đường cong ban đầu thì thôi. Lúc này, đường cong được xây dựng bởi  
một tập rất ít các điểm điều khiển và có thể được phát sinh lại khi cần.  
Trong phần này chúng ta sẽ nghiên cứu theo hướng tiếp cận thứ hai để xây dựng các  
đường cong và mặt cong đó là xây dựng dựa trên các đường cong Bezier và B-Spline.  
2.6.1. Vẽ các đường cong Bezier  
Thuật toán Casteljau  
Thuật toán này dựa trên tập các điểm cho trước để tìm ra các giá trị p(t) khi t thay đổi.  
Lúc này do đường cong được xây dựng phụ thuộc vào tập các điểm cho trước nên khi  
thay đổi các điểm này đường cong sẽ thay đổi theo.  
Chúng ta bắt đầu quá trình với việc xây dựng đường cong từ ba điểm cho trước p0, p1, p2  
như hình vẽ 5.23.  
Hình 5.23 - Thuật toán Casteljau cho ba điểm  
Chọn một giá trị t nào đó trong đoạn  
tỉ số t được p11  
. Ta có :  
0,1  
, chia đoạn p0 p1 theo tỉ số t được p01  
t , chia p1 p2 theo  
t
   
p01  
p11  
t
t
1 t  
p0 tp1 (5.14a)  
p1 tp2 (5.14b)  
1 t  
Lặp lại bước nội suy tuyến tính trên với các điểm p01  
t
p11  
t
ta được p02  
t . Bằng cách này khi  
cho t chạy trong đoạn [0,1], ta sẽ được đường cong  
p02 p01 tp11  
p0 tp1 t1 t  
2 p0 2 tp1 t2 p2  
1 t  
p
t
p02  
t
.
t
1 t  
1 t1 t  
1 t  
t
t
   
Ta có :  
p1 tp2  
Đây là hàm bậc hai theo t nên đường cong sẽ dạng parabol.  
Tổng quát, cho (L+1) điểm p0, p1, .., pL, bằng phương pháp nội suy tương tự, ứng với  
mỗi t thay đổi trong [0, 1] ta sẽ tìm ra được một giá trị p(t) qua L bước. Trong đó các  
điểm ở bước thứ r được tạo ra từ các điểm ở bước thứ (r-1) theo phương trình sau :  
r1  
i1  
pir  
t
1 t  
pir1  
t
tp  
t
(5.15)  
với r = 1, .., L; i = 0, .., L-r; và pi0 = pi.  
L
Các điểm tạo ra bước cuối cùng p0 (t) được gọi đường cong Bezier của các điểm p0,  
p1, ..., pL. Các điểm p0, p1, ..., pL được gọi là các điểm kiểm soát (control points) hay  
điểm Bezier (Bezier points) và đa giác tạo bởi các điểm này được gọi đa giác kiểm soát  
(control polygon) hay đa giác Bezier (Bezier polygon).  
Dạng Bernstein của đường cong Bezier  
Công thức đường cong Bezier dựa trên (L+1) điểm p0, p1, ..., pL có thể được viết lại như  
sau :  
L
P
t
P BLk   
t
(5.16)  
k
k0  
trong đó BkL được gọi đa thức Bernstein (Bernstein polynomial) được cho bởi công  
thức sau :  
L
k
BLk  
t
1 t  
Lk tk CLk  
1 t  
Lk tk  
(5.17)  
L!  
L k  
CLk   
k!  
!
khi L>=k và bằng 0 cho các trường hợp còn lại.  
Dễ dàng nhận thấy đa thức Bernstein BkL (t) chính là các thành phần khi khai triển biểu  
thức ((1-t)+t)L, do đó tổng của các BkL(t) luôn có giá trị 1với mọi giá trị của t.  
L
BLk   
t
1  
(5.18)  
k0  
Hình vẽ sau minh họa bốn đa thức Bernstein bậc ba khi t biến đổi trong [0, 1]  
Hình 5.24 – Các đa thức Bernstein bậc ba  
Các hàm BkL (t) thường được gọi là các hàm trộn (blending functions) vì vector p(t) có  
thể được xem được “pha trộn” từ các vector p0, p1, ..., pL. Với mỗi giá trị t, mỗi đa thức  
Bernstein xác định một tỉ lệ hay trọng lượng cho các vector tương ứng. Theo dõi hình vẽ  
5.25, ta thấy khi t = 0.3, bốn đa thức tương ứng với p0, p1, p2, p3, p4 cho các giá trị 0.343,  
0.441, 0.189, 0.027. Tổng của bốn vector được gia trọng bởi các trọng lượng này chính  
là vector p(0.3).  
Hàm trộn này là một đa thức bậc nhỏ hơn số lượng các điểm kiểm soát . Ba điểm sẽ  
cho một parabol, bốn điểm sẽ cho một đường cong bậc ba.  
Thông thường, số lượng các điểm kiểm soát có thể định là tùy ý cho việc xây dựng đường  
cong Bezier , tuy nhiên điều này đòi hỏi những tính toán phức tạp khi làm việc với các  
hàm đa thức bậc cao. Chúng ta khắc phục điều này bằng nhận xét : Một đường cong phức  
tạp bao giờ cũng thể ghép từ những đoạn khác nhau, do đó trên những đoạn con này  
chúng ta xây dựng các đường cong Bezier có bậc nhỏ hơn.  
Hình 5.25 – Hàm trộn của các đa thức  
Việc tạo các đường cong phức tạp bằng cách ghép nối các đoạn nhỏ hơn cho phép người  
dùng kiểm soát những thay đổi cục bộ (local variation) của đường cong tốt hơn. Vì  
đường cong Bezier đi qua hai điểm đầu cuối, nên rất dễ dàng kết hợp các đoạn cong  
(liên tục bậc 0). Hơn nữa, đường cong Bezier còn có một tính chất quan trọng nữa đó là  
tiếp tuyến với đường cong tại một điểm đầu hoặc cuối thì nằm trên đường thẳng nối  
điểm đó với điểm kiểm soát kế nó. Do đó, để nhận được sự liên tục bậc một giữa các  
đoạn cong, ta chỉ cần đặt các điểm kiểm soát sao cho các điểm pn-1 và pn của một đoạn  
cong trước và các điểm p0 và p1 của đoạn cong kế tiếp nằm trên cùng một đường thẳng.  
Hình vẽ 5.26 minh họa quá trình nhận được sự liên tục bậc 0 và liên tục bậc 1 khi ghép  
nối hai đoạn cong Bezier bằng cách cho P’0 = P2 và cho các điểm P1 , P2 và P’1 thẳng  
hàng. Đối với các đường cong Bezier thường không đòi hỏi tính liên tục bậc hai.  
Hình 5.26 – Ghép nối hai đoạn cong  
Cài đặt minh họa thuật toán vẽ đường cong Bezier qua (N+1) điểm kiểm soát  
#include <graphics.h>  
#include <stdlib.h>  
#include <stdio.h>  
#include <conio.h>  
#include <math.h>  
#define MAXPOINTS 100 // So diem kiem soat toi da  
#define MAXSEG  
100 // So diem toi da thuoc duong cong  
typedef struct  
{
int x;  
int y;  
}POINT;  
// Kieu mang cac diem thuoc duong cong  
typedef POINT BEZPOINT[MAXSEG+1];  
// Kieu mang cac diem kiem soat  
typedef POINT CTRLPOINT[MAXPOINTS+1];  
// Kieu mang luu he so C(k, N)  
typedef  
long COEFF[MAXPOINTS+1];  
// Tinh he so aCoeff[i] = C(k, n) = N!/k!*(N-k)! = (k+1)(k+2)....N)/(N-k)!;  
// aCoeff co (N+1) phan tu danh so tu 0 den N  
void ComputeCoefficient(COEFF aCoeff, int N)  
{
for(int k=0; k<=N; k++)  
{
aCoeff[k] = 1;  
for(int j=N; j>k; j--)  
aCoeff[k] *= j;  
for(j=2; j<=N-k; j++)  
aCoeff[k] /= j;  
}
}
// Tinh t^k*(1-t)^N-k  
float BlendingFunc(float t, int N, int k)  
{
float fRes;  
fRes = 1;  
for(int i=0; i<k; i++) // Tinh t^k  
fRes *=t;  
for(i=0; i<N-k; i++) // Tinh (1-t)^N-k  
fRes *=(1-t);  
return fRes;  
}
/*  
Phat sinh mot diem thuoc duong cong ung voi mot gia tri t nao do  
aCtrlPt : Mang cac diem kiem soat (N+1)  
N
: So diem kiem soat  
aCoeff : Mang luu he so C(k, N) da duoc tinh truoc khi goi  
t
: gia tri thuc.  
*/  
POINT  
FindBezPt(CTRLPOINT aCtrlPt, int N, COEFF aCoeff, float t)  
{
POINT BezPt;  
float  
B, x, y;  
x = 0;  
y = 0;  
for(int k=0; k<=N; k++)  
{
B
= BlendingFunc(t, N, k);  
x += aCtrlPt[k].x*aCoeff[k]*B; // pk*B(k, N)  
y += aCtrlPt[k].y*aCoeff[k]*B;  
}
BezPt.x = x;  
BezPt.y = y;  
return BezPt;  
}
// Phat sinh cac diem thuoc duong cong Bezier voi (N+1) diem kiem soat  
void BezCurve(BEZPOINT aBezPt, int NumBezPt, CTRLPOINT aCtrlPt,  
int N)  
Tải về để xem bản đầy đủ
doc 30 trang Thùy Anh 27/04/2022 8600
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Đồ họa máy tính - Chương 5, Phần 2: Giới thiệu đồ họa ba chiều", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • docgiao_trinh_do_hoa_may_tinh_chuong_5_phan_2_gioi_thieu_do_hoa.doc
  • htmChuong5.htm