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.
183 trang |
Chia sẻ: thienmai908 | Lượt xem: 1188 | Lượt tải: 0
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:
- jgkiah;glkwp;kghauiguwkhoahockithuatmaytinh (31).pdf