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á
Trang 1TRƯỜ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ệ
Trang 2LỜ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 trongngà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ônggian 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
Trang 4GIỚ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áchmạ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 trongcá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ônggian 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 độ chophé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
Trang 5Khi 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
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:
Trang 6 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ầncứ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:
Trang 7CHƯƠ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
1.1 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.Haimặ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ậtnà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ắtxé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íchnhì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épchiế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 pvớ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)
Trang 8Hì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ìnhchó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ậnphé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 :
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.
Trang 9Để 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ủaphé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ếusong 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ểmquan 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ớimắ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ụctọ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 camerahướ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
Trang 10Hì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
Trang 11Trong 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ó đượcmộ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ì?
Trang 12Hì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 tabiết rằng n phải song song với vector eye- look, như trong hình b, vì thế chúng ta chọnn=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ớin.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ócvớ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 = upn,
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=nu.Lưu ý v thường không trùng với up : v phảivuô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 = upn, và
v = nu
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 trongtrường hợp này u=(nz,0,-nx)và v=( -nxny.nx2 + nx -nzny).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)
Trang 13u =(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ộthay 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ìnnhư 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ệnhà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à Vphả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ềucá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
Ma trận mô hình-phép nhìn là tích của V và M
Với (dx, dy, dz) = (-eye u, -eye v, -eye n)
Để chứng tỏ sau khi đã biến đổi eye trùng với gốc tọa độ ,trước tiên chúng ta biểu diễneye trong hệ tọa độ đồng nhất và sau đó chứng minh đẳng thức sau:
Tương tự để chứng tỏ u trùng với I chúng ta chứng minh đẳng thức:
x
V e
y e
0)
Trang 14Hì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;
Trang 15void 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ìncho 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);
Trang 16u.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)
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);
Trang 17case ‘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(){
v u