Kỹ thuật lập trình mô phỏng thế giới thực

Thay vì mở thế giới trong World Builder mọi thời điểm bạn muốn thấy một sự

thay đổi, bạn có thể view thế giới trực tiếp từWorld Editor. Bạn chọn Run->load

World, bạn sẽ thấy có 3 lựa chọn: Viewer Mode, Editor Mode và Auto Behavior

Mode. Auto Behavior Mode giống nhưViewer Mode, bạn có thể sử dụng các phím

mũi tên và phím space bar để dịch chuyển camera xuyên suốt thế giới. Chạy thế giới

trong Auto Behavior Mode. Khi chưa tạo một camera, thì có lẽ viewer quay xa đối

tượng và tất cả chúng ta sẽnhìn thấy toàn nền xanh. Giữ các phím mũi tên trái và phải

để quay camera cho đến khi bạn nhìn thấy hình chóp.

pdf183 trang | Chia sẻ: thienmai908 | Lượt xem: 1188 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Kỹ thuật lập trình mô phỏng thế giới thực, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ion(int width,int height,intbits_per_pixel); Hay lấy độ phân giải bít màu bằng hàm: Morfit_engine_get_resolution(int*width,int *height, int *bits_per_pixel); Độ phân giải thông thường là 640 x 480, 800 x 600, 1024 x 768, và số bít màu cho mỗi điểm ảnh thường là 8, 16, hoặc 24 bít màu.Ngoài ra Morfit còn cho phép bạn sửa đổi lại các hình ảnh hiển thị trước khi hiển thị nó bằng cách lấy ra hình ảnh sẽ được hiển thị và sửa nó, sau đó trả lại hình ảnh được sửa cho bộ nhớ hiển thị. 3.7.3. Độ chính xác hiển thị (Display Accuracy) Tùy vào từng ứng dụng và tốc độ tính toán của máy tính, bạn sẽ phải cân nhắc giữa tốc độ và chất lượng hình ảnh hiển thị. Có rất nhiều chọn lựa có ảnh hưởng một mặt tới chất lượng và độ chính xác của hình ảnh hiển thị, mặt khác nó cũng ảnh hưởng Kỹ thuật lập trình mô phỏng thế giới thực 134 tới thời gian tính toán để đưa ra hình ảnh. Trong phần này, chúng ta sẽ xem xét một vài lựa chọn quan trọng ảnh hưởng tới chất lượng và độ chính xác của hình ảnh. Chất lượng hình ảnh (Picture Quality) Đây là vấn để đã được đề cập trong phần nói về camera. Chất lượng hình ảnh ở đây là toàn bộ bề mặt của thế giới đang được camera hiện tại hiển thị. Nếu ta hiển thị một khu vực lớn của thế giới lên một cửa sổ nhỏ thì chất lượng hiển thị sẽ tốt, còn ngược lại nếu ta hiển thị một khu vực nhỏ của thế giới lên một cửa sổ lớn thì đương nhiên chất lượng hình ảnh sẽ là rất tồi. Chúng ta cũng có thể thay đổi chất lượng hiển thị của hình ảnh bằng các hàm được giới thiệu trong phần camera. Sau đây là một số hàm điều khiển chất lượng hình ảnh: Morfit_engine_set_picture_quality(int quality); int Morfit_engine_get_picture_quality(); Morft_engine_increase_picture_quality(); Morfit_engine_decrease_picture_quality(); Hiển thị những đối tượng ở xa (Display Far Away Obiects):Chúng ta biết rằng mắt người nên vật ở gần chính xác, rõ ràng hơn nhìn những vật ở xa. Do đó, bạn có thể tiết kiệm rất nhiều thời gian cho việc render bằng cách giấu các chi tiết của các vật ở xa và vì thế có nhiều thời gian hơn đê tăng chất lượng hiển thị của những vật ở gần. Có một vài cách thức để thay đổi độ chính xác hiển thị của các đối tượng ở xa. Bạn có thể chỉ thị cho engine thay thế các đối tượng ở xa camera bằng một hình dạng đổ màu đơn giản thông qua các hàm: Morfit_engine_set_far_objects_color_accuracy(int value); int Morfit_engine_get_far objects_color_accuracy(); Morfit_engine_increase_ far_objects_color_accuracy(); Morfit_engine_decrease_far objects_color_accuracy(); Value:có thể nhận các giá trị từ 0 đến NUMBER_OF_PALETTES -1 Hơn thế, bạn có thể không hiển thị tất cả các hình ảnh của những vật ở quá xa bằng các hàm: Morfit_engine_set_culling_depth(int value); int Morfỉt_engine_get culling depth(); Morfit_engine_increase_culling_depth(); Morfit_engine_decrease_culling depth(); Việc bỏ không hiển thị các đối tượng ở quá xa sẽ làm cho tốc độ render nhanh lên rất nhiều xong việc bỏ đi các vật quá xa sẽ làm cho công việc mô tả trở nên không thực. Kỹ thuật lập trình mô phỏng thế giới thực 135 Morfit cung cấp cho ta một giải pháp tốt hơn, đó là sử dụng hiệu ứng khí quyển hay sương mù. Sương mù cung cấp một cách thức tiện lợi để làm mờ những vật ở xa mà không làm mất tính thực tế của mô phỏng. Khi sử đụng sương mù, engine sẽ sử dụng nó để phác hoạ những đối tượng ở xa và làm mờ những chi tiết như (hình ảnh, màu v.v..Ta sử dụng hàm: Morfit_engine_set_atmospheric_effect(int*red, int*green, int*blue); để thiết lập hiệu ứng khí quyển với (red, green, blue) là 3 giá trị xác định màu của sương. Có thể lấy được màu của sương bằng cách dùng hàm: Morfit engine_get_atmospheric_effect(int *red, int *green,int *blue); Z buffer: Một nhân tố khác ảnh hưởng tới thao tác của hệ thống đó là việc có hay không sử dụng thuật toán z buffer. Z buffer là một thuật toán mà engine sử dụng đê xác định khu vực được hiển thị hay bị giấu của thế giới. Thông thường thì không sử dụng z_ buffer chương trình chạy nhanh hơn và chính xác hơn, song đôi khi sử dụng z_buffer lại tốt hơn hẳn. do đó để quyết định việc có hay không sử dụng buffer bạn nên thử nghiệm trong từng chương trình cụ thể. Nếu khởi tạo thế giới trong chế độ Editor Mode, thuật toán z_buffer luôn luôn được sử dụng, còn trong chế độ Viewer Mode bạn có thể cân nhắc sử dụng hay không sử dụng z buffer bằng cách sử dụng hàm: int Morfit_engine_use_zbuffer(int yes_no_flag); int Morfit_engine_is_zbuffer(); trả về giá trị YES hoặc NO để kiểm tra xem z_buffer đã được sử dụng hay chưa. Chế độ rendering (Rendering Mode): Morfit cung cấp cho chúng ta ba chế độ rendering.Mặc định là chế độ "normal". Trong chế độ này, engine sẽ hiển thị tất cả các hình ảnh và đối tượng. Trong chế độ "color frame", các hình ảnh sẽ không được hiển thị và thay vào đó các đối tượng sẽ được hiển thị thành các khối màu thuần nhất. Chế độ "wire _ frame" chỉ hiển thị các đường bao phía ngoài của đối tượng. Để thiết lập các chế độ này ta có thể sử dụng các hàm sa: Morfit_engine_set_normal_rendering_mode(); Morfit_engine set_color_fill rendering_mode(); Morfit_engine_set_wire_frame_rendering_mode(); Không gian 2D và 3D Ta biết rằng thế giới là một không gian 3 chiều trong khi đó màn hình của chúng ta lại chỉ có hai chiều. Do đó, khi người dùng cách vào một điểm trên màn hình thì ta phải chuyển điểm đó sang không gian 3 chiều để xử lý mà trong thực tế mỗi điểm Kỹ thuật lập trình mô phỏng thế giới thực 136 trong không gian 2 chiều sẽ tượng ứng với vô số điểm trọng kllslns gian 3 chiều, vì vậy việc chuyển đổi này sẽ rất khó. Phần này sẽ cung cấp các phương t ức chuyên đổi giữa các không gian 2D và 3D. Chuyển đổi tọa độ từ không gian 3D sang không gian 2D (3D to 2D Conversion): Mọi điểm trong không gian 3D đều tương ứng với một điểm trong không gian 2D và chúng ta có thể biết được một điểm trong không gian 3D có tọa độ ra sao trong không gian 2D bằng hàm: int Morfit_engine_3D_point_to_2D(double p3D[3], int p2D[2]); Hàm này sẽ trả về giá trị 0 nếu thành công khi đó p2D[2] là các điểm trong không gian 2D, các giá trị trả về khác 0 thì hoặc là có lỗi hoặc cặc điểm cần chuyển không nằm trong vùng nhìn thấy của camera. Ta còn được cung cấp hàm chuyển một đường từ hệ tọa độ 3D sang hệ tọa độ 2D đó là: int Morfit_engine_3D_edge_to_2D(double.pl[3], double p2[3], int pl_2D[2], int p2;2D[2]); Các điểm pl_2D và p2_2D là các điểm tương ứng trong không gian 2D của điểm đầu vào kết quả trả ra của hàm là: EDGE_FULLY SEEN: Đường thẳng em gọn trong cửa sổ hiển thị. EDGE_ARTIALLY_SEEN:Một phần đường thẳng thuộc cửa sổ hiển thị các điểm pl_2D và p2_2D xác định một phần của đường thẳng trong cửa sổ. EDGE_NOT_SEEN: Đường thẳng nằm ngoài cửa sổ hiển thị không có giá trị trả lại VR_ERROR: Có lỗi trong quá trình chuyển không có đường trả ra. Chuyển tọa độ từ không gian 2D sang không gian 3D (2D to 3D Conversion): Việc chuyển đổi từ không gian 2D sang không gian 3D là tương đối phức tạp. Thực tế thì một điểm trong không gian 2D sẽ tương ứng với vô hạn các điểm trong không gian 3D.Tuy vậy, Morfit cung cấp cho ta một số hàm trợ giúp việc tìm tọa độ trong không gian 3D cần tìm. Thông thường, nếu một đa giác tồn tại đặt tại điểm đưa vào trên màn hình thì điểm của đa giác đó chính là điểm tọa độ 3D mà ta cần tìm. Để tìm ra điểm 3D ta dùng hàm sau: int Morfit_engine_2D_point_to_3D(int x, int y, double result[3], DWORD *selected_object_handle, DWORD *selected_polygon_handle); Nếu đa các tồn tại đặt tại điểm đưa vào thì làm trên sẽ trả lại giá trị OK, điểm result sẽ là điểm nhận được tương ứng trong không gian 3D và hàm sẽ trả lại handle tới đa giác và đối tượng chứa điểm đó. Nếu không có đa giác nào nằm trên điểm đưa vào thì hàm sẽ trả lại giá trị VR_EROR. Đôi khi bạn muốn chuyển một điểm từ 2D sang 3D mà không có đa giác nào tồn tại tại điểm đó thì bạn phải cung cấp thêm một mặt phẳng. Hàm dưới đây sẽ trả lại một Kỹ thuật lập trình mô phỏng thế giới thực 137 điểm trong không gian 3D bằng cách cho biết điểm trong không gian 2D và một mặt phẳng: int Morfit_engine_2D_point_to_3D_point_plane(int x, int y, double polygons_plane[4],double p3d[3]); Hàm này trả về giá trị SUCCESS nếu việc thực hiện thành công, ngược lại nó trả về giá trị VR_ERROR. Mặt phẳng được xác định theo mẫu chuẩn sau: Ax + By + Cz + D = 0, Trong đó: polygon_plane[0] = A polygons_plane[ 1 ]= B polygons_plane[2] = C polygons_plane[3]=D Ví dụ 3. 7.1: Mặt phẳng có x :-20, được xác định như sau: 1x + 0y + 0z + 20 =0, bởi vậy polygons_plane = {1,0,0.20 } . Morfit còn cung cấp cho chúng ta cách để xác định đối tượng hay đa giác chứa điểm 2D.Nó cũng cho phép bạn dịch chuyển một đối tượng trong không gian 2D v.v.. Để biết được một đối tượng hay một đa giác được đặt tại điểm nào trong 2D mà không cần quan tâm tới tọa độ tương ứng trong 3D, bạn có thể sử dụng hàm sau: DWORD Morfit_engine_get_object_at_point_2D(int x,int y); DWORD Morft_engne_get_polygon_at_point_2D(int x,int y), Khi người sử dụng đang kéo một đối tượng từ điểm này sang điểm khác trong màn hình cùng với chuột, thì nó có thể convert từ sự dịch chuyển 2D vào trong sự dịch chuyển 3D trong thế giới. Để biết được điều này chúng ta sử dụng hàm sau: int Morfit_engine_translate_movement_on_screen_to_world(double p3D[3], double result_p3D[3], int delta_x, int delta y); Ví dụ 3.7.2: Một đối tượng được đặt tại vị trí [x,y,z]. Chuột ở vị trí tọa độ cũ trên màn hình (oldx,oldy). Người sử dụng kéo chuột tới vị trí mới (newx,newy). Để dịch chuyển đối tượng tương ứng với vị trí của chuột chúng ta làm như sau: int delta_x = newx _ oldx; int delta_y=newy_oldy; double obj_loc[3] = {x,y,z}; double new_loc[3]; Kỹ thuật lập trình mô phỏng thế giới thực 138 Morin_engne_translate_movement_on_screen_to_movement_in_world(obj_loc, new_loc, delta x, delta y); Morfit_object_set_location(object_handle,new_loc[0],new_loc[l],new_loc[2]); 3.7.4. Dịch chuyển Phát hiện va chạm: Engine API cung cấp một hàm để phát hiện sự va chạm. Giả sử một đối tượng đang ở vị trí start_location, bạn muốn dịch chuyển nó đến vị trí end_location. Chúng ta sử dụng hàm sau đây: int Morfit_engine_is_movement_possible(double start_location[3], double end_location[3], DWORD *intersected_polygon, double intersection[3], DWORD *blocking_object); Hàm này, bạn cung cấp một đoạn thẳng, nếu có một điểm nào chạm vào một dối tượng thì hàm sẽ trả lại giá trị NO đa giác mà nó chạm vào và đối tượng chứa đa giác đó. Tốc độ chuyển động Nếu bạn dịch chuyển đối tượng 50 đơn vị cho mỗi lần thì tốc độ dịch chuyển sẽ phụ thuộc vào tốc độ xử lý của máy tính. Nếu bạn muốn tốc độ dịch chuyền là một hằng số và không phụ thuộc vào tốc độ của máy tính cụ thể thì bạn có thể tính toán tốc độ xử lý hiện tại của máy tính điều khiển tốc độ dịch chuyển của đối tượng. Ta có thể tính tốc độ của máy tính bằng hàm: Morfit_engine_get_computer_speed_factor(). Hàm này sẽ trả về một giá trị tỉ lệ với tốc độ tính toán của máy tính. Để tốc độ dịch chuyển là một hằng số mà không ảnh hưởng tới tốc độ xử lý nhanh của máy tính thì chúng ta sứ dụng hàm sau: factor = Morfit_engine_get_computer speed factor() corrected_number = 50 * factor; move_my_object(corrected_number); Chú ý: Tốc độ máy tính phụ thuộc vào từng thấy cụ thể và cũng phụ thuộc vào lượng tài nguyên của máy dành cho chương trình. Do đó, nó sẽ không cố định trong quá trình hoạt động của chương trình và ta không thể tính tốc độ này một lần để dùng cho toàn bộ chương trình. 3.7.5.Một API engine khác Log window: Log window là cửa sổ hiển thị mỗi lần bạn load thế giới. Bạn có thể thấy cửa sổ hiển thị với trạng thái hiện thời của tiến trình load thế giới Morfit cho phép chúng ta tạo ra một cửa sổ hiển thị cho riêng mình và có thể hiển thị tiến trình trên màn hình. Muốn vậy, chúng ta sử dụng các hàm tạo và điều khiển sự hiển thị. Ví dụ 3.7.3: Có một cửa sổ hiển thị sau: Kỹ thuật lập trình mô phỏng thế giới thực 139 Hình 3.2.0. Cửa sổ hiển thị trên trình trên màn hình Cửa sổ này gồm có 3 vùng mà bạn có thể điều khiển: Text window, progress number và target number.Progress Bai sẽ tự động cập nhật để phản ánh các progress và target number. Bạn có thể thay đổi một số thông số của cửa sổ này bằng các hàm: -Tạo một cửa sổ hiển thị: Morfit_engine_set_log_window_visible(); dùng để bật cửa sổ này 1 en mỗi khi làm một công vụ tốn một lượng thời gian đáng kể. -Che giấu cửa sổ hiển thị trên màn hình: Morfit_engine_hide_log_window(); giấu cửa sổ này không hiển thị nó. Để thu nhỏ cửa sổ hiển thị chúng ta dùng hàm sau: Morfit_log_window_minintize(); -Trả lại chế độ hiện thời của cửa sổ hiển thị (currently visible) chúng ta sử dụng hàm sau: int Morfit_engine_is_log_window_visible(); Để sửa lại nội dung văn bản chúng ta có hai cách sau: Cách 1 : Thêm văn bản vào cửa sổ Morfit_engine_log_window_output(char *text); Cách 2: Thay thế văn bản trong cửa sổ hiện thời bằng văn bản mới. Morfit_engine_log_window_set_text(char *new_text); Để thiết lập tiêu đề cho cửa sổ chúng ta sử dụng hàm sau: Morfit_engine_log_window_set_title(char *new_caption); Để điều khiển giá trị của progress và target bạn có thể dùng hàm sau: Kỹ thuật lập trình mô phỏng thế giới thực 140 Mornt_engine_set_log_window_progress(int value); Morfit_engine_set_log_window_target(int value); int Morfit_engine_get_log_window_progress(); int Morfit_engine_get_log_window_target(); Thêm một đa giác vào thế giới (Adding Polygons to the World): Trong chế độ Editor Mode bạn có thể tạo và thêm một đa giác vào thế giới.Để thêm một đa giác đầu tiên bạn phải tạo ra nó bằng hàm: Morfit_polygon_create(), sau đó bạn phải thêm các điểm vào đa giác bằng hàm: Morfit_polygon_add_point(); Bạn có thể sửa đổi và dịch chuyển đa giác, tuy nhiên đa giác sẽ không được hiển thị trên màn hình cho tới khi bạn thêm nó vào thế giới bằng cách sử dụng hàm: int Morfit_engne_add_polygon(DWORD polygon_handle); . Loại bỏ những đối tượng không cần thiết (Elintinating Unnecessary Obiects): Rất nhiều đa giác nằm trên cùng một mặt phẳng và bạn có thể kết hợp chúng lại thành một đa giác. Ví dụ như hình dưới đây: Việc kết hợp các đa giác lại với nhau sẽ giúp bạn tiết kiệm bộ nhớ và thời gian xử lý. Để kết hợp các đa giác và loại bỏ những phần không cần thiết ta có thể sử dụng hàm sau: int Morfit_engine_reduce_polygons_count(double accuracy); Trong đó accuracy là độ gần gũi của các đa giác, có nghĩa nếu accuracy = 0 thì nó chỉ kết hợp các đa giác nằm trên một mặt phẳng. Nếu muốn kết hợp các đa giác nằm trên các mặt phẳng khác nhau thì accuracy phải lớn hơn hoặc bằng 1 . Ngoài ra, bạn có thể sử dụng một công cụ khác để tiết kiệm bộ nhớ bằng cách không khơi tạo từ bộ nhớ những hình ảnh (bitmaps). int Morfit_engine_unload_unused_bitmaps(); Hàm này trà về một hình ảnh không được khởi tạo. Để không khởi tạo tất cả hình ảnh, bạn có thể sử dụng hàm sau: Kỹ thuật lập trình mô phỏng thế giới thực 141 Morfit_engine_unload_all_bitmaps(); Loa (Speaker): Bất kỳ khi nào engine phát hiện ra lỗi, nó sẽ làm cho loa phát ra tiếng kêu beep,đồng thời nó cũng ghi lỗi đó vào file Morfit.log và file error.log. Bạn có thể tắt âm thanh phát ra loa mỗi khi có lỗi bằng cách sử dụng hàm: Morfit_engine_set_speaker_mode(int yes_no_flag); . 3.7.6. Tóm tắt Engine API chứa các hàm tác động trên diện rộng (toàn bộ thế giới), cho phép hiển thị thế giới trên màn hình. Bạn biết được cách điều khiển độ chính xác về sự hiển thị và thời gian để render ảnh. Ngoài ra, bạn có thể biết được cách để convert giữa hệ tọa độ 2D trên màn hình và hệ tọa độ 3D trong thế giới.. 3.8. ẢNH VÀ ẢNH ĐỘNG Nếu thế giới chỉ gồm các màu đơn thì sẽ trở nên vô cùng đơn điệu, nó không thể thể hiện được các trạng thái hình ảnh phức tạp. Do đó trong thế giới ta phải sử dụng các hình ảnh để bọc, bao phủ lên các đối tượng tạo cảm giác như các đối tượng trong thực tế. Phần này sẽ giới thiệu cách sử dụng các hình ảnh. Trước khi sử dụng bất kỳ hình ảnh nào bạn phải chắc chắn rằng nó tồn tại trong ổ cứng. Các hình ảnh có thể lấy ra sẵn từ ổ cứng hay từ mạng có thể tạo bởi một số công cụ tạo ảnh như photoshop,photopaint hay Paintbrush v.v... Kênh trong suốt (tranparency): Là một kênh (một màu) cho phép nhìn thấy các hình ảnh đằng sau nó. Ví dụ: khi ta có một ảnh người trên nền là một kênh trong suốt khi đặt ảnh đó váo một không gian thì ta chỉ nhìn thấy hình người mà thôi còn nền sẽ không thấy, thay vào đó là các đối tượng đặt sau ảnh trong không gian. Morfit hỗ trợ cho chúng ta trong việc định nghĩa và hiển thị kênh trong suốt cho các hình ảnh. Ảnh động: Một ảnh động thực chất là một tập hợp có thứ tự các hình ảnh liên tục thay thế nhau sau một đơn vị thời gian. 3.8.1.Làm việc với ảnh Load ảnh:Trước khi làm việc với ảnh bạn phải khởi tạo nó từ bộ nhớ ngoài bằng cách sử dụng hàm: DWORD Morft_bilmap_load(char*file name,int transparent_index); Hàm này sẽ trả về một handle tới ảnh. Trường File_name: Là tên của ảnh không cần phần đuôi mở rộng, nếu bạn có viết đuôi mở rộng thì engine cũng sẽ bỏ qua bởi vì engine luôn tìm định dạng file có phần mở là JBM trước, sau đó nó sẽ tìm các file có định dạng .BMP và cuối cùng mới là .JPG. Kỹ thuật lập trình mô phỏng thế giới thực 142 Transparent_index: Xác định màu trong suốt của ảnh, nó có thể nhận một trong các giá trị sau: Nếu là -1 thì không có màu trong suốt 0 thì màu trong suốt là màu nhiều nhất của ảnh, 1 là màu nhiều thứ hai v.v.. Bạn có thể load ảnh một cách tuần tự bằng cách sử dụng các hàm: Morfit_bitmap_get_first_bitmap() và Morfit_bitmap_get_next(DWORD bitmap_handle Bạn có thể lấy một ảnh cụ thể bằng cách sử dụng hàm sau: DWORD Morfit_bitmap_get_handle(char *file_name, int transparent_index), Chú ý: Hàm này chỉ lấy hình ảnh đã được khởi tạo vào bộ nhớ chứ nó không khởi tạo hình ảnh ở ngoài ổ cứng như hàm Morfit_bitmap_load();. Để lưu ảnh đã được sửa đổi, bạn có thể sử dụng hàm sau: Morfit bitmap_save(DWORD bitmap_handle,char*full_path_name); Với hàm này ảnh sẽ được lưu theo định dạng file mở rộng mà bạn cung cấp trong tham số full_path_name. Ví dụ 3.8.1 Morfit_bitmap_save(my_bitmap_handle, “C:\\john\\bitmaps\\grass.bmp"); Để unload một ảnh từ bộ nhớ chúng ta sử dụng hàm sau: Morfit_bitmap_unload(DWORD bitmap_handle); Màu của ảnh (Bitmap Colors): Ta thấy rằng mỗi ảnh đều có một bảng màu trong đó màu thứ 0 là màu thường xuyên xuất hiện nhất, màu thứ 1 là màu thường xuyên xuất hiện thứ hai v.v.. Bạn có thể tìm ra được màu thực tế từ giá trị của bảng màu bằng cách sử dụng hàm sau: int Morfit_bitmap_index_to_rgb(DWORD bitmap_handle, BYTE index ,BYTE *red, BYTE *green, BYTE *blue); Ví dụ 3.8.2: Morfit_bitmap_index_to_rgb(my_bitmal,0,&red, &green, &blue); hàm sẽ trá về giá trị RGB là thứ màu được sử dụng hiệu quả nhất trong ảnh. Hoặc cũng có thể tìm ra số thứ tự của màu trong bảng màu bằng cách sử dụng hàm: int Morfit_bitmap_rgb_color_to_index(DWORD bitmap_handle, BYTE red, Kỹ thuật lập trình mô phỏng thế giới thực 143 BYTE green, BYTE blue);. Ví dụ 3.8.3: Nếu bạn muốn khởi tạo một ảnh với rực rỡ màu đỏ thì làm như sau: RGB với red = 255, green = 0 và blue :0; Trong trường hợp không biết được thứ tự của màu được sử dụng nên không thể xác định được độ trong suốt khi khởi tạo ảnh, thì chúng ta có thể làm như sau: DWORD temp_handle = Morfit bitmap_load("picture", -1 ); int red_index_Morfit_rgb_color_to_index(temp_handle, 255, 0, 0, 0), DWORD my_bitmap=Morfit_ bitmap load("picture", red_index); Morfit_bitmap_unload(temp_handle); Bạn có thể tìm ra đó trong suốt của ảnh bằng cách sử dụng hàm sau: int Morfit_bitmap_get_transparent_rgb(DWORD bitmap_handle, int *red, int *green, int *blue), Hàm này trả về giá trị VR_ERROR nếu ảnh không có màu trong suốt. Để tìm ta chỉ số màu trong suốt của ảnh chúng ta sử dụng hàm sau: int Morfit_bitmap_get_transparent_index(DWORD bitmap_handle) Thay đổi kích thước của ảnh (Resizing Bitmaps): chúng ta có thể tạo mới bản copy của ảnh bằng hàm sau: DWORD Morfit_bitmap_resample(DWORD source_bitmap_handle, int new width, int new_height);. Bạn có thể thay đổi cỡ của ảnh so với ảnh gốc bằng cách đổi new_width và new_height so với ảnh ban đầu. Có thể lấy độ rộng và chiều cao của ảnh bằng cách sử dụng các hàm sau: int Morfit_bitmap_get_width(dword_bitmap_handle); int Morft_bitmap_get_height(DWORD bitmap_handle); Một số hàm thao tác với ảnh khác (Other Bitmap Functions): - Bạn có thể lấy được số đa giác mà ảnh bao phủ bằng hàm: int Morfit_bitmap_get_number_of_polygons_using_bitmap(DWORD bitmap_handle); -Chúng ta cũng có thể lấy được vùng nhớ của ảnh bằng cách sử dụng hàm sau: Morfit_bitmap_get memory(). Ta sẽ nhận được một mảng kiểu BYTE có kích thước (width*height) từ hàm này (các giá trị màu trong bảng là các giá trị chỉ thứ tự trong báng màu). Bằng cách sửa đổi mảng này, ta có thể thay đổi đến từng điểm ảnh của ảnh hiển thị. Kỹ thuật lập trình mô phỏng thế giới thực 144 3.8.2. Ảnh động: Mỗi ảnh động có thể chứa 5 tập hợp các ảnh, chúng đại diện cho 5 góc nhìn đó là front, front_side, side, back_side và back. Không phải toàn bộ tập hợp ảnh phải được sử dụng,nhưng tất cả các tập hợp đã được sử dụng phải chứa số hình ảnh tương tự như nhau. Có nghĩa nếu mặt trước (front) chứa 6 ảnh thể mặt sau phải chứa hoặc là 6 ảnh hoặc là 0 ảnh nó không thể chứa 8 ảnh. Các API ảnh động sẽ cung cấp phương thức để tạo và điều khiển danh sách các ảnh trong tập hợp và thời gian mỗi ảnh được hiển thị. Tạo ảnh động: Để tạo một ảnh động trước tiên bạn gọi hàm Morfit_anintation_create() như sau: DWORD Morfit_anintation_create(char *name); Hàm này sẽ trả lại một handle tới một ảnh động rỗng. Cũng như làm việc với bất kỳ đối tượng nào bạn có thể lấy được handle của các ảnh động có trong thế giới một cách tuần tự bằng cách sử dụng các hàm: Morfit_anintation_get_first_aninta(); và Morfit_anintation get_next( DWORD animation_handle);. Bạn có thể lấy tên hay đổi tên của ảnh động bằng cách sử dụng các hàm sau: Morfir_anintation_get_name(DWORD anintation_handle); Morfit_anintation_set name(DWORD anintation_handle, char *name); Bạn có thể lấy được handle qua tên của nó bằng hàm: DWORD Morfit_anintation_get_handle(char *anintation_name);. Khi bạn đã hoàn thành việc sử dụng ảnh động bạn có thể huỷ nó bằng hàm sau: Morfit anintation_delete(DWORD aniniation_handle);. Thêm ảnh vào ảnh động: Sau khi đã tạo được một ảnh động bạn có thể thêm một hình ảnh vào bất kỳ một tập hợp nào của ảnh động bằng hàm sau: int Morfit anintation_add_bitmap(DWORD anintation_handle, int bitmap_list , DWORD bitmap_handle, int bitmap_position_index);. Trong đó anintation_handle: là ảnh động bitmap_list: có thể nhận 5 giá trị sau: BITMAP_LIST_FRONT BITMAP_LIST_FRONT_SIDED BITMAP_LIST_SIDE BITMAP_LIST_BACK_SIDED. Kỹ thuật lập trình mô phỏng thế giới thực 145 BITMAP_LIST_BACK bitmap_handle: ảnh để thêm vào. bitmap_position_index: là vị trí đặt của hình ảnh, nó có thể là: 0: Vị trí đầu tiên 1 : Vị trí thứ hai v.v.. -1 : Vị trí cuối cùng. Ta có thể loại bỏ ảnh khỏi ảnh động bằng hàm sau: Int Morfit_anintation_remove_bitmap(DWORDanintation_handle,int bitmap_list, int bitmap_position_index); Có thể lấy được handle của một ảnh tại một vị trí xác định bằng hàm sau: DWORD Morfit_anintation_get_bitmap(DWORD anintation_handle,int bitmap_list, int bitmap_position index); Để tìm ra nhiều ảnh trong ảnh động, chúng ta có thể sử dụng hàm sau: int Morfit_anintation_get_number_of_frames(DWORD anintation_handle); int Morfit_anintation_get_number_of_bitmaps(DWORD anintation_handle); Chúng ta có thể lấy ra toàn bộ liên kết của các ảnh trong ảnh động ra một mảng bằng hàm sau: Morfit_anintation_get_all_bitmaps(DWORD anintation_handle,DWORD bitmaps_array[]); Thời gian trạng thái (Frame Times): Thời gian trạng thái của một hình ảnh là lượng thời gian hiện thị ảnh đó trước khi tham tiếp theo .. Thời gian trạng thái được xác định theo đơn vị 1/100 của giây. Để xác định thời gian trạng thái cho mỗi ảnh ta dùng hàm sau đây: int Morfit_anintation_set_frame_time(DWORD anintation_handle, int frame_index, DWORD time). Ví dụ 3.8.4: Morfit_anintation_set_frame_time(my_anintation, 0, 200); Hàm này sẽ thiết lập thời gian trạng thái của ảnh trong mỗi lần là 2 giây. Và để lỡ thời gian trạng thái của một hình ảnh ta sử dụng hàm: DWORD Morfit_anintation_get_frame_time(DWORD anintation_handle, int frame_index); Kỹ thuật lập trình mô phỏng thế giới thực 146 Ta cũng có thể thiết lập thời gian trạng thái cho toàn bộ các hình ảnh bằng cách tạo một mảng lưu thời gian cho mỗi hình ảnh và gọi hàm: int M

Các file đính kèm theo tài liệu này:

  • pdfjgkiah;glkwp;kghauiguwkhoahockithuatmaytinh (31).pdf
Tài liệu liên quan