Truy xuất dữ liệu TIN từ file

Một phần của tài liệu XÂY DỰNG THƯ VIỆN PHẦN MỀM HỖ TRỢ HỆ THỐNG THÔNG TIN ĐNA LÝ GIS 3D DỰA TRÊN CƠ SỞ DỮ LIỆU HƯỚNG ĐỐI TƯỢNG BẰNG NGÔN NGỮ C++ (Trang 63)

Ngoài cách nhập dữ liệu cho TIN bằng form nhập liệu và bằng thao tác trực quan trên TIN, chúng ta cịn có thể nhập dữ liệu cho TIN từ một file. Từ một file dữ liệu có sẵn, chúng ta chỉ cần import nó vào dữ liệu của TIN. Cách nhập liệu từ file giúp chúng ta linh động hơn trong khâu nhập liệu. Ngoài ra việc dùng file giúp chúng ta dễ dàng di chuyển (portable) dữ liệu, xuất dữ liệu báo cáo.

Để có thể nhập liệu bằng file thì chúng ta cần quy định một kiểu định dạng file để đảm

bảo việc nhập liệu chính xác. Bản luận văn này sử dụng kiểu file ký tự (text file) có

định dạng như sau:

File định dạng có phần mở rộng là T3D. Ví dụ file có tên là: tinDemo.T3D

Header của file bao gồm các thông tin như: kiểu file, phiên bản của file, thông tin chú thích.

Sau header của file là header của TIN bao gồm các thông tin: tên của TIN, số lượng

đỉnh và số lượng các tam giác có trong TIN.

Tiếp theo là phần mô tả quan hệ giữa các đối tượng dữ liệu (đỉnh, tam giác). Trong phần thân này, đầu tiên là danh sách các đỉnh. Mỗi đỉnh có tên (biểu diễn theo định dạng: @index), tiếp theo là tọa độ không gian, màu sắc. Sau danh sách đỉnh là danh sách các tam giác của TIN. Mỗi tam giác gồm có 3 đỉnh <point1, point2 và point3> kiểu tô, kiểu đường.

Luận văn tốt nghiệp GVHH: Nguyễn Hữu Hải.

CHƯƠNG 4 : VẼ LƯỚI TAM GIÁC & TƯƠNG TÁC VỚI NGƯỜI DÙNG - TẦNG PRESENTATION.

I. CÔNG CỤ VẼ.

Hiển thị lưới tam giác lên màn hình là một vấn đề rất quan trọng. Một trong ưu điểm của GIS 3D là mơ hình hóa các đối tượng gần với thế giới thực hơn. Do đó cần phải thể hiện các mơ hình này một các trực quan dưới dạng 3D. Hiện tại, trên mơi trường Windows có hai cơng cụ thể hiện hình họa 3D phỗ biến là OpenGL và Direct3D. Direct3D là một trong những giao tiếp lập trình đồ họa 3D mạnh nhất hiện nay. Là một phần trong DirectX của Mircrosoft. Direct3D được tích hợp vào bên trong Windows cung cấp cho lập trình viên một giao tiếp lập trình dưới dạng các giao tiếp (interface) COM. Do đó, để sử dụng được Direct3D địi hỏi phải có kiến thức tương

đối về COM. Mặc khác, cấu trúc lập trình của Direct3D cũng tương đối phức tạp,

khơng phù hợp cho những người chưa có kinh nghiệm về lập trình đồ họa 3D.

Tương tự Direct3D, OpenGL cũng được tích hợp sẵn trong hệ điều hành Windows. OpenGL có tiền thân là GL do Silicon Graphics Incorporated (SGI) phát triển dành riêng cho các trạm làm việc của họ. Về sau, nó đã phát triển lên thành một chuNn công nghiệp được hỗ trợ bởi tất các các nhà sản xuất phần cứng cũng như được hỗ trợ bởi tất cả các hệ điều hành hiện tại.

OpenGL được xây dựng bởi tập các hàm thư viện. Các hàm này cung cấp cho người

dùng một giao diện lập trình mạnh mẽ nhưng lại rất đơn giản, trong sáng và dễ dàng, phù hợp cho hầu hết mọi trình độ.

Do thời gian hạn chế, nên trong đề tài này, chúng tôi đã chọn OpenGL là công cụ để hiện thị lưới tam giác lên màn hình, đồng thời cung cấp một số chức năng tương tác với người dùng cuối.

II. VẼ LƯỚI TAM GIÁC.

II.1. Các hệ tọa độ trong lập trình đồ họa.

Lập trình đồ họa 3D xây dựng hình ảnh các đối tượng 3D, các đối tượng này được mô tả từ các đối tượng cơ bản của hình học: đỉnh, cạnh và đa giác. Các đối tượng này

được xác định bởi các tọa độ của chúng trong hệ tọa độ ba chiều.

Có hai hệ tọa phỗ biến được dùng trong đồ họa: hệ tọa độ bàn tay trái và hệ tọa độ bàn tay phải. Sự khác biệt giữa hai hệ tọa độ này là hướng của trục z như hình vẽ.

Hình 4-1. Hệ tọa độ bàn tay trái và bàn tay phải.

Đối với hệ tọa độ bàn tay trái, đối tượng có tọa độ z càng lớn thì càng xa vị trị của

người nhìn, z càng nhỏ thì càng gần với người nhìn. Cịn hệ tọa độ bàn tay phải thì ngược lại. Direct3D sử dụng hệ tọa độ bàn tay trái trong khi OpenGL sử dụng hệ tọa

độ bàn tay phải.

Trên màn hình, OpenGL sử dụng hệ tọa độ sau: gốc tọa độ nằm chính giữa màn hình, trục x có hướng từ trái sang phải, trục y từ dưới lên, và trục z hướng ra khỏi màn hình. Do tính chất đó, trục z cịn đuợc gọi là trục độ sâu.

Tuy nhiên, các đối tượng của Tin được mơ hình hóa trong hệ tọa độ thế giới thực. Hệ tọa độ này là hệ tọa độ bàn tay phải nhưng trục z hướng lên, y hướng từng trái sang phải và x hướng ra. Do đó, khi vẽ Tin thông qua các phép bằng OpenGL ta phải thực hiện việc chuyển đổi từ hệ tọa độ thế giới thực sang hệ tọa độ bàn tay phải của

OpenGL. Việc chuyển đổi này có thể tiến hành đơn giản thông qua các phép ánh xạ tọa độ đã được giới thiệu ở tầng cơ sở dữ liệu.

II.2. Vẽ Tin lên màn hình.

Tin được thành lập bởi hai đối tượng chính là đỉnh (vertex) và tam giác (triangle). Do

đó vẽ Tin ta chỉ cần vẽ các đỉnh và các tam giác, đây cũng là hai đối tượng cơ bản

(primitive) của GL.

Khi tơ màu các tam giác của Tin, ngồi việc dùng thuộc tính FillColor kèm theo, ta cịn dùng các thiết lập đồ họa dựa theo thuộc tính liên kết với mỗi đối tượng. Thuộc tính (TinAttribute) là một thực thể đã được đề cập đến trong tầng DML. Mỗi thuộc

tính bao gồm một số giá trị định nghĩa trước. Mỗi giá trị này sẽ được ràng buộc (bind) với một số đối tượng (đỉnh hay tam giác) của Tin. Khi vẽ Tin theo một thuộc tính, ứng với từng giá trị các thiết lập môi trường render của OpenGL sẽ được thiết lập trước khi các đối tượng này được dựng thành khung vẽ (render). Đoạn mã sau diễn tả quá trình này:

For Each Value in Attribute Do

<Apply graphic settings base on Value>

<Read all bound objects and render them> <Clear up settings for this Value> End For

Các thiết lập đồ họa ứng với từng giá trị của thuộc tính (attribute value)là hồn tồn do người dùng định nghĩa. Các thiết lập này có thể đơn giản là thiết lập màu tô, kiểu tô hay phức tạp hơn là các kết cấu (texture) v.v…Mỗi attribute value có liên kết với một

Luận văn tốt nghiệp GVHH: Nguyễn Hữu Hải.

đoạn dữ liệu. Đoạn dữ liệu này hoàn toàn do người dùng định nghĩa và có kích thước

thay đổi.

Có bốn loại attribute được định nghĩa là :

Ranged Attribute: các giá trị của thuộc tính này là một vùng không gian giới

hạn bởi giá trị min, max của tọa độ khơng gian theo 3 chiều (x,y,z). Ví dụ

chúng ta quy định trong khoảng độ cao 200m đến 500m thì thuộc tính của đối tượng có giá trị màu đỏ.

Text Attribute: các giá trị của thuộc tính là những đoạn text.

Numeric Attribute: giá trị của thuộc tính là những số ngun.

Enumeration Attribute: giá trị của thuộc tính cũng là một số nguyên tuy nhiên

mỗi số nguyên này được kết hợp với một chuỗi văn bản. Thuộc tính này tương tự kiểu liệt kê trong các ngôn ngữ lập trình.

III. CÁC YÊU CẦU TƯƠNG TÁC VỚI NGƯỜI DÙNG.

III.1. Yêu cầu về tương tác với người dùng.

Tương tác với người dùng cuối là một tính năng rất quan trọng trong GIS 3D. Việc hiện thực các tính năng này phức tạp hơn rất nhiều so với việc tương tác với các đối tượng GIS 2D.

Các yêu cầu cơ bản nhất trong tương tác với người dùng là :

• Khả năng chọn (select) các đối tượng khơng gian bằng mouse.

• Khả năng xem xét các đối tượng không gian dưới tất cả các góc độ. Tính năng này là đặc biệt quan trọng. Nếu thiếu nó thì việc mơ hình các đối tượng 3D trở

nên vơ nghĩa. Người dùng có thể xem một cách tổng thể toàn bộ khung cảnh hoặc tiến đến gần một đối tượng nào đó và xem xét nó ở các góc nhìn khác

nhau.

• Khả năng drag-and-drop các đối tượng 3D. Tính năng này cho phép người dùng có thể dễ dàng hơn trong việc hiệu chỉnh các dữ liệu về các đối tượng không gian một cách tương đối dễ dàng, trực quan.

Như đã trình bày, hiện thực các tính năng này không phải là đơn giản do người dùng giao tiếp thơng qua tọa độ màn hình, tọa độ 2D, do đó tọa độ cần phải chuyển sang

3D. Sau đây ta xem xét một giải pháp để hiện thực các yêu cầu về tương tác với người dùng.

III.2. Quan sát các đối tượng không gian dưới các góc độ.

Khả năng quan sát các đối tượng khơng gian dưới các góc độ khác nhau là một yêu cầu và cũng là một chức năng cơ bản trong hình họa 3D. Tất cả các cơng cụ lập trình

đồ họa đều cung cấp các giải pháp, phương thức cho lập trình giải quyết vấn đề này.

Trong phạm vi đề tài này, ta chỉ tìm hiểu sơ lược về chức năng này trong OpenGL. OpenGL cho phép thay đổi các góc nhìn thơng qua các phép biến hình: dịch chuyển và xoay. Ngồi ra, GL cịn cung cấp hàm gluLookAt() dùng để thiết lập vị trí camera, hay cịn gọi là điểm nhìn. Hình sau cho thấy khái niệm camera trong GL.

Hình 4-2. Camera trong OpenGL.

Việc chiếu các hình ảnh 3D vào 2D phụ thuộc vào vị trí đặt của camera (tripod) và hướng của camera. Phần thể tích được nhìn thấy giới hạn bởi một hình chóp cụt (frushtum) như hình vẽ. Chỉ những đối tượng (phần đối tượng) nằm trong không gian này mới hiển thị lên màn hình.

III.3. Chọn đối tượng 3D bằng mouse.

Khi người dùng nhấn mouse trên hình ảnh của đối tượng 3D tại một tọa độ màn hình gồm hai thành phần (x,y), ta phải xác định xem tọa độ này thuộc đối tượng nào. Thư viện OpenGL cung cấp cho chúng ta ba giải pháp để thực hiện việc này.

a. Dùng cơ chế chọn lựa của OpenGL.

OpenGL cung cấp một cơ chế rất mạnh để chọn các đối tượng không gian từ một vùng tọa độ trên viewport.

OpenGL có ba chế độ dựng ảnh RENDER, SELECT và FEEDBACK. Chế độ

RENDER là chế độ chính dùng để xây dựng các hình ảnh 3D của đối tượng từ các dữ liệu về đỉnh, ánh sáng, màu…Chế độ FeedBack tương tự chế độ Render tuy nhiên đích

đến của việc dựng ảnh khơng là buffer của màn hình mà là buffer của người dùng. Còn

trong chế độ Select, OpenGL chỉ kiểm tra xem đối tượng 3D có nằm trong một vùng viewport do người dùng định nghĩa.

Khi tiến hành render các đối tượng, mỗi đối tượng sẽ được gán một tên là một số

nguyên. Các tên này được OpenGL lưu trữ thông qua một stack – namestack. Mỗi khi OpenGL render các đối tượng này có một pixel nằm trong vùng chọn thì OpenGL sẽ chuyển tồn bộ nội dung của name stack sang một bộ đệm do người dùng định nghĩa. Từ nội dung của bộ đệm này ta có thể dễ dàng phát hiện ra đối tượng nào đã được

chọn. Sau đây là khung mã của việc chọn đối tượng qua cơ chế Select.

glSelectBuffer(size, buffer); // buffer chứa name của các đối tượng. glRenderMode(GL_SELECT); // chuyển sang chế độ select.

glMatrixMode(GL_PROJECTION); // thiết lập ma trận chiếu. glLoadIdentity();

glPickMatrix(x,w,w,h,viewport); // xác định vùng chọn. gluPerspective(…);

glMatrixMode(GL_MODEL_VIEW); glInitName();

// xác định các đối tượng bằng các vertex của chúng.

int hitcount = glRenderMode(GL_RENDER); // chuyển sang chế độ render và xác định số đối tượng nằm trong vùng chọn.

Đây là một phương pháp rất mạnh của OpenGL, tuy nhiên nó địi hỏi q trình tính

tốn khá nhiều, đặc biệt là khi số lượng đối tượng là rất lớn, khi đó có thể ảnh hưởng

đến hiệu suất của chương trình nếu việc xác định các đối tượng được chọn được tiến

hành thường xuyên, liên tục.

Luận văn tốt nghiệp GVHH: Nguyễn Hữu Hải.

OpenGL cung cấp các hàm chiếu để chuyển từ tọa độ cửa sổ (window coordinate)

sang tọa độ của đối tượng (object coordinate) hay tọa độ thế giới của GL ( world

coordinate) thông qua phép chiếu ngược.

glUnProject(xw,yw,zw,modelMatrix,projectMatrix,viewport,xo,yo,oz)

Trong đó (xw,yw,zw) là ba thành phần của tọa độ cửa số cần đổi. Thành phần xw được xác định bằng tọa độ x của mouse, thành phần yw được xác định bằng cách lấy chiều dài của viewport trừ đi thành phần tọa độ y của mouse (do hệ tọa độ màn hình có trục y hướng xuống). Còn thành phần zw được xác định lần lược bằng 0 và 1. Qua hai phép chiếu ta xác định được hai điểm nằm trên mặt cắt gần và mặt cắt xa. Từ hai điểm này ta xây đựng một đoạn thẳng rồi đem nó giao với các đối tượng Tin để tìm ra tọa dộ mà người dùng đã chọn. Từ đó, xác định ra đối tượng Tin thực sự được chọn.

Phương pháp này rất tổng quát và xác định được tọa độ thực sự mà người dùng nhấn vào một đối tượng, nó đặc biệt cần thiết trong trường hợp đối tượng Tin có nhiều hơn một điểm như tam giác. Tuy nhiên, việc tính tốn để xác định một đối tượng vẫn cịn cần phải thực hiện nhiều phép tính tốn số thực dấu chấm động để có thể xác định ra

đối tượng mà người dùng muốn chọn. Mặc dù ta có thể hạn chế bớt các phép tính này

thơng qua phép chỉ mục đa chiều đã được trình bày ở phần cơ sở dữ liệu.

c. Dùng cơ chế Double Buffer.

Doubel Buffer được dùng để tăng tốc quá trình hiển thị hình ảnh của OpenGL. Các câu lệnh của OpenGL khi được render sẽ tạo nên những pixel ảnh. Các pixel này được chứa ở một bộ đệm. Sau khi q trình render hồn tất, GL mới đổ nội dung bộ đệm ra màn hình, do đó q trình render được hiển thị nhanh hơn, giảm thiểu hiện tượng flicker khi render ảnh. Cơ chế này được gọi là Double Buffer. Như vậy tại mỗi thời

điểm ln có Front Buffer chứa nội dung hình ảnh hiển thị trên màn hình, và back

buffer chứa nội dung ảnh sẽ hiển thị tiếp theo. Do đó nội dung của back buffer và front buffer có thể hồn tồn khác nhau. Tất cả những câu lệnh của GL đều tác động lên back buffer mà hồn tồn khơng ảnh hưởng đến hình ảnh đang được hiển thị trên màn hình. Như vậy ta có thể tận dụng tính chất này để xác định một cách nhanh chóng các

đối tượng 3D.

Đầu tiên, ngay khi quá trình render ảnh kết thúc bằng lệnh glFlush() và nội dung của

back buffer được đổ vào front buffer bằng lện SwapBuffer(), ta tiến hành render lại một lần nữa toàn bộ khung ảnh. Tuy nhiên ở lần render này, thay vì vẽ đối tượng bằng màu sắc bình thường, ta dùng định danh của đối tượng để tô màu, định danh này là một số nguyên. Để tăng độ chính xác của phương pháp này, ta phải tắt tất cả các hiệu

ứng về ánh sáng, pha trộn, khử răng cưa v.v…. Khi đó, khi người dùng click mouse tại

một tọa độ nào đó, bằng thủ tục glReadPixels() để xác định pixel màu tại vị trí mouse trong back buffer. Từ giá trị màu này ta hồn tồn có thể xác định được đối tượng nào

được chọn.

Phương pháp này đơn giản và đạt hiệu quả rất cao trong trường hợp ta phải xác định

đối tượng tại một vị trí có tọa độ 2D trên màn hình. Việc render lại các đối tượng hình ảnh chỉ làm một lần rồi sau đó ta có dùng để xác định các đối tượng tại các vị trí bất kỳ

một cách rất nhanh chóng và rất đơn giản chỉ thơng qua các phép tính đơn giản nên nó hồn tồn khơng ảnh hưởng đến performance của tồn chương trình. Điều này đặc biệt quan trọng, nó này cung cấp cho ta khả năng theo dõi các đối tượng theo sự di chuyển của mouse chứ không nhất thiết phải đợi người dùng click mouse. Ở phần sau,

Một phần của tài liệu XÂY DỰNG THƯ VIỆN PHẦN MỀM HỖ TRỢ HỆ THỐNG THÔNG TIN ĐNA LÝ GIS 3D DỰA TRÊN CƠ SỞ DỮ LIỆU HƯỚNG ĐỐI TƯỢNG BẰNG NGÔN NGỮ C++ (Trang 63)

Tải bản đầy đủ (PDF)

(117 trang)