Tải bản đầy đủ (.docx) (38 trang)

BÁO CÁO THỰC TẬP-CHỦ ĐỀ TÌM HIỂU VỀ PHÉP NHÌN TRONG KHÔNG GIAN BA CHIỀU

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 (414.1 KB, 38 trang )

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN & TRUYỀN THÔNG
ĐẠI HỌC THÁI NGUYÊN
BÁO CÁO THỰC TẬP CHUYÊN
NGHÀNH
CHỦ ĐỀ:TÌM HIỂU VỀ PHÉP NHÌN TRONG
KHÔNG GIAN BA CHIỀU
Giáo viên hướng dẫn: Nguyễn Thị Thanh Nhàn
Sinh viên thực hiện: Hà Thị Lệ
LỜI MỞ ĐẦU
Có câu rằng “một hình ảnh bằng cả nghìn lời nói ”. Điều đó thật không thể phủ
nhận. Và rõ ràng là nếu hiển thị thông tin chỉ với các ký hiệu, chữ cái, chữ số không thôi
thì không thể hấp dẫn và dễ hiểu như khi có thêm biểu diễn đồ họa Kỹ thuật đồ hoạ cũng
là công cụ không thể thiếu trong các ngành khoa học kỹ thuật, giáo dục, nghệ thuật, giải
trí, quảng cáo…(để diễn đạt máy móc thiết bị, kiến trúc, cấu trúc cơ thể, thông tin thiên
văn địa lý, hình ảnh minh hoạ ). Chính vì vậy, đồ họa là một vấn đề được quan tâm trong
ngành công nghệ thông tin.
Cùng với sự phát triển của tin học, kỹ thuật đồ họa trên máy vi tính, ngày càng trở
nên tinh xảo. Giao diện các phần mềm ngày nay trở nên thân thiện, đẹp mắt nhờ các thể
hiện đồ họa. Sự hổ trợ của tin học cho các ngành khác trở nên đắc lực hơn nhờ khả năng
đồ họa vi tính. Và thế giới thực thì được biểu diễn một cách sinh động, linh hoạt, đầy
màu sắc bằng không gian ba chiều.
Trong thành công của kỹ thuật đồ họa ngày nay không thể không nói đến sự phát
triển vượt bậc của tốc độ phần cứng lẫn hệ điều hành. Nhưng bản thân kỹ thuật đồ họa thì
có bước tiến nhảy vọt từ những phép tính toán học phức tạp đến những thư viện đồ họa
được tạo sẵn để phục vụ cho cuộc sống công nghiệp hóa , hiện đại hóa ngày nay. Như
không gian 3 chiều từ khi xuất hiện đã dần dần được sử dụng vào các lĩnh vực như: công
nghệ thông tin, điện ảnh ,giáo dục
Mục tiêu của bài thực tập chuyên nghành này là tìm hiểu về phép nhìn trong
không gian ba chiều .đồng thời cũng giới thiệu đôi nét về thư viện đồ họa OpenGL trong
việc minh họa các giải thuật đồ họa ba chiều.
Tuy nhiên, đề tài không thể không tránh khỏi những hạn chế và thiếu sót, nên rất


mong được sự chỉ bảo, góp ý của quý Thầy Cô và bạn bè.
Tài liệu tham khảo thêm
* GLSL - Ngôn ngữ chuyển màu OpenGL
* Cg - Ngôn ngữ chuyển màu của hãng nVidia dùng cho OpenGL
* Java OpenGL - OpenGL cho Java
* OpenGL ES - OpenGL for embedded systems
* OpenAL - Thư viện âm thanh tự do thiết kế với mục địch dùng chung với OpenGL.
* OpenSL ES - Một thư viện âm thanh khác
* Graphics pipeline
NỘI DUNG
Giới thiệu về không gian 3 chiều, Thư viện đồ họa OpenGl
1.Tìm hiểu về camera
2.Hình chiếu phối cảnh của vật thể 3D
3.Phép nhìn lập thể
GIỚI THIỆU
 Không gian 3 chiều:
Mô hình hóa ba chiều (3D) là một lãnh vực phát triển nhanh chóng là một cuộc cách
mạng trong việc ứng dụng máy tính vào quá trình thiết kế. Các phần mềm thiết kế 3D,
được bắt đầu sử dụng vào những năm 1980, ngày càng phổ biến trong công nghiệp.
các mô hình 3D không chỉ là vẽ một đối tượng mà là hình ảnh thực của vật thể.
 Thư viện đồ họa OpenGl:
OpenGL (tiếng Anh Open Graphics Library) là một tiêu chuẩn kỹ thuật đồ họa có mục
đích định ra một giao diện lập trình ứng dụng ( API)đồ họa 3 chiều. OpenGL cũng có thể
được dùng trong các ứng dụng đồ họa 2 chiều. Giao diện lập trình này chứa khoảng
250 hàm để vẽ các cảnh phức tạp từ những hàm đơn giản. Nó được dùng rộng rãi trong
các trò chơi điện tử. Ngoài ra nó còn dùng trong các ứng dụng CAD, thực tế ảo, mô
phỏng khoa học, mô phỏng thông tin,phát triển trò chơi.
Không gian trong OpenGL được miêu tả qua hình học xạ ảnh. Một điểm trong không
gian này có tất cả 4 tọa độ. Cách thể hiện các điểm trong không gian bằng 4 tọa độ cho
phép xử lý các điểm vô tận một cách tổng quát. Vì vậy mã nguồn các ứng dụng đã được

đơn giản hóa đi nhiều.
Với giao diện lập trình mạnh mẽ, OpenGL cho phép tạo các ứng dụng 3-D phức tạp với
độ tinh vi, chính xác cao, mà người thiết kế không phải đánh vật với các núi công thức
toán học và các mã nguồn phức tạp. Và do OpenGL là tiêu chuẩn công nghiệp, các ứng
dụng tạo từ nó dùng được trên các phần cứng và hệ điều hành khác nhau.
Các mục sau sẽ giới thiệu cách nhìn tổng quát về cách làm việc của OpenGL:
- Các phần tử đồ họa cơ bản và lệnh giới thiệu về các phần tử đồ họa cơ bản (primitive)
và sự thực hiện lệnh
- Cách làm việc của OpenGL cho biết các lọai thao tác đồ họa mà OpenGL kiểm soát
- Mô hình hoạt động nói về mô hình client/server cho việc thông dịch lệnh OpenGL
- Thao tác OpenGL cơ bản đưa ra một mô tả mức cao về cách OpenGL xử lý dữ liệu và
tạo ra hình ảnh tương ứng lên bộ điệm khung.
Các phần tử đồ họa cơ bản và lệnh:
Primitive được xác định bởi nhóm của một hay nhiều vertex là điểm trong không gian.
Mỗi vertex xác định một điểm, một đầu đoạn thẳng hay một đỉnh đa giác. Dữ liệu (bao
gồm tọa độ vertex, màu sắc, normal, texture và cờ xác định loại cạnh) kết hợi với vertex.
Khi xử lý primitive, mỗi cập vertex và dữ liệu liên kết với nó được sử lý độc lập với các
cập khác, theo thứ tự và cùng một phương pháp. Ngoại lệ duy nhất là trong trường hợp
khử phần khuất của primirite(clipping). Khi đó, dữ liệu vertex được sửa và các vertex
khác được tạo ra. Loại clipping tuỳ thuộc loại primirite mà nhóm vertex biểu diễn.
Các lệnh luôn luôn được xử lý theo thứ tự mà nó tiếp nhận, mặt dù có sự trì hoãn không
xác định trước khi lệnh có hiệu lực. Nghĩa là mỗi primirite được vẽ trọn vẹn trước khi
lệnh tiếp theo có hiệu lực.
Cách làm việc của OpenGL:
OpenGL là ngôn ngữ đồ họa theo thủ tục chứ không phải ngôn ngữ mô tả.Thay vì tả các
cảnh và cách chúng xuất hiện, OpenGL đưa ra các bước cần thiết để có được sự thể hiện
hay hiệu quả nhất định. Các “bước”này là các lời gọi đến giao diện lập trình ứng dụng
gồm xăp xỉ 120 lệnh và hàm. Chúng được dùng để vẽ các phần tử đồ họa cơ bản như
điểm, đường và đa giác trong không gian ba chiều. Ngoài ra, OpenGL còn hổ trợ chiếu
sáng, tô bóng, gán cấu trúc, tạo ảo giác chuyển động và các hiệu quả đặc biệt khác.

OpenGL không có các chức năng quản lý cửa sổ, tương tác với người dùng hay xuất
nhập file. Môi trường chủ (tức hệ điều hành) có các chức năng này và chịu trách nhiệm
thực hiện các biện pháp quản lý cho OpenGL.
Mô hình hoạt động:
Mô hình thông dịch lệnh OpenGL là client-server. Mã ứng dụng(vai trò client) đưa ra các
lệnh. Lệnh được thông dịch và sử lý bởi OpenGL (vai trò server). Server và client có thể
là trên cùng một máy tính khác nhau. Theo nghĩa này, OpenGL là network-transparent
(tạm dịch là mạng trong suốt). Server duy trì nhiều ngữ cảnh OpenGL, mỗi ngữ cảnh là
một trạng thái OpenGL. Client có thể nói với bất cứ ngữ cảnh nào. Giao thức mạng được
sử dụng có thể là độc lập hóa dựa trên giao thức mạng hiện có (tức OpenGL dùng trên
máy độc lập hay trên môi trường mạng). Không có lệnh OpenGL nào tiếp nhận việc nhập
dữ liệu trực tiếp từ người dùng.
Cuối cùng, hệ thống cửa sổ kiểm soát tác dụng của các lệnh OpenGL trên bộ
đệm khung qua các thao tác:
- Quyết định các phần của bộ đệm khung mà OpenGL có thể truy xuất tại thời điểm cho
phép.
- Truyền đạt cho OpenGL thông tin về cấu trúc các phần đó.
- Như vậy, không có lệnh OpenGL nào định dạng bộ đệm khung hay khởi tạo OpenGL.
Sự định dạng bộ đệm khung được thực hiện bên ngoài OpenGL trong sự liên kết với hệ
thống cửa sổ. Sự khởi tạo OpenGL được tiến hành khi hệ thống cấp phát cửa sổ cho việc
biểu diễn.
OpenGL được thiết kế nhằm thỏa mãn mục đích chính sau:
• Che giấu sự tuơng tác phức tạp với các bộ máy xúc tiến 3 chiều bằng cách đưa ra
một giao diện lập trình thống nhất.
• Che giấu các sự khác biệt giữa các phần cứng 3 chiều bằng cách bắt buộc các phần
cứng tương thích OpenGL phải hỗ trợ tất cả các chức năng của giao diện OpenGL.
Nếu cần, các chức năng chưa được hỗ trợ đầy đủ bởi phần cứng có thể được hỗ trợ
bằng phần mềm.
Các thao tác OpenGL cơ bản là nhận các nguyên hàm hình học như điểm, đường thẳng
và đa giác rồi chuyển thành các điểm đồ họa (pixel) trên màn hình. Điều này được thực

hiện bởi luồng ống dẫn đồ họa (graphics pipeline). Nó còn được gọi là bộ máy trạng thái
OpenGL. Đa số các lệnh OpenGL được dùng để tạo ra các hình học cơ bản đã gặp ở trên
hoặc là qui định cách chuyển đổi hình học trong bộ máy trạng thái OpenGL.
Các trò chơi được viết với OpenGL:
* City of Heroes
* City of Villains
* CounterStrike 1.6
* Doom 3
* ETQW
* Half-Life
CHƯƠNG I. TÌM HIỂU VỀ CAMERA
Các hệ thống sử dụng camera với mục đích giám sát , nhận dạng , an ninh, điều
khiển ngày càng phổ biến và được sử dụng rộng rãi.
 Cấu tạo:
Hình 1
- Một mắt nhìn được đặt ở vị trí nào đó trong không gian.
-Thể tích nhìn là một phần của hình chóp có đỉnh là mắt nhìn.Độ lớn của góc nhìn này là
do góc nhìn Ө quyết đinh.
-Hai mặt phẳng vuông góc với trục của camera là mặt phẳng gần và mặt phẳng xa.Hai
mặt phẳng này cắt hình chóp với thiết diện là hình chữ nhật ,những cửa sổ hình chữ nhật
này có hệ số tỉ lệ nhất định và có thể được thiết lập trong chương trình.OpenGL sẽ cắt
xén bất cứ phần nào của khung cảnh nằm ngoài thể tích nhìn.Điểm P nằm trong thể tích
nhìn được chiếu lên mặt phẳng nhìn thành điểm P’ giống như trong phần c .Trong phép
chiếu phối cảnh ,điểm P’ chính là giao điểm của đường thẳng đi qua mắt nhìn và điểm p
với mặt phẳng nhìn.Cuối cùng hình ảnh trên mặt phẳng nhìn đựơc ánh xạ lên khung nhìn
và được hiển thị trên màn hình (như trong phần c).
Hình2: camera và phép nhìn phối cảnh
1.2 Thiết lập thể tích nhìn:
Hình3:Camera khi ở vị trí mặc định của nó
Hình trên mô tả camera ở vị trí mặc định của nó với mắt nhìn ở gốc tọa độ ,trục của hình

chóp trùng với trục z,mắt nhìn theo hướng âm trục z.
Open GL cung cấp một cách làm đơn giản để thiết lập một camera từ chương trình.Thể
tích nhìn của camera được chứa trong ma trận phép chiếu của đường ống đồ họa .Ma trận
phép chiếu được thiết lập bằng cách dùng hàm gluperspective() với 4 đối số .Đoạn mã
thiết lập camera :
glMatrixMode(GL_Projection);
glLoadIdentity();
gluperspective(viewAngle,aspecRatio,N,F);
Đối số viewAngle chính là góc Ө trong hình vẽ được tính bằng độ và là góc giữa mặt trên
và mặt dưới của hình chóp .
Đối số aspecRatio là hệ số tỷ lệ của cửa sổ song song với mặt phẳng xy.
Giá trị N là khoảng cách từ mắt đến mặt phẳng gần.
Giá trị F là khoảng cách từ mắt đến mặt phẳng xa.
1.3 Định vị trí và định hướng cho camera.
Để có được hình ảnh mong muốn của khung cảnh chúng ta phải di chuyển camera
từ vịi trí mặc định như trong hình 3 đến một vị trí mới của một hướng mới .Chúng ta có
thể làm được điều này bằng phép quay và phép tịnh tiến và những phép biến đổi này trở
thành một phần của ma trận mô hình.
Chúng ta thiết lập vị trí và hướng của camera giống như đã làm với camera của
phép chiếu song song.(Sự khác biệt giữa camera phép chiếu phối cảnh và phép chiếu
song song nằm trong ma trận chiếu , chính ma trận này sẽ quyết định hình dạng của thể
tích nhìn). Chúng ta xem lại cách sử dụng glulookat() trong đoạn mã sau:
glMatrixMode(GL_Projection);
glLoadIdentity();
gluperspective(eye.x ,eye.y ,eye.z ,look.x ,look.y ,look.z ,up.x ,up.y ,up.z);
Đoạn mã này di chuyển camera sao cho mắt nhìn ở vị trí eye và nhằm thẳng vào điểm
quan tâm look.Hướng “upward” được chỉ định trong vector up thường có giá trị (0,1,0).
 Camera với vị trí và hướng bất kỳ:
Camera có thể có vị trí hoặc hướng bất kỳ trong khung cảnh .
Gắn một tọa độ tường minh cho camera như hình 4.Hệ tọa độ này có gốc tọa độ trùng với

mắt nhìn và 3 trục tọa độ để định hướng cho camera ,thường dùng là trục u,v,n .các trục
tọa độ này có hướng trùng với các hướng của các vector u,v,n như trong hình vẽ .Bởi vì
mặc định của camera hướng về phía âm trục z,vì thế chũng ta nói rằng mặc định camera
hướng về phía âm của trục n tức là theo hướng –n .Hướng u chỉ về phía phải của camera ,
hướng v chỉ phía trên của camera .Hãy nghĩ các trục u , v,n, là bản sao của các trục tọa độ
x , y, z trong hình 3 được di chuyển và quay khi chúng ta di chuyển camera.

n
u
v
Hình4 : Gắn hệ trục tọa độ cho camera.
Khi điều chỉnh hướng của camera người ta thường dùng các thuật ngữ của ngành hàng
không: pitch, roll, heading, yaw.
Hình 5:Hướng của chiếc máy bay so với thế giới.
Pitch chính là góc hợp bởi trục dọc của máy bay (chạy từ đuôi đến mũi máy bay tức là
theo hướng –n) với mặt phẳng nằm ngang.
Máy bay thực hiện động tác roll ( xoay tròn)bằng cách quay xung quanh trục dọc của nó
roll chính là góc quay so với phương nằm ngang.
Heading của máy bay chính là hướng mà nó hướng đến.Người ta còn dùng một số thuật
ngữ khác như azimuth và brearing thay cho heading.
Cho trước n chúng ta có thể dễ dàng tìm được thông số pitch và heading bằng cách biểu
diễn n trong tọa độ cầu .Kinh độ và vĩ độ của vector –n lần lượt là Ө và ϕ .Heading của
máy bay được cho bởi kinh độ Ө của –n , pitch của máy bay cho bởi vĩ độ ϕ của –n .
n
u
n
u
v
u
v

v
u 

up
up
v
n
u




Trong hình 5:
Hình a cho thấy môt camera và hệ tọa độ gắn vào camera , hệ tọa độ này có các trục là
u,v,v gốc tọa độ ở vị trí mắt nhìn eye.
Camera trong hình b có roll khác 0.trong hình c có roll bằng 0 và được gọi là camera có
“no-roll”.Trục u của camera vơi “no-roll” sẽ nằm ngang tức là vuông góc với trục y của
hệ tọa độ thế giới .Lưu ý rằng camera với “no-roll” vẫn có thể có hướng n bất kỳ , vì thế
nó có bất kỳ pitch hoặc heading nào.
Hàm glulookat() là hàm khá tienẹ lợi để thiết lập giá trị eye và look của camera.nhưng
khi dùng hàm này chúng ta gặp phải khó khăn trong việc chọn up như thế nào để có được
một góc roll nhất định.Vì thế nếu chỉ dùng glulookat() thì việc tiến hành điểu chỉnh đối
với một camera sẽ gặp rất nhiều khó khăn.OpenGL không cho phép chúng ta truy xuất
trực tiếp các hướng u,v,n của camera vì thế chúng ta phải thực hiện trong chương
trình.nhờ vậy chúng ta sẽ mô tả và điều chỉnh camera dễ dàng hơn .
Hình 6:Hướng khác nhau của camera.
Chức năng của hàm glulookat() :một số kiến thức tóan học cơ sở .
Khi chúng ta gọi hàm glulookat() với đối số eye ,look và up thì giá trị tương ứng của
hướng u,v,nlà gì?
Hình 7: Xây dựng vector u,v và n

Trong hình a cho trước vị trí của mắt nhìn eye, điểm ngắm look và hướng up. Chúng ta
biết rằng n phải song song với vector eye- look, như trong hình b, vì thế chúng ta chọn
n=eye-look.
Bây giờ chúng ta cần phải tìm 2 vector u và v vuông góc với nhau vuông góc với
n.Vector u chỉ về phía bên hông của camera, vì thế hoàn toàn có lý để cho nó vuông góc
với up .Như vậy vector u vuông góc với cả n và up .
Để xây dựng một vector vuông góc với 2 vector cho trước người ta thường dùng tích có
hướng của chúng ,vì thế chúng ta xây dựng u = up×n,
thay vì n× up để cho u chỉ vào “ phía bên phải “khi chúng ta nhìn theo trục –n .
Có u và v chúng ta dễ dàng tạo được vector v: nó phải vuông góc với cả u và n vì thế
chúng ta lại dùng tích có hướng : v=n×u.Lưu ý v thường không trùng với up : v phải
vuông góc với n, trong khi người dùng cung cấp up như một gợi ý của hướng lên.
Tóm lại cho trước eye, look và up chúng ta xây dựng:
n = eye – look.
u = up×n, và
v = n×u
sau đó chuẩn hóa cả 3 vector u,v,n.
kiểm nghiệm lại công thức trên trong trường hợp up=(0,1,0), hãy chứng minh rằng trong
trường hợp này u=(n
z
,0,-n
x
)và v=( -n
x
n
y
.n
x
2
+ n

x
2
n
z
n
y
).chú ý rằng thành phần tọa độ y của
u bằng 0 , vì thế nó “nằm ngang”.
Ví dụ: Tìm hệ tọa độ camera( hệ tọa độ quan sát)
Cho một camera với mắt nhìn eye=(4,4,4) và điểm ngắm look=(0,1,0).Giả sử giá trị
up=(0,1,0).Tìm u,v và n.Lặp lại đối với trường hợp up=(2,1,0).
Lời giải:
Áp dụng công thức: n=eye- look = (4,3,4)
u =(4,0,-4)
v=(-12,32,-12)
vector u nằm ngang .kiểm tra xem các vector này có vuông góc với nhau từng đôi một
hay không.
Trong trường hợp up=(2,1,0)thì u=(4,-8,2), v=(38,8,-44), n=( 4,3,4).
Cuối cùng chúng ta xem xét gluloolat() ảnh hưởng đến ma trận mô hình phép nhìn
như thế nào.Mô hình ma trận phép nhìn là tích của 2 ma trận: ma trận V chuyển đổi tọa
độ thế giới sang tọa độ camera và ma trận M chứa đựng tất cả các phép biến đổi trong hệ
tọa độ thế giơis.Hàm glulookat() xây dựng ma trận V và nhân nó với ma trận hiện
hành.Bởi vì chức năng của V là chuyển đổi hệ trục tọa độ thế giới sang hệ tọa độ camera,
vì thế nó phải biến đổi hệ tọa độ camera thành vị trí thông thường cho camera.Tức là V
phải biến đổi eye thành gốc tọa độ , các vector u,v,n thành các vector i,j,k.Có rất nhiều
cách tính V, nhưng cách dễ nhất là kiểm tra xem ma trận sau có thực hiện được công việc
đó hay không.















=
1000
zzyx
yzyx
xzyx
dnnn
dvvv
duuu
V
Ma trận mô hình-phép nhìn là tích của V và M
d
x
d
y
d
z
eye•ueye•veye•n















=














1
0
0

0
1
z
y
x
eye
eye
eye
V
 !"#$%&'()*+
,-.&'/0$12345

6
7


u
n
8(9:#$;+345















=














0
0
0
1
0
z
y
x
u
u
u
V


Hình 8:Phép biến đổ do glulookat() tạo ra.
Tương tự V ánh xạ v thành (0,1,0,0)
T
và ánh xạ n thành (0,0,1,0)
T
.Hàm glulookat() sẽ
tạo ma trận V và nhân nó với ma trận hiện hành.
1.4 Xây dựng camera trong chương trình.
Để có thể điều khiển camera chúng ta tạo và xử lý camera trong chương trình thay vì
dùng camera mặc định .
Chúng ta xây dựng lớp camera thực hiện tất cả những công việc mà camera có thể làm .
Các biến mô tả thể tích nhìn: viewAngle, aspect, nearDist, farDist;
Đoạn code:
class Camera
{
private:
Point3 eye;
Vector3 u, v, n;
double viewAngle, aspect, nearDist, farDist;
void setModelViewMatrix();
public:
Camera();
void set(Point3 Eye, Point3 look, Vector3 up);
void roll(float angle);
void pitch(loat angle);
void yaw(float angle);
void slide(float delU, float delV, float delN);
void setShape(float vAng,float asp,float nearD,float farD);
};

Phương thức setModelViewMatrix() có chức năng truyền ma trận mô hình – phép nhìn
cho OpenGL. Chỉ các phương thức thành viên của lớp mới gọi phương thức này và nó sẽ
được gọi sau mỗi lần vị trí và hướng của camera thay đổi.
Đoạn code:
void Camera :: setModelViewMatrix(){
float m[16];
Vector3 eVec(eye.x, eye.y, eye.z);
m[0] = u.x ; m[4] = u.y; m[8] = u.z; m[12] = -eVec.dot(u);
m[1] = v.x ; m[5] = v.y; m[9] = v.z; m[13] = -eVec.dot(v);
m[2] = n.x ; m[6] = n.y; m[10] = n.z; m[14] = -eVec.dot(n);
m[3] = 0 ; m[7] = 0 ; m[11] = 0 ; m[15] = 1.0;
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(m);
}
void Camera :: set(Point3 Eye, Point3 look, Vector3 up){
eye.set(Eye);
n.set(eye.x – look.x, eye.y – look.y, eye.z – look.z);
u.set(up.cross(n));
n.normalize();
u.normalize();
v.set(n.cross(u));
setModelViewMatrix();
}
1.5. Thao tác của camera
 Trượt: di chuyển camera dọc theo các trục u, v và n mà không quay nó.
void Camera :: slide(float delU, float delV, float delN)
{
eye.x += delU*u.x + delV*v.x + delN*n.x;
eye.y += delU*u.y + delV*v.y + delN*n.y;
eye.z += delU*u.z + delV*v.z + delN*n.z;

setModelViewMatrix();
}
 Quay camera: quay xung quay các trục u, v và n của nó
– pitch (quay xung quanh u), roll (quay xung quanh n),
yaw (quay xung quanh v).
v
u
u’ = cos(
α
)u + sin(
α
)v,
v’ = -sin(
α
)u + cos(
α
)v,
void Camera :: roll (float angle){
float cs = cos(3.14159265/180 * angle);
float sn = sin(3.14159265/180 * angle);
Vector3 t = u;
u.set(cs*t.x – sn*v.x, cs*t.y – sn*v.y, cs*t.z – sn*v.z);
v.set(sn*t.x + cs*v.x, sn*t.y + cs*v.y, sn*t.z + cs*v.z);
setModelViewMatrix();}
Ví dụ:
#include <windows.h>
#include <gl/gl.h>
#include <gl/glut.h>
#include “camera.h”
Camera cam;

void myKeyboard(unsigned char key, int x, int y){
switch(key){
case ‘F’: cam.slide(0, 0, 0.2); break;
case ‘F’ – 64: cam.slide(0, 0, -0.2); break;
case ‘P’: cam.pitch(-1.0); break;
case ‘P’ – 64: cam.pitch(1.0); break;
}
glutPostRedisplay(); }
void myInit(){
glClearColor(1.0,1.0,1.0,0.0);
glColor3f(0.0f, 0.0f, 0.0f);
glPointSize(2.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 400.0, 0.0, 400.0);
CHƯƠNG II. HÌNH CHIẾU PHỐI CẢNH CỦA VẬT THỂ 3D
2.1 Giới thiệu:
- Phép chiếu phối cảnh là phép chiếu mà các tia chiếu không song song với nhau mà xuất
phát từ 1 điểm gọi là tâm chiếu.Phép chiếu phối cảnh tạo ra hiệu ứng về luật xa gần tạo
cảm giác về độ sâu của đối tượng trong thế giới thực mà phép chiếu song song không lột
tả được.
Sau khi đã có lớp camera trong tay chúng ta có thể tạo dựng khung cảnh 3D và tạo hình
ảnh .Trong openGL chúng ta tạo hình ảnh bằng cách truyền các đỉnh của đối tượng xuống
đường ống đồ họa .
Hình 9: Đường ống đồ họa
Mỗi đỉnh v của đối tượng đựoc nhân với ma trận mô hình , phép nhìn (VM).Trong đó ma
trận mô hình (M) chứa đựng tất cả các phép biến đổi mô hình của đối tượng .Ma trận V là
phép biến đổi dùng để biến đổi camera từ vị trí mặc định với hướng mặc định sang vị trí
mới có hướng mới . Khi một đỉnh nhân với VM thì tọa độ của nó được chuyển từ tọa độ
thế giới thực sang tọa độ mắt nhìn hay còn gọi là tọa độ quan sát hay tọa độ camera được

mô tả bằng hình sau:
Hình 10:Phép chiếu phối cảnh trong hệ tọa độ mắt nhìn
Với mắt nhìn trùng với gốc tọa độ ,mặt phẳng gần vuông góc với trục z ở vị trí z= -N.
Đỉnh nằm ở vị trí P trong tọa độ mắt nhìn sẽ được đưa xuống khâu tiếp theo trong
đường ống đồ họa , ở đó nó sẽ được chiếu thành điểm có tọa độ ( x
*
,y
*
) trên mặt phẳng
gần sau đó phép cắt xén được thực hiện .Cuối cùng những điểm còn lại sau phép cắt xén
được ánh xạ lên khung nhìn của ứng dụng.
2.2.Hình chiếu phối cảnh của một điểm:
Thao tác cơ bản nhất của phép chiếu phối cảnh là chiếu một điểm trong không gian
3 chiều thành một điểm trong không gian 2 chiều.
Hình11: Tìm hình chiếu của điểm P trong tọa độ mắt nhìn
Ta thấy điểm (p
x
,p
y
,p
z
) trong không gian 3d được chiếu trên mặt phẳng gần của camera và
trở thành điểm (x
*
,y
*
).chúng ta xây dựng một hệ trục tọa độ trên mặt phẳng gần với gốc
tọa độ nằm trên trục z của camera .Khi đó ,hoàn toàn có nghĩa khi nói rằng một điểm nào
đó nằm về phía bên phải của gốc tọa độ x
*

đơn vị ,nằm phía gốc tọa độ y
*
đơn vị.
Dùng tính chất của tam giác đồng dạng: tỷ số giữa x
*
và p
x
cũng bằng tỷ số giữa khoảng
cách N và |p
z
|. Bởi vì p
z
có giá trị âm nên chúng ta có thể viết :
Hoặc x
*
=NP
x
/(-p
z
). Tương tự y
*
=NP
y
/(-P
z
). Vì thế hình chiếu phối cảnh của điểm p nằm
trên mặt phẳng nhìn là:
(x
*
,y

*
) = (hình chiếu của điểm P)
Ví dụ: tìm hình chiếu của điểm P=(1, 0.5 ,-1.5) trên mặt phẳng nhìn biết rằng mặt phẳng
gần của camera ở vị trí N=1.
Áp dụng công thức: ta có : (x
*
,y
*
)= (0.6666 ,0.3333).
 Nhận xét :
1.Lưu ý giá trị -P
z
nằm ở mẫu số trong công thức giá trị này sẽ lớn đối với những điểm
nằm ở xa (tức là nằm ở phía xa hơn về phía cực âm của trục z) vì thế nó sẽ làm giảm giá
trị của y
*
.Đây chính là luật xa gần của phép chiếu phối cảnh , nó làm cho đối tượng ở
phần xa nhỏ hơn ở phần gần.
2.Khi giá trị có mẫu số bằng 0 chúng ta sẽ gặp phải rắc rối trong tính toán .P
z
có giá trị
bằng 0 khi P nằm trên cùng mặt phẳng với mắt nhìn tức là loại bỏ những điểm này trươc
khi thực hiện phép chiếu .
3.Nếu điểm P nằm ‘phía sau mắt nhìn’thì P sẽ đổi dấu và điều này gây ra sự phiền phức
như chúng ta sẽ thấy trong phần sau .Những điểm này cũng thường đựợc loại bỏ bằng
cách cắt xén.
4.Khoảng cách N của mặt phẳng gần chỉ có tác dụng co giãn hình chiếu của đối tượng .Vì
thế nếu chúng ta lựa chọn một mặt phẳng khác (vấnong song với mặt phẳng gần )làm mặt
phẳng thì hình chiếu trên đó chỉ khác nhau về kích cỡ so với hình chiếu về kích cỡ trên
mặt phẳng gần .Nhưng sự khác biệt về kích thước của hình chiếu không tạo ra sự khác

biệt đối với hình ảnh được hiển thị trên khung hình ,bởi vì chỉ cần thay đổi kích thước
của khung hình chúng ta sẽ tạo nên những hình ảnh giống hệt nhau.Điều này chứng tỏ
rằng bất cứ mặt phẳng nào song song với mặt phẳng gần đều có thể lựa chọn làm mặt
phẳng chiếu .Chính vì lí do này chúng ta thường dùng mặt phẳng gần.
5.Hình chiếu của đoạn thẳng vẫn là đoạn thẳng .Giả sử đường thẳng trong không gian 3
chiều did qua 2 điểm A và B, hình chiếu của điểm A là A’, hình chiếu của B là B’.Câu
hỏi đặt ra là : liệu hình chiếu của của những điểm nằm trên đoạn thẳng AB có nằm trên
đoạn thẳng A’B’ không ? Câu trả lời là có :xét mặt phẳng tạo bởi A,B và gốc tọa độ .Bởi
vì bất cứ 2 mặt phẳng nào cũng giao nhau ở cùng một đoạn thẳng vì thế mặt phẳng này
cũng giao nhau với mặt phẳng gần ở một đường thẳng hay nói cách khác hình chiếu của
AB là đoạn thẳng A’B’.
2.3 Hình chiếu phối cảnh của đường thẳng :
Tính chất của hình chiếu phối cảnh bằng cách tìm hiểu hình chiếu của một đường
thẳng :
1.Hình chiếu của đường thẳng song song trong không gian 3 chiều vẫn là những đường
thẳng , nhưng chúng không nhất thiết phải song song với nhau .Nếu chúng không song
song với nhau thì chúng sẽ gặp nhau ở ‘’điểm biến mất’’.
2.Đường thẳng chạy ra phía sau mắt nhìn của camera có hình chiếu đi qua điểm nằm ở vô
cùng ( những đường thẳng này cần phải được cắt xén trước khi chiếu).
3.Hình chiếu phối cảnh thường tạo nên hình ảnh chân thực của khung cảnh . Nhưng cũng
có trường hợp ngoại lệ :chẳng hạn hình chiếu của những đường thẳng dài song song với
mặt phẳng chiếu thường không cho chúng ta cảm giác giống như những gì chúng ta nhìn
thấy trong thực tế.
 Phép chiếu những đường thẳng song song :
Giả sử đường thẳng trong không gian 3 chiều đi qua A = (A
x
, A
y
, A
z

) ( trong tọa độ
camera) và có vector hướng c = (c
x
, c
y
, c
z
) đường thẳng này có phương trình tham số
là :P(t) = A + ct.Ta có dạng biểu diễn của hình chiếu đường thẳng :








−−
+
−−
+
=
tcA
tcA
N
tcA
tcA
Ntp
zz
yy

zz
xx
,)(
Từ công thức trên chúng ta suy ra hình chiếu của điểm A chính là P(0), và khi t thay đổi
hình chiếu P(t) sẽ di chuyển trên một đừong thẳng.
),()( tcAtcA
A
N
tp
yyxx
z
++

=
Giả sử đường thẳng A + ct song song với mặt phẳng nhìn ,
khi đó c
z
= 0 và hình chiếu của đường thẳng là :
Đây là dạng biểu diễn tham số của đường thẳng có hệ số góc là c
y
/c
x
.Giá trị độ dốc này
không phụ thuộc vào vị trí của đường thẳng, mà chỉ phụ thuộc vào hướng của c. Vì thế
hình chiếu của tất cả các hình chiếu của đường thẳng 3D có hướng là c có cùng độ dốc ,
vì vậy chúng song song với nhau .Chúng ta có thể kết luận rằng :
Nếu 2 đường thẳng 3D song song với nhau và song song với mặt phẳng nhìn thì
hình chiếu của chúng song song với nhau .
Xét trường hợp hướng c của đường thẳng không song song với mặt phẳng nhìn :
Giả sử c

z
<0 khi tăng t lên đường thẳng lùi xa dần mắt nhìn .Khi giá trị t rất lớn công thức








−−
+
−−
+
=
tcA
tcA
N
tcA
tcA
Ntp
zz
yy
zz
xx
,)(









−−
=∞
z
x
z
x
c
c
N
c
c
Np ,)(
Trở thành :
Giá trị trên được gọi là điểm biến mất của đường thẳng.Đó là điểm mà đường thẳng sẽ
hướng đến khi giá trị của t tăng dần .Lưu ý rằng nó chỉ phụ thuộc vào hướng c của đường
thẳng mà không phụ thuộc vào vị trí của đường thẳng . Vì thế tất cả các đường thẳng
song song với nhau sẽ có chung một điểm biến mất .hay nói cách khác là hình chiếu của
các đường thẳng song song sẽ không song song.
Hình12 : Điểm biến mất của những đường thẳng song song.
Một vài cạnh của hình lập phương song song với nhau : có những cạnh nằm ngang ,một
số thẳng đứng và một số cạnh lùi về phía sau .Camera được bố trí sao cho mặt phẳng gần
song song với mặt phẳng trước của hình lập phương . Vì thế trong tọa độ camera (hệ tọa
độ quan sát ) thành phần z của hướng c bằng 0 với tất cả những đường nằm ngang và
thẳng đứng Vì thế vị trí của những đường thẳng nằm ngang song song với nhau, hình
chiếu của những đường thẳng cũng song song với nhau. Tuy nhiên những đừờng thẳng
lùi dần về phía sau, không song song với mặt phẳng nhìn sẽ có hình chiếu hội tụ ở điểm

biến mất (VP).
Hình13 : Ý nghĩa hình học của điểm biến mất.
Nhìn xuống đường thẳng xz của camera từ phía trên ,chúng ta thấy mắt nhìn thấy rất
nhiều điểm trên đừong thẳng AB .Hình chiếu của A là A’, hình chiếu của B là B’… hình
chiếu của một điểm rất xa nằm trên đường thẳng chính là VP .Vì thế điểm VP nằm ở vị
trí sao cho đừờng thẳng đi qua nó và mắt song song với đường thẳng AB.
 Đường thẳng chạy ra sau mắt nhìn :
Hình 14 :Chiếu của đoạn thẳng AB với B nằm sau mắt nhìn
PHẦN III. PHÉP NHÌN LẬP THẾ.

×