ĐIỀU KHIỂN WORLD3D

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 71)

IV.1. Tính năng.

Song song với các hàm giao tiếp API, tầng Presentation còn chứa đựng điều khiển World3D như là một giải pháp minh họa cho vấn đề trình diễn lưới tam giác và thực hiện các tương tác với người dùng.

World3D được thiết kế dựa trên nền tảng của thư viện Visual Component Library của Borland trong môi trường C++Builder. Do đó, người dùng có thể sử dụng điều khiển này như các điều khiển khác dùng trong thiết kế giao diện một cách đơn giản. Sau đây, ta xem xét các tính năng chính của World3D.

IV.1.1.Tương tác người dùng.

World3D là một container chứa đựng các đối tượng khác tương tự như một đối tượng GroupBox. Tuy nhiên các đối tượng nằm trong World3D không phải là điều khiển của Windows mà là các đối tượng 3D.

World3D tạo ra một môi trường 3D mô phỏng. Trong đó, các đối tượng được xác định trong không gian tọa độ ba chiều của thế giới thực. Mọi tương tác của người dùng từ

bên ngoài từ không gian hai chiều đều được chuyển sang không gian ba chiều trước khi các tương tác này được chuyển đến các đối tượng nằm trong trong World3D xử lý. Do đó việc giải quyết vần đề kéo-thả (drag-drop) đối tượng trở nên hoàn toàn đơn giản trong môi trường của World3D.

Ngoài ra, World3D còn cho phép người dùng thiết lập vị trí của điểm nhìn (Camera Tripod) cho phép quan sát các đối tượng này ở mọi góc độ. Kết hợp với điều khiển

WorldMap cho phép người dùng quan sát từng vùng của World3D giúp khả năng tăng tốc trong quá trình hiển thị các đối tượng.

IV.1.2.World3D là mt điu khin hot động độc lp và hoàn chnh.

World3D được thiết kếđể có khả năng làm việc một cách độc lập và hoàn chỉnh so với

ứng dụng. Nghĩa là, World3D chỉ cần một dòng lệnh khởi động và sau đó, nó hoàn toàn có khả năng liên kết cơ sở dữ liệu, mở các đối tượng Tin, thay đổi các thuộc tính của đối tượng này v.v… mà không cần có thêm một dòng mã nào từ bên ngoài can thiệp vào. Có thể nói World3D đóng gói gần như đầy đủ các chức năng cho phép người dùng có thể tạo, chỉnh sửa lưới tam giác.

IV.1.3.Kh năng hot động trên nhiu database.

Với cấu trúc hiện tại của mình, World3D có thể làm việc với nhiều đối tượng Tin thuộc nhiều database khác nhau trong cùng một thời điểm. Như đã trình bày ở tầng DML, mặc dù ứng dụng có khả năng mở nhiều database khác nhau như tại một thời

điểm chỉ có một database là tích cực, nghĩa là chỉ có thể truy xuất các đối tượng trên database này. World3D cung cấp khả năng tự chuyển đối database khi cần thiết. Do

đó, người dùng hầu như không cần quan tâm đến đối tượng Tin đó là thuộc database nào.

IV.1.4.World3D là mt kiến trúc m.

World3D được thiết kế như là một đối tượng có kiến trúc mở. Nghĩa là người dùng có thể định nghĩa, can thiệp cũng như có thể thay đổi hầu hết các đáp ứng, các dialog chuNn của World3D thông qua tập các biến cố. Ở đây, ta không dự định tìm hiểu chi tiết về các biến cố này mà chỉ điểm qua các nhóm biến cố chính. Chi tiết về các biến cố sẽđược trình bày rõ hơn ở phần phụ lục.

Các biến cố của World3D có thể phân thành các nhóm sau:

a.Nhóm các biến c khi thay đổi trng thái ca World3D.

Các biến cố này được kích hoạt khi trạng thái của World3D thay đổi, bao gồm các biến cố sau:

OnCameraChanged: kích hoạt khi vị trí của camera bị thay đổi.

OnModeChanging, OnModeChanged: kích hoạt khi World3D đang/đã thay đổi chếđộ hoạt động.

OnMessage: kích hoạt khi World3D hay các đối tượng trong World3D cần gởi một thông điệp ra ngoài, biến cố này thường dùng để báo lỗi hay thực hiện debug.

b.Nhóm biến c hin thđối tượng.

Nhóm biến cố này cho phép người dùng can thiệp vào quá trình vẽ các đối tượng 3D, bao gồm các biến cố sau:

OnPreRenderScene, OnPostRenderScene: kích hoạt khi Worl3D bắt đầu/kết thúc quá trình render các đối tượng.

OnRenderObject, OnRenderFastSelection: kích hoạt khi World3D cần render một đối tượng nằm trong nó.

OnGDIDraw: kích hoạt sau khi quá trình render hoàn tất, cho phép người người thực hiện các thao tác vẽ trên device context của World3D bằng các lệnh vẽ của GDI hoặc GDI+.

c.Nhóm biến c tương tác vi đối tượng.

Nhóm biến cố nào bao gồm các biến cố liên quan đến việc xử lý các đối tượng nằm trong World3D khi có tương tác với người dùng qua mouse, keyboard:

OnMouseEnterObj, OnMouseLeaveObj, OnMouseMoveObj: kích hoạt khi mouse di chuyển vào/ra/bên trong đối tượng 3D.

OnMouseDownObj, OnMouseUpObj: kích hoạt khi mouse nhấn/thả trên một

Lun văn tt nghip GVHH: Nguyn Hu Hi.

OnDragObject, OnDraggingObj, OnDropObj, OnDroppedObj: kích hoạt khi một đối tượng bắt đầu/ đang kéo và sắp/đã thả xuống.

OnKeyDownObj, OnKeyUpObj: kích hoạt khi người dùng nhấn/thả phím khi

đang chọn một đối tượng.

d.Nhóm biến c to/xóa đối tượng.

Nhóm biến cố tạo/xóa đối tượng được kích hoạt khi người dùng chèn/xóa đối tượng trong World3D, bao gồm các biến cố sau:

OnCreatingObject, OnCreateObject: kích hoạt khi người dùng tạo đối tượng, và đối tượng đã được chèn lớp danh sách các đối tượng của World3D.

OnDeletingObject, OnDeleteObject: kích hoạt khi người dùng bắt đầu xóa đối tượng và khi đối tượng đã được loại khỏi World3D.

e.Nhóm biến c liên quan Action.

Nhóm các biến cố này cung cấp khả năng quản lý các hạng mục trong trình đơn popup của World3D khi người dùng click phải chuột, bao gồm các biến cố sau:

OnCreateStdAction, OnPerformStdAction: kích hoạt khi World3D khởi tạo các action chuNn tùy vào ngữ cảnh và khi người dùng chọn vào các action này. • OnCreateObjectAction, OnPerformObjectAction: tương tự như hai biến bố trên

nhưng áp dụng cho các action do các đối tượng 3D tạo ra.

IV.1.5.Undo buffer.

Undo buffer cung cấp cho người dùng khả năng phục hồi lại tình trạng trước đó. Tính năng này được xây dựng chủ yếu dành cho việc thay đối tác động lên các đối tượng Tin như : thay đổi tọa độđỉnh, xóa tam giác, đỉnh v.v…

IV.2. Kiến trúc điều khiển World3D.

World3D là một điều khiển được xây dựng dựa trên điều khiển chuNn của Windows. World3D là một container chứa được các đối tượng 3D, trong đó các đối tượng Tin chỉ

là một trong các đối tượng này. World3D tiếp nhận các thông điệp về mouse, bàn phím v.v… từ hệđiều hành, xử lý chuyển đổi chúng thành các thông điệp tương ứng gởi đến các đối tượng 3D. Đồng thời World3D còn là cầu nối giữa đối tượng bên ngoài với các đối tượng 3D bên trong. Để tạo khả năng mở và khả năng giám sát các tương tác, World3D cung cấp một hệ thống các biến cố giúp chương trình có thể kiểm soát toàn bộđáp ứng của World3D đối với các tương tác của người dùng cuối.

` World Objects’ Properties Adapter Event Adapter TWorld3D World Objects (WorldTin, WorldPoint, WorldEdge…) Windows Message Handler World Object Handle

Get/Set Object Properties

World Events Windows Messages (mouse/keyboard...) Message Dispatcher Windows Message World3D messages Object’s Events Get/Set Properties Hình 4-3. Kiến trúc World3D.

IV.2.1. Các đối tượng trong World3D.

a.WorldObject – cơ s ca các đối tượng 3D.

World3D là container chứa các đối tượng 3D, được gọi là WorldObject. WorldObject có được xây dựng tương tự như một điều khiển của Windows.

World3D chỉ nhìn thấy các đối tượng WorldObject và giao tiếp với các đối tượng này thông qua một hệ thống thông điệp định nghĩa sẳn. Như vậy, World3D hoàn toàn không biết đến sự tồn tại của các đối tượng của Tin (đỉnh, tam giác, lưới tam giác). Do

đó, để người dùng có thể xem và tương tác với các đối tượng Tin ta cần định nghĩa các

đối tượng tương ứng kế thừa từ WorldObject.

Đối tượng WorldObject định nghĩa một bộ khung các phương thức ảo để xử lý các thông điệp do World3D gởi đến. Các lớp kế thừa từ WorldObject chỉ cần có định nghĩa lại hoặc kế thừa một số phương thức cần thiết để World3D có thể tương tác với chúng. Sau đây là phần interface của lớp WorldObject.

class TWorldObject: public TObject

{

public:

__fastcall TWorldObject(TWorld3D* Owner);

virtual int __fastcall Compare(const TWorldObject& obj) const;

void __fastcall CaptureMouse();

void __fastcall ReleaseMouse();

void __fastcall Invalidate();

virtual bool __fastcall GetProperty(int propname, void* value);

virtual bool __fastcall SetProperty(int propname, void* value);

virtual void __fastcall ShowProperties(bool edit_enabled);

__property TWorld3D* Owner;

__property TBox MBR;

__property char* Name;

__property bool Visible;

__property int Color;

__property int ID;

__property int ObjType;

protected: // Event handler

virtual void __fastcall MouseEnter();

virtual void __fastcall MouseLeave();

virtual void __fastcall MouseMove(TShiftState State, int X, int Y);

virtual void __fastcall MouseDown(TMouseButton Button, TShiftState State, int X, int Y);

virtual void __fastcall MouseUp(TMouseButton Button, TShiftState State, int X, int Y);

virtual void __fastcall KeyDown(Word& Key, ShiT ftState Shift);

virtual bool __fastcall MouseHitTest(int X, int Y);

virtual void __fastcall MoveRel(const Point3D& disp);

virtual void __fastcall MoveTo(const Point3D& pos);

virtual void __fastcall PreRender() {};

virtual void __fastcall RenderScene(TRenderOptions Options, bool

);

Refresh

virtual void __fastcall RenderFastSelection(bool Refresh);

virtual void __fastcall CanDragNow(bool& dragnow);

virtual void __fastcall BeginDrag();

virtual void __fastcall EndDrag(bool accepted, const Point3D& disp);

virtual void __fastcall Dragging(const Point3D& disp);

virtual void __fastcall LostFocus();

virtual void __fastcall RepairContextMenu(TPopupMenu* menu) {};

virtual void __fastcall SaveToIniFile(TStrings* file);

virtual bool __fastcall LoadFromIniFile(TIniFile* file);

virtual void __fastcall HitRangeSelection(int obj,int type) {};

void __fastcall SetFocus();

virtual void __fastcall RecieveFocus();

TPoint __fastcall GetMousePos(); };

Lun văn tt nghip GVHH: Nguyn Hu Hi.

b.WorldTin.

WorldTin là đối tượng quan trọng nhất trong World3D. WorldTin là giao tiếp giữa người dùng với các đối tượng Tin trên database. WorldTin xử l ý các biến cố gởi đến từ

World3D rồi tác động các thay đổi này lên database.

c.Các đối tượng khác.

Ngoài WorldTin, tầng Presentation còn định nghĩa thêm một số đối tượng khác như:

WorldPoint, WorldEdge, WorldPlane, WorldBox, WorldLightSource. Các đối tượng này giúp cho lập trình thêm thuận tiện hơn trong lập trình đối với tầng Presentation.

Ngoài ra, World3D có định nghĩa một đối tượng đặt biệt WorldCameraFocus dùng để

xác định tâm nhìn của camera.

IV.2.2.Các bđiu hp.

World3D có các bộđiều hợp: bộ điều hợp đọc/ghi các thuộc tính đối tượng, bộ điều hợp các biến cố phát sinh từ đối tượng và bộ xử lý và chuyển tiếp các window message sang world message. Hoạt độ của các bộ điều hợp này sẽ được trình bày rõ hơn ở phần sau.

IV.3. Xử lý biến cố trong World3D.

Trong môi trường Windows, hệ điều hành và các windows giao tiếp với nhau thông qua hệ thống thông điệp khá phức tạp. Điều khiển World3D cũng là một window, nên nó cũng phải nhận và xử lý các thông điệp này. Các thông điệp được xử lý bởi các trình xử lý biến cố của World3D. Đối với các thông điệp về mouse và keyboard khi gởi đến trình xử lý biến cố của World3D sau khi qua xử lý có thể phát sinh ra một thông điệp tương tựđể gởi cho các WorldObject nằm bên trong World3D. Các thông

điệp gởi đến WorldObject từ World3D phát sinh từ các thông điệp của Windows được gọi là các thông điệp dẫn xuất.

Ngoài các thông điệp từ Windows gởi đến, bản thân bên trong World3D cũng có sự

truyền nhận các thông điệp với các đối tượng WorldObject. Tuy nhiên, việc trình bày chi tiết các thông điệp này là thật sự không cần thiết. Nên ở đây, ta chỉ tìm hiểu về

trình xử lý các biến cốđược gởi đến từ Windows của World3D cũng như các trình xử

lý các biến cố dẫn xuất của WorldObject và hệ thông điệp giúp các đối tượng thể hiện

được trong ngữ cảnh 3D.

IV.3.1.Trình x lý biến c Mouse.

a.Mouse down.

Mouse Down Event Handler (TWorld3D) - UpdateCameraFocus() - Set ActiveMode to wmNormal wmChooseAim UpdateObjUnderMouse () wmNormal ObjUnderMouse - Send MouseDown to ObjUnderMouse. - Fire event OnClickObj

Not NULL ReleaseKeyboard() NULL Active Mode other

Mouse Down Event Handler (TWorldObject)

- CaptureMouse(). - CaptureKeyboard(). - MouseHitTest().

Windows Message Dispatcher

(a)

(b)

Hình 4-4. Lưu đồxử l ý event MouseDown của World3D (a) và WorldObject (b).

Đối với trình xử lý biến cố của WorldObject, đây chỉ là phần xử lý đơn giản của lớp thủy tổ. Các đối tượng 3D thực sự hiển thị trong World3D là những lớp kế thừa từ

WorldObject, chúng có những trình xử lý biến cố MouseDown kế thừa và phức tạp hơn nhiều. Hình sau trình bày trình xử lý biến cố MouseDown của lớp TWorldTin.

Hình 4-5. Trình xử lý biến bố MouseDown của TWorldTin.

b.Mouse move.

Đối với biến cố Mouse Move, ta cần có sự xử lý một cách đặc biệt hơn. Khi người dùng di chuyển mouse trong vùng làm việc của World3D, Windows sẽ gởi các thông

điệp MouseMove đến. Trong trường hợp vị trí mouse thay đổi nhanh, thì số lượng các biến cố gởi đến World3D là liên tục nhau. Nếu ta xử lý tất cả các biến cố này khi kéo

đối tượng hoặc thay đổi vị trí camera sẽ dẫn đến hiện tượng “giật ảnh” do số lần cần vẽ lại là khá lớn. Trong khi, ta không thiết phải xử lý toàn bộ các thay đổi vị trí của mouse, mà chỉ cần khi vị trí mouse đã ổn định. Nghĩa là, ta cần phải loại bỏ một số

biến cố gởi đến.

Như vậy, ta cần có một bộđếm (MouseCounter). Bộđếm này sẽđược kích hoạt tại lần

đầu tiên World3D nhận được thông điệp. Trong khoảng thời gian bộ đếm này hoạt

động, tất cả các thông điệp MouseMove gởi đến sẽ bị bỏ qua. Và khi bộ đếm kết thúc thì trình xử lý biến cố mới nhận vị trí cuối cùng của mouse trong vùng làm việc, tính toán độ lệch so với vị trí trước đó của mouse để có những hành động thích hợp tùy vào trạng thái hiện tại của World3D.

Lun văn tt nghip GVHH: Nguyn Hu Hi.

Trong World3D, bộđếm được hiện thực bằng đối tượng Timer của hệđiều hành. Với khoảng thời gian interval là 200 ms, World3D có thể xử lý các biến cố MouseMove tương đối chính xác với những thay đổi vị trí của mouse mà không xảy ra hiện tượng “giật ảnh”.

Mouse Move Event Handler (TWorld3D)

Is Mouse timing? Render Context

is initialized

Restart Mouse Timer No

Yes

Is not initialized

Mouse Timer Event Handler (TWorld3D)

Stop Mouse Timer.

Mouse is captured? Flag wsMouseCaptured No Active Mode Is set Perform Mouse Fly wmMouseFly Send MouseMove to Capturing Object Yes Is not set other (a) (b)

- Fire event OnMouseLeaveObj() - Update ObjectUnderMouse. - Fire event OnMouseEnterObj()

Hình 4-6. Lưu đồ xử lý event MouseMove (a) và MouseTimer (b).

Ta để ý rằng, World3D chỉ xử lý biến cố MouseMove trong trường hợp nó đã được khởi tạo một render context. Điều này là hoàn toàn hợp lý, vì khi render context chưa

được khởi tạo thì chưa có một đối tượng 3D nào được hiển thị, hay nói một cách khác World3D chưa được khởi động, chưa sẳn sàng tương tác với người dùng. Ta rất dễ

nhận thấy rằng, hầu hết các trình xử lý biến cố của World3D chỉ làm việc khi render context đã được khởi tạo.

Khác với biến cố MouseDown, ở biến cố này, trình xử lý biến cố của WorldObject phức tạp hơn để cung cấp cơ chế drag-n-drop các đối tượng 3D. Các lớp hậu duệ của WorldObject hầu hết không cần phải viết thêm mã cho việc xử lý biến cố này. Hình sau mô tả lưu đồ trình xử lý biến cố MouseMove của WorldObject.

Mouse Move Event Handler (TWorldObject)

Object being

dragged? Drag mode

Fire event OnDragObject(dragnow) Mouse displacement Compute Displacement (3D) Call Dragging(Displacement) Drag now Call BeginDrag() No Yes Yes No automatic >= DragThreadHold other manual

Hình 4-7. Lưu đồ xử lý biến cố MouseMove cho WorldObject.

Trình xử lý biến cố MouseMove của WorldObject được kích hoạt trong trường hợp vị

trí mouse đã được xem là ổn định. Do vậy, ta không cần quan tâm đến việc thay đổi tọa độ quá nhanh của mouse giống như trình xử lý biến cố của World3D.

Ở trình xử lý này, trong chếđộ dragging, khi tính toán vector độ dời của đối tượng bị

kéo dựa vào độ dời của mouse, ta cần tính toán sao cho khi thay đổi vị trí theo độ dời này đối tượng vẫn “nằm dưới” mouse. Ngoài ra, khi tính toán độ dời này cần đảm bảo tính bất biến của các thành phần tọa độ.

c.Mouse up.

Biến cố mouse up được xử lý khá đơn giản. Đối với World3D, trình xử lý biến cố này

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 71)

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

(117 trang)