Cài đặt các thao tác quan sát (Implementation of Viewing Operations), Cài đặt phần cứng, Lập trình xem ảnh ba chiều,Các mở rộng đến Đường ống quan sát (Viewing Pipeline)
Chúng ta có thể khái niệm hóa một dãy các thao tác để thực hiện quan sát như trong hình 6-25. Đầu tiên, các mô tả hệ tọa độ thế giới thực được biến đổi sang hệ tọa độ quan sát. Tiếp đến, cảnh được quan sát ...
Chúng ta có thể khái niệm hóa một dãy các thao tác để thực hiện quan sát như trong hình 6-25. Đầu tiên, các mô tả hệ tọa độ thế giới thực được biến đổi sang hệ tọa độ quan sát. Tiếp đến, cảnh được quan sát bị cắt bởi một không gian quan sát và được chiếu vào vùng cửa sổ được định nghĩa trên mặt phẳng quan sát. Cửa sổ này sau đó được ánh xạ lên một vùng quan sát (vùng này đã được định rõ trong hệ tọa độ thiết bị chuẩn). Bước cuối cùng là phải biến đổi mô tả trong hệ tọa độ thiết bị chuẩn vào trong các hệ tọa độ thiết bị và hiển thị quang cảnh lên một thiết bị xuất.
Mô hình được trình bày ở hình 6-25 thì hữu ích như mô hình cho lập trình viên hoặc cho việc khái niệm hóa các thao tác quan sát ba chiều. Tuy nhiên, để hiệu quả, việc cài đặt thật sự của việc quan sát ba chiều trong một gói đồ họa cần một hình thức khác hơn nhiều. Trong phần này, chúng ta nhìn vào những vấn đề, nơi mà các lo lắng về cài đặt làm cho chúng ra xa rời với mô hình cơ bản của việc quan sát ba chiều
Các không gian quan sát được chuẩn hóa (Normalized View Volumes)
Clipping trong không gian hai chiều được thực hiện một cách tổng quát bởi một hình chữ nhật có các cạnh song song với trục x và y. Điều này làm đơn giản rất nhiều các tính toán clipping, vì mỗi biên cửa sổ được xác định bởi chỉ một giá trị tọa độ. Ví dụ, các giao điểm của các đoạn cắt biên trái cửa sổ đều có giá trị tọa độ x bằng với biên trái.
Trong mô hình của lập trình viên ba chiều, việc clipping được thực hiện bởi một không gian quan sát được xác định bởi cửa sổ chiếu, kiểu chiếu, và các mặt gần, xa. Bởi vì các mặt gần và xa song song với mặt phẳng chiếu, mỗi mặt có giá trị tọa độ z không đổi. Tọa độ z của các giao điểm của các đoạn với các mặt này thì đơn giản là tọa độ z của các mặt phẳng tương ứng. Nhưng bốn mặt còn lại của không gian quan sát có thể có hướng không gian tùy ý. Để tìm giao điểm của một đoạn với một trong các mặt đó ta cần tìm phương trình cho mặt phẳng chứa các mặt của không gian quan sát. Tuy nhiên, điều này trở nên không cần thiết nếu chúng ta biến đổi không gian quan sát trước khi clipping đến một hình hộp thông thường.
Clipping bởi một hình hộp thông thường thì đơn giản hơn bởi vì mỗi mặt bây giờ vuông góc với một trong các trục tọa độ. Như được trình bày trong hình 6-26, đỉnh và đáy của một không gian quan sát như thế là các mặt phẳng của hằng y, các mặt là các mặt phẳng của hằng x, và các mặt gần và xa có một giá trị z được xác định trước. Ví dụ, tất cả các đoạn thẳng cắt mặt trên đỉnh của hình hộp, bây giờ sẽ có giá trị tọa độ y của mặt đó. Thêm vào đó, để làm đơn giản hóa các thao tác clipping, việc biến đổi thành một hình hộp thông thường làm rút ngắn quá trình xử lý chiếu thành một phép chiếu trực giao đơn giản. Chúng ta đầu tiên xem xét làm thế nào để biến đổi một không gian quan sát thành một hình hộp thông thường, sau đó thảo luận về thao tác chiếu.
Trong trường hợp của một phép chiếu song song trực giao, không gian quan sát đã là một hình hộp chữ nhật ngay từ đầu. Đối với phép chiếu song song xiên, chúng ta làm biến dạng không gian quan sát để làm cho cùng phương hướng chiếu với hướng vector pháp tuyến của mặt phẳng quan sát, N. Phép biến dạng này mang các mặt của không gian quan sát hình hộp thành mặt quan sát, như trong hình 6-27.
Đối với không gian quan sát trong một phép chiếu phối cảnh, phép biến dạng và biến đổi tỷ lệ được cần để tạo ra hình hộp chữ nhật. Chúng ta đầu tiên làm biến dạng theo phương x và y để mang tâm chiếu đặt lên đường thẳng vuông góc tại tâm cửa sổ (Hình 6-28). Với đỉnh tại điểm này, các mặt đối diện của hình chóp cụt (trừ hai mặt gần, xa, ta có trái đối với phải, đỉnh đối với đáy) có cùng kích thước. Chúng ta sau đó áp dụng phép biến đổi tỷ lệ để biến đổi các mặt của hình chóp cụt hành các mặt chữ nhật của một hình hộp thông thường.
Hình 6-29 trình bày một quang cảnh bên sườn của hình chóp cụt đối với phép chiếu song song. Để biến đổi hình chóp cụt này thành hình chữ nhật thông thường với chiều cao bằng với chiều cao cửa sổ, chúng ta áp dụng một phép biến đổi tỷ lệ liên hệ với điểm cố định (xF, yF, 0) ở tâm cửa sổ. Phép biến đổi này phải biến đổi theo tỷ lệ giữa các điểm trong hình chóp ở xa cửa sổ hơn so với các điểm ở gần cửa sổ hơn để mang chúng vào trong vùng hình hộp. Thực tế, hệ số tỷ lệ được cần sẽ tỷ lệ nghịch với khoảng cách đến cửa sổ. Đối với một tâm chiếu ở khoảng cách d phía sau cửa sổ, hệ số tỷ lệ được cần là d/(z+d), với z được xem như khoảng cách từ điểm đến cửa sổ. Ma trận cho phép biến đổi tỷ lệ này là
S0000S000010(1−S)xF(1−S)yF01 size 12{ left [ matrix { S {} # 0 {} # 0 {} # 0 {} ## 0 {} # S {} # 0 {} # 0 {} ## 0 {} # 0 {} # 1 {} # 0 {} ## ( 1 - S ) x rSub { size 8{F} } {} # ( 1 - S ) y rSub { size 8{F} } {} # 0 {} # 1{} } right ]} {} (6-13)
Ở đây hệ số tỷ lệ là S = d(z + d). Tất cả các giá trị tọa độ x và y trong cảnh được biến đổi tỷ lệ bởi phép biến đổi này. Các điểm trong không gian này được ánh xạ thành các điểm trong hình hộp mà không có sự thay đổi giá trị của z (hình 6-29)
Việc chuyển đổi thành một hình hộp còn có một lợi ích quan trọng khác. Các phép biến đổi được áp dụng thực hiện một số lượng lớn công việc cần thiết để chiếu các điểm nguyên thủy lên mặt phẳng chiếu. Ví dụ, phép biến đổi để chuyển hình chóp thành một hình hộp nhất thiết phải thực hiện phép chiếu phối cảnh. Các vị trí tọa độ được biến đổi sang các giá trị chiếu x và y, tuy nhiên ta giữ nguyên các giá trị khác không z. Các điểm nằm trong phạm vi các giá trị z của hai mặt gần và xa có thể được chiếu bằng cách đơn giản vứt bỏ tọa độ z. Vì thế bằng việc biến đổi không gian quan sát thành hình hộp thông thường, thao tác chiếu được rút gọn thành một phép chiếu trực giao đơn giản.
Chúng ta có thể làm các thao tác quan sát hiệu quả hơn. Việc biến đổi không gian quan sát thành hình hộp thông thường (cái được làm tương tự như thao tác chiếu) xảy ra liền sau việc ánh xạ từ tọa độ thế giới thực sang hệ tọa độ quan sát. Nếu chúng ta kết hợp các ma trận lại để làm một lúc một dãy các thao tác này, mỗi vị trí tọa độ có thể được chuyển từ vị trí của nó trong tọa độ thế giới thực sang vị trí tương ứng trong hình hộp chỉ là một bước thực hiện.
Vài gói đồ họa thực hiện việc clipping bằng cách dùng hình hộp thông thường như vừa được trình bày. Các phần của đối tượng trong phạm vi hình hộp được chiếu đến mặt trước (front plane) và sau đó được ánh xạ đến vùng quan sát hai chiều.
Các gói đồ họa khác thì ánh xạ hình hộp này vào một hình lập phương đơn vị (unit cube) (hình 6-30) trước khi clipping và chiếu.
Hình lập phương đơn vị là một không gian được xác định bởi các mặt sau:
x =0, x= 1, y = 0, y = 1, z = 0, z = 1 (6-14)
Vì hình lập phương đơn vị được định nghĩa bởi các giá trị trong đoạn [0..1], nó có thể được xem như một không gian quan sát chuẩn hóa (normalized view volume). Cũng như với hình hộp, khi các thành phần nằm trong không gian vừa được ánh xạ đến mặt trước (front plane), các điểm đó sẽ được ánh xạ đến một vùng quan sát hai chiều.
Như một chọn lựa khác, hình hộp thông thường, được xác định bởi cửa sổ mặt quan sát, có thể được ánh xạ đến một vùng quan sát ba chiều(three-dimensional viewport) trước khi clipping. Vùng quan sát này là một hình hộp thông thường được định nghĩa trong hệ tọa độ chuẩn hóa. Việc ánh xạ từ cửa sổ-đến–vùng quan sát trong không gian ba chiều cần được thực hiện với một phép biến đổi kết hợp tỷ lệ và tịnh tiến tương tự như với việc ánh xạ từ cửa sổ-đến–vùng quan sát trong không gian hai chiều. Chúng ta có thể biểu diễn ma trận biến đổi ba chiều của tập các thao tác này như sau:
Dx0000Dy0000Dz0KxKyKz1 size 12{ left [ matrix { D rSub { size 8{x} } {} # 0 {} # 0 {} # 0 {} ## 0 {} # D rSub { size 8{y} } {} # 0 {} # 0 {} ## 0 {} # 0 {} # D rSub { size 8{z} } {} # 0 {} ## K rSub { size 8{x} } {} # K rSub { size 8{y} } {} # K rSub { size 8{z} } {} # 1{} } right ]} {} (6-15)
Các tham số Dx, Dy, và Dz là các tỷ lệ về kích thước của vùng quan sát so với không gian quan sát hình hộp theo các hướng x, y, và z (xem hình 6-31):
Dx=xvmax−xvminxwmax−xwmin size 12{D rSub { size 8{x} } = { { ital "xv" rSub { size 8{"max"} } - ital "xv" rSub { size 8{"min"} } } over { ital "xw" rSub { size 8{"max"} } - ital "xw" rSub { size 8{"min"} } } } } {}Dy=yvmax−yvminywmax−ywmin size 12{D rSub { size 8{y} } = { { ital "yv" rSub { size 8{"max"} } - ital "yv" rSub { size 8{"min"} } } over { ital "yw" rSub { size 8{"max"} } - ital "yw" rSub { size 8{"min"} } } } } {} (6-16)
ở đây các biên của không gian quan sát được xây dựng bởi các giới hạn cửa sổ (xwmin, xwmax, ywmin, ywmax), và các vị trí dn và df của các mặt gần và xa. Các biên của vùng quan sát được thiết đặt với các giá trị tọa độ xvmin, xvmax, yvmin, yvmax, zvmin, và zvmax. Các tham số bổ sung Kx, Ky, và Kz trong phép biến đổi là:
Kx = xvmin – xwmin * Dx
Ky = yvmin – ywmin * Dy (6-17) Kz = zvmin – dn * Dz
Việc ánh xạ từ cửa sổ-đến-vùng quan sát được thực hiện trước khi clipping như trong hình 6-32.
Thuận lợi của cách làm này là ma trận biến đổi chuẩn hóa ( từ không gian quan sát-đến-ánh xạ vào vùng quan sát) có thể được kết hợp với ma trận biến đổi các tọa độ trong hệ thế giới thực sang các vị trí trong hình hộp. Ma trận kết quả biến đổi các vị trí trong phạm vi hệ tọa độ thế thực thành các điểm chiếu x và y trong vùng quan sát. Mỗi tọa độ của cảnh gốc cần được tịnh tiến chỉ một lần. Các điểm được tịnh tiến này bị clipping bởi vùng quan sát. Các giá trị x và y của các điểm trong không gian quan sát sau đó được biến đổi đến các hệ tọa độ thiết bị để hiển thị (xem hình 6-33).
Clipping dựa vào một không gian quan sát được chuẩn hóa
Các bề mặt có thể bị cắt khỏi các biên vùng quan sát bằng các thủ đơn giản hơn trong đồ họa hai chiều. Dù là các thủ tục clipping đường hay cliping đa giác đều có thể được sửa lại cho thích hợp với clipping một vùng quan sát trong ba chiều. Các mặt cong được xử lý bằng cách dùng các phương trình mặt biên kết hợp với việc xác định đường cắt với các mặt của hình hộp. Bây giờ chúng ta xem các thủ tục clipping hai chiều được thay đổi thế nào để dùng cho ba chiều.
Các khái niệm trong hai chiều về các mã vùng có thể được mở rộng cho ba chiều bằng việc xem xét các vị trí phía trước và phía sau vùng quan sát ba chiều, cũng như các vị trị bên trái, bên phải, phía dưới, hoặc phía trên không gian. Đối với clipping hai chiều, chúng ta đã dùng mã vùng nhị phân bốn bit để xác định vị trí của các điểm đầu mút đoạn thẳng có quan hệ với các biên cửa sổ thế nào. Đối với các điểm ba chiều, chúng ta cần mở rộng mã vùng thành sáu bit. Mỗi điểm trong cảnh khi đó được gán một mã vùng sáu bit để xác định mối quan hệ với các mặt biên của vùng quan sát. Với một điểm đầu mút đoạn thẳng ở vị trí (x, y, z), ta gán các vị trí bit trong mã vùng từ phải sang trái như sau:
bit 1 =1 nếu x < xvmin (left)
bit 2 =1 nếu x > xvmax (right)
bit 3 =1 nếu y < yvmin (below)
bit 4 =1 nếu y > yvmax (above)
bit 5 =1 nếu z < zvmin (front)
bit 6 =1 nếu z > zvmax (back)
Ví dụ, một mã vùng 101000 chỉ ra rằng một điểm thì ở trên và phía sau vùng quan sát, trong khi đó mã vùng 000000 chỉ ra rằng một điểm nằm trong không gian quan sát.
Một đoạn thẳng có thể được xác định ngay là hoàn toàn nằm trong vùng quan sát nếu cả hai điểm đầu mút của nó đều có mã vùng là 000000. Nếu điểm đầu mút nào không có mã vùng 000000, chúng ta thực hiện phép logic and lên hai mã đầu mút. Kết quả phép toán and sẽ khác 0 đối với các đoạn thẳng hoàn toàn nằm ngoài không gian quan sát. Nếu chúng ta không thể xác định được một đoạn thẳng là hoàn toàn nằm trong hay hoàn toàn nằm ngoài không gian, ta sẽ đi tìm giao điểm với các mặt biên của không gian.
Như trong clipping đường hai chiều, chúng ta dùng các giao điểm được tính của đường với các mặt của vùng quan sát để xác định xem phần nào của đoạn thẳng bị vứt bỏ. Phần được giữ lại của đoạn sẽ được kiểm tra với các mặt khác, và chúng ta tiếp tục đến khi xác định được là đoạn bị vứt bỏ hoàn toàn hay đến khi thấy nó nằm bên trong không gian.
Việc xác định các giao điểm trong clipping đường, cũng như trong các thủ tục clipping đa giác, nên được làm sao cho hiệu quả. Các phương trình của các đoạn ba chiều được biểu diễn thuận tiện theo dạng tham số. Với một đoạn có hai điểm đầu mút P1 = (x1, y1, z1) và P2 = (x2, y2, z2), chúng ta có thể viết phương trình tham số là
x = x1 + (x2 – x1)u
y = y1 + (y2 – y1)u (6-18)
z = z1 + (z2 – z1)u
Tọa độ (x, y, z) biểu diễn cho một điểm bất kỳ trên đoạn thẳng giữa hai điểm đầu mút, và các tham số u thay đổi từ 0 đến 1. Giá trị u =0 tạo ra điểm P1, u=1 cho điểm P2.
Để tìm giao điểm của một đường với một mặt của vùng quan sát, chúng ta thay thế giá trị tọa độ, cái là giá trị hằng của mặt đó, vào phương trình tham số 12-18 và giải tìm u. Cho trường hợp này, giả sử chúng ta đang xét một đường với mặt trước (front plane) của vùng quan sát. Khi đó z = zvmin, và
u=zvmin−z1z2−z1 size 12{u= { { ital "zv" rSub { size 8{"min"} } - z rSub { size 8{1} } } over {z rSub { size 8{2} } - z rSub { size 8{1} } } } } {} (6-19)
Khi giá trị u được tính bởi phương trình 12-19 không nằm trong đoạn [0..1], đều này có nghĩa là đoạn thẳng không cắt mặt trước ở bất kỳ điểm nào nằm giữa hai đầu mút P1 và P2 (đường A trong hình 6-34). Nếu giá trị u được tính nằm trong đoạn [0..1], chúng ta tính tọa độ giao điểm x và y như sau
x1=x1+(x2−x1)zvmin−z1z2−z1 size 12{x"" lSub { size 8{1} } =x rSub { size 8{1} } + ( x rSub { size 8{2} } - x rSub { size 8{1} } ) left ( { { ital "zv" rSub { size 8{"min"} } - z rSub { size 8{1} } } over {z rSub { size 8{2} } - z rSub { size 8{1} } } } right )} {} (6-20)
Nếu x1 hoặc y1 không nằm trong phạm vi các biên của vùng quan sát, khi đó đường thẳng này cắt mặt trước ở một điểm ở xa nào đó trên biên của không gian (đường B trong hình 6-34).
Thuật toán clipping đường Liang-Basky được thảo luận trong Chương 6 có thể được mở rộng cho ba chiều bằng việc xem xét các hiệu ứng (effect) của các mặt gần và xa. Các mặt này kết hợp với hai phép kiểm tra bổ sung trong quá trình xử lý tham số giao điểm u1 và u2.
Các chip đồ họa, dùng các kỹ thuật mạch điện VLSI (very large scale integration), được dùng trong nhiều hệ thống để thực hiện các thao tác xem ảnh. Các chip theo yêu cầu khách hàng này được thiết kế để biến đổi, clipping, và chiếu các đối tượng đến thiết bị xuất cho cả hai ứng dụng: hai chiều và ba chiều.
Hình 6-35 trình bày các thành phần của một loại chip đồ họa. Các chip được tổ chức vào một đường ống (pipeline) để thực hiện các thao tác biến đổi, clipping, và biến đổi hệ tọa độ. Bốn chip đầu tiên được cung cấp cho các phép toán ma trận liên quan đến biến đổi tỷ lệ, tịnh tiến, quay, và các phép biến đổi cần cho các phép chiếu trực giao và phối cảnh. Mỗi trong số sáu chip kế tiếp thực hiện clipping bởi các biên của vùng quan sát. Bốn trong số các chip này được dùng trong các ứng dụng hai chiều, và hai cái còn lại được cần cho việc clipping bởi các mặt gần và xa của vùng quan sát ba chiều. Hai chip sau cùng trong đường ống biến đổi hệ tọa độ vùng quan sát sang hệ tọa độ thiết bị xuất.
Chương trình ví dụ sau đây minh họa việc sinh ra ảnh bằng chiếu phối cảnh và phép chiếu song song của một đối tượng.
Program Polycon; Uses Crt, Graph, Graph3d; Const MaxSommet = 50; MaxFaces = 30; MaxAretes = 10; IncAng = 5; IncRho = 1; IncEcran = 20; Var St : Array [1..MaxSommet, 1..3] of real; Fc : Array [1..MaxFaces,0..MaxAretes] of integer; fff : Array [1..MaxFaces] of boolean; O1, O2, O3 : Real; NF : Integer; Pointille : Boolean; Procedure VueDeDepart; Begin Projection := Perspective; Rho := 15; Theta := 0; Phi := 0; DE := 400; Pointille := True; End; Procedure LectureSommets; Begin St[1,1] := 2; St[1,2] := 2.7; St[1,3] := -2; St[2,1] := 2; St[2,2] := 2.7; St[2,3] := 0; St[3,1] := 2; St[3,2] := -2.7; St[3,3] := 0; St[4,1] := 2; St[4,2] := -2.7; St[4,3] := -2; St[5,1] := -2; St[5,2] := -2.7; St[5,3] := -2; St[6,1] := -2; St[6,2] := 2.7; St[6,3] := -2; St[7,1] := -2; St[7,2] := 2.7; St[7,3] := 0; St[8,1] := 0; St[8,2] := 1.7; St[8,3] := 2; St[9,1] := 0; St[9,2] := -1.7; St[9,3] := 2; St[10,1] := -2; St[10,2] := -2.7; St[10,3] := 0; End; Procedure LectureFaces; Begin NF := 9; FC[1,0] := 4; FC[1,1] := 1; FC[1,2] := 2; FC[1,3] := 3; FC[1,4] := 4; FC[2,0] := 4; FC[2,1] := 1; FC[2,2] := 6; FC[2,3] := 7; FC[2,4] := 2; FC[3,0] := 3; FC[3,1] := 2; FC[3,2] := 7; FC[3,3] := 8; FC[4,0] := 4; FC[4,1] := 2; FC[4,2] := 8; FC[4,3] := 9; FC[4,4] := 3; FC[5,0] := 4; FC[5,1] := 1; FC[5,2] := 4; FC[5,3] := 5; FC[5,4] := 6; FC[6,0] := 4; FC[6,1] := 7; FC[6,2] :=10; FC[6,3] := 9; FC[6,4] := 8; FC[7,0] := 3; FC[7,1] := 3; FC[7,2] := 9; FC[7,3] :=10; FC[8,0] := 4; FC[8,1] :=10; FC[8,2] := 5; FC[8,3] := 4; FC[8,4] := 3; FC[9,0] := 4; FC[9,1] := 5; FC[9,2] :=10; FC[9,3] := 7; FC[9,4] := 6; End; ProCedure VecteurVision(St1, St2, St3:integer; Var V1, V2, V3 : rEal); Begin V1 := O1 - St[St1,1]; V2 := O2 - St[St1,2]; V3 := O3 - St[St1,3]; End; Procedure VecteurNormal(St1, ST2, St3:integer; Var N1, N2, N3 : Real); Var P1, P2, P3, Q1, Q2, Q3 : Real; Begin P1 := ST[St2,1] - ST[St1,1]; P2 := ST[St2,2] - ST[St1,2]; P3 := ST[St2,3] - ST[St1,3]; Q1 := ST[St3,1] - ST[St1,1]; Q2 := ST[St3,2] - ST[St1,2]; Q3 := ST[St3,3] - ST[St1,3]; N1 := P2*Q3 - Q2*P3; N2 := P3*Q1 - P1*Q3; N3 := P1*Q2 - Q1*P2; End; Function ProDuitScalaire(V1, V2, V3, N1, N2, N3: Real):Real; Begin ProDuitScalaire := V1*N1 + V2*N2 + V3*N3 End; Procedure DessineObject; Var F, St1, St2, St3, NS, No : Integer; V1, V2, V3, N1, N2, N3 : Real; X, Y, Z, XO, YO, ZO : Real; Procedure DessineFace; Var S : Integer; Begin NS := FC[f,0]; For S := 1 To NS Do Begin No := FC[F,S]; X := ST[No,1]; Y := ST[No,2]; Z := ST[No,3]; If S = 1 Then Begin DePlaceEn(X, Y, Z); XO := X; YO := Y; ZO := Z; End Else Tracevers(X, Y, Z); End; TraceVers(XO, YO, ZO); End; Begin FillChar(FFF, Sizeof(fff), #0); SetLineStyle(DottedLn, 0, NormWidth); SetColor(LightRed); For F := 1 to NF Do Begin St1 := Fc[F,1]; St2 := Fc[F,2]; St3 := Fc[F,3]; VecteurVision(St1, St2, St3, V1, V2, V3); VecteurNormal(St1, St2, St3, N1, N2, N3); If ProDuitScalaire(V1, V2, V3, N1, N2, N3) <= 0 then Begin If Pointille Then DessineFace; FFF[f] := True; End; End; SetLineStyle(SolidLn, 0, NormWidth); SetColor(White); For F := 1 to Nf Do If Not FFF[F] Then DessineFace; End; Procedure CoordonneeOeil; Begin InitialiseProjection; O1 := Rho * Aux7; O2 := Rho * Aux8; O3 := Rho * Aux2; End; Procedure Affichage; Var S1, S2, S3, S4, S5 : String; Begin Cloture(0, MaxX, 0, 23); ClearViewPort; SetTextStyle(SmallFont, HorizDir, 4); SetColor(14); Str(Theta:3:1, S2); Str(Phi:3:1, S3); Str(DE:3:1, S4); IF Projection = Perspective Then Begin Str(Rho:3:1, S1); OutTextXY(80, 0,'Chieu Phoi Canh: Rho = '+S1+' Theta = '+S2+ +' Phi = '+S3+' Ecran = '+S4); End Else OutTextXY(80,0, 'Chieu Song Song: Rho = infini Theta = '+S2+ +' Phi = '+S3+' Ecran = '+S4); Str(MaxX, S1); Str(MaxY, S2); OutTextXY(5, 0, S1+' x '+S2); OutTextXY(5, 12, 'Control: ArrowKey, E, A, +, -, T, C, F-Fine'); Cloture(0, MaxX, 24, MaxY); End; Procedure Commandes; Const RhoPara = 1e20; Var RhoPersp, DEPersp, DEPara : Real; Ch : Char; Begin VueDeDepart; DEPara := 30; CoorDonneeOeil; DessineObject; Affichage; RePeat Ch := UpCase(Readkey); IF Ch = #0 Then Ch := UpCase(Readkey); If Ord(Ch) In [72,80,75,77,69,65,43,45,84,67,61,95] Then Begin ClearDevice; Case Ord(Ch) Of 72 : Phi := Phi + IncAng; 80 : Phi := Phi - IncAng; 75 : Theta := Theta + IncAng; 77 : Theta := Theta - IncAng; 69 : Rho := Rho + IncRho; 65 : Rho := Rho - IncRho; 43,61 : DE := DE + IncEcran; 45,95 : DE := DE - IncEcran; 84 : Pointille := not (Pointille); 67 : If Projection = Perspective Then Begin RhoPersp := Rho; DEPersp := DE; Projection := Parallele; Rho := RhoPara; DE := DEPara; End Else Begin DEPara := DE; Projection := Perspective; Rho := RhoPersp; De := DePersp; End; End; CoordonneeOeil; DessineObject; Affichage End; Until (CH = 'F') Or (ch = #13) Or (ch =#27); EcranTexte; End; Begin EcranGraphique('); Cloture(0, MaxX, 0, MaxY); LectureSommets; LectureFaces; VueDeDepart; Commandes; End.
Ở điểm này, chúng ta thảo luận tập trung vào phần trung tâm của thao tác xem ảnh (viewing operation), thường được nói đến như phép biến đổi hệ quan sát (viewing transformation). Điều này gồm việc ánh xạ đến hệ quan sát, chiếu, và clipping. Chúng ta bây giờ đề cập đến các thao tác mà chúng có thể đến trước hoặc sau phép biến đổi hệ quan sát và làm ảnh hưởng đến hình ảnh sau cùng của một đối tượng.
Các gói đồ họa (cái cho phép các biến đổi ma trận) được kết hợp với các giai đoạn dùng đến ma trận trước khi thực biến đổi hệ quan sát. Chúng ta có thể nghĩ về điều này như việc quay hoặc bố trí lại đối tượng trước camera. Nếu một số giai đoạn phải được biến đổi, mỗi giai đoạn được biến đổi bằng các ma trận thích hợp, và tập hợp các đối tượng sau đó được chiếu bởi phép biến đổi hệ quan sát để hình thành ảnh cuối cùng. Khi ma trận biến đổi liên hệ đến bất kỳ giai đoạn bị thay đổi nào, toàn bộ quá trình xử lý xem ảnh phải được lặp lại.
Trong vài trường hợp, người dùng chỉ muốn thay đổi hình dạng bên ngoài (appearance) của cảnh trên thiết bị xuất. Có thể là các kỹ sư muốn quay mô hình (không có mặt trước để lộ rõ cấu trúc bên trong - cutaway) của vài bộ phận ba chiều vừa được chiếu. Hoặc có thể một ứng dụng họat hình cần di chuyển một đối tượng từ vùng này đến vùng khác trên màn ảnh. Kỹ sư có thể dùng các giai đoạn biến đổi hoặc yêu cầu một cảnh mới của phần dùng các tham số quan sát mới. Trong các trường hợp này, một cuộc hành trình thứ hai xuyên qua các đường ống quan sát được cần đến. Trong các trường hợp như thế, các hệ đồ họa đôi khi cung cấp các phép biến đổi ảnh(image transformation): các thay đổi được áp dụng đến phép chiếu hai chiều cuối cùng. Các phép biến đổi ảnh được áp dụng trong hai chiều, cho phép người dùng đặt lại vị trí một đối tượng trên màn hình mà không làm thay đổi hoàn toàn hình ảnh khi muốn xem mặt sau của nó. Vì những thay đổi này không cần thiết biến đổi hệ quan sát hay clipping ba chiều, nên chúng được thực hiện nhanh chóng.
Sinh viên cần nắm được các nội dung cốt lõi của chương bao gồm các phép chiếu song song và phối cảnh. Ưu điểm của phép chiếu song song là có thể xác định được kích thước chính xác của các đối tượng trên ảnh thông qua các thông tin 2 chiều còn lại. Nhược điểm của phép chiếu song song là hình ảnh không thật do không có độ sâu. Ngược lại, phép chiếu phối cảnh tạo ra các hình ảnh thực hơn nhưng không bảo toàn về chiều của các mối liên hệ.
1. Cài đặt một khối đa diện (ba chiều với các mặt phẳng) nằm trong góc 1/8 đầu tiên của hệ tọa độ theo quy tắc bàn tay trái (tất cả các giá trị định nghĩa các đỉnh của đối tượng là dương). Phát triển một thủ tục (procedure) để thực hiện phép chiếu song song (được xác định bất kỳ) lên mặt phẳng xy.
2. Mở rộng thủ tục của bài tập 1 để cài đặt được các quang cảnh khác nhau của đối tượng bằng cách: đầu tiên, thực hiện các phép quay đối tượng quanh các trục quay (là các đường thẳng song song với với các mặt chiếu), sau đó chiếu đối tượng lên bề mặt quan sát.
3. Cài đặt thủ tục trong bài lập 1 để sinh ra một phép chiếu phối cảnh một điểm của đối tượng lên bề mặt chiếu, dùng phương trình 6-10 và khoảng cách quang sát d được xác định tùy ý dọc theo trục z âm.
4. Mở rộng ma trận biến đổi trong phương trình 6-10 để tâm chiếu có thể được chọn ở vị trí (x, y, -d) bất kỳ phía sau mặt phẳng chiếu.
5. Cài đặt thủ tục trong bài tập 1 để sinh ra một phép chiếu phối cảnh một điểm của đối tượng lên mặt phẳng chiếu, dùng ma trận biến đổi của bài tập 4.
6. Giả sử rằng một bề mặt chiếu được định nghĩa là mặt xy của hệ tọa độ quy tắc bàn tay trái, cài đặt sự định nghĩa tọa độ của một hình hộp chữ nhật trong hệ tọa độ này để nó nằm phía trước mặt phẳng chiếu. Dùng ma trận biến đổi của bài tập 4, hướng của khối sao cho thu được phép chiếu phối cảnh một điểm và hai điểm. Viết một chương trình để hiển thị hai quang cảnh phối cảnh này. Cái nào trong hai quang cảnh trên thực hơn.
7. Mở rộng thủ tục trong bài tập 6 để thu được một phép chiếu phối cảnh ba điểm. Bạn có thể phát hiện ra sự khác nhau lớn giữa phép chiếu hai điểm và ba điểm khống?
8. Phát triển một tập các thủ tục để biến đổi một mô tả đối tượng trong các hệ tọa độ thế giới thực sang các hệ quan sát (đã được xác định). Tức là, cài đặt hàm (function) view_matrix, được cung cấp các tọa độ của điểm quan sát, pháp vector, và vector nhìn lên (view up vector).
9. Mở rộng các thủ tục trong bài tập 8 để thu được một phép chiếu song song (đã được xác định) của đối tượng lên một cửa sổ được định nghĩa trên mặt xy của hệ quan sát. Sau đó biến đổi cửa sổ đến một vùng quan sát trên màn ảnh. Giả sử rằng các đối tượng thì ở phía trước mặt phẳng quan sát và rằng không có việc clipping bởi một không gian quan sát nào được thực hiện.
10. Mở rộng các thủ tục trong bài tập 8 để thu được một phép chiếu phối cảnh (đã được xác định) của đối tượng lên một cửa sổ được định nghĩa trên mặt xy của hệ quan sát. Sau đó biến đổi cửa sổ đến một vùng vùng quan sát trên màn ảnh. Giả sử rằng các đối tượng thì ở phía trước mặt phẳng quan sát và rằng không có việc clipping bởi một không gian quan sát nào được thực hiện.
11. Nghĩ ra một thuật toán để cắt (clip) các đối tượng trong một quang cảnh bởi một hình chóp cụt đã được định nghĩa. So sánh các phép toán được cần trong thuật toán này với các phép toán được cần trong thuật toán cắt quang cảnh bởi một hình hộp thông thường.
12. Viết một chương trình thực hiện chiếu phối cảnh một hình chóp cụt thành một hình hộp thông thường.
13. Thay đổi thuật toán clipping đường Liang-Barsky hai chiều để cắt (clip) các đường ba chiều bởi một bởi một hình hộp (đã được xác định).
14. Mở rộng thuật toán của bài tập 13 để cắt một khối đa diện (đã được xác định) bởi một hình hộp.
15. Đối với cả hai phép chiếu song song và phối cảnh, hãy thảo luận các điều kiện để việc clipping ba chiều được thực hiện trước, phép chiếu lên mặt phẳng chiếu được thực hiện sau có thể tương đương với việc chiếu trước rồi thực hiện clipping sau.
16. Dùng bất kỳ thủ tục clipping nào, viết một chương trình thực hiện một phép biến đổi hệ quan sát hoàn chỉnh từ tọa độ thế giới thực sang vùng quan sát cho một phép chiếu song song trực giao của một đối tượng.
17. Mở rộng thủ tục của bài tập 16 để thực hiện một phép chiếu song song (được xác định bất kỳ) của một đối tượng lên một vùng quan sát đã được định nghĩa.
18. Phát triển một chương trình để cài đặt một hướng quan sát hoàn chỉnh cho một phép chiếu phối cảnh. Chương trình phải biến đổi sự xác định hệ tọa độ thế giới thực của một đối tượng lên một vùng quan sát hai chiều đã được định nghĩa để hiển thị lên một phần của màn hình video.
19. Cài đặt các hàm set_view_representation và set_view_index để thực hiện một hướng chiếu (được xác định bất kỳ) trên một đối tượng được định nghĩa trong hệ tọa độ thế giới thực để thu được sự hiển thị vùng quan sát trên màn hình.
20. Thay đổi các thủ tục trong bài tập 19 để cho phép clipping bởi mặt phẳng của không gian quan sát bất kỳ. Điều này có thể được thực hiện với các tham số bổ sung đến tập các điều kiện clipping cho mỗi mặt phẳng là cắt (clip) hoặc không cắt (noclip).