MÔ PHỎNG HÀNH ĐỘNG NHÂN VẬT TRONG XÂY DỰNG MÔ HÌNH 3D

77 467 1
MÔ PHỎNG HÀNH ĐỘNG NHÂN VẬT TRONG XÂY DỰNG MÔ HÌNH 3D

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

MỤC LỤC MỤC LỤC LỜI GIỚI THIỆU CHƯƠNG I TỔNG QUAN VỀ THỰC TẠI ẢO VÀ 3D ANIMATION TRONG THỰC TẠI ẢO 1.1 Tổng quan thực ảo 1.1.1 Sơ lược lịch sử phát triển 1.1.2 Các lĩnh vực ứng dụng Thực ảo 1.2 Hành động nhân vật (3D Animation) thực ảo 1.2.1 Animation thực ảo gì? 10 1.2.2 Hiệu ứng Animation thực ảo 10 1.2.3 Cơ sở mô 3D Animation 11 1.2.4 Các vấn đề gặp phải trình nghiên cứu 13 1.2.5 Hướng giải 14 CHƯƠNG II 15 KỸ THUẬT MÔ PHỎNG 15 2.1 Đặt vấn đề 15 2.2 Kỹ thuật mô 15 2.2.1 Khởi tạo nhân vật trang phục 15 2.2.2 Điều khiển mô trạng thái hành động nhân vật 23 2.2.3 Các vấn đề liên quan tới camera phím điều khiển 39 CHƯƠNG III 49 CHƯƠNG TRÌNH MÔ PHỎNG 49 3.1 Bài toán 49 3.2 Mục đích yêu cầu toán 49 3.3 Phương pháp giải toán 49 3.4 Một số kết toán 50 KẾT LUẬN 55 HƯỚNG PHÁT TRIỂN ĐỀ TÀI 56 PHỤ LỤC 57 TÀI LIỆU THAM KHẢO 77 LỜI GIỚI THIỆU Trong năm gần công nghệ thông tin đạt bước phát triển nhảy vọt phần cứng lẫn phần mềm Những ứng dụng vào sống ngày phong phú, đa dạng thiết thực Từ lĩnh vực khoa học bản, kinh tế, kỹ thuật lĩnh vực giải trí, du lịch, không lĩnh vực ứng dụng thiết thực hiệu công nghệ thông tin Sự phát triển không ngừng sức mạnh máy tính làm cho số lĩnh vực khó phát triển trước có khả phát triển đạt thành tựu đáng kể Chúng ta kể đến lĩnh vực như: hệ chuyên gia, hệ xử lý thời gian thực…và lĩnh vực khác cần phải nói Thực ảo (Virtual reality) ứng dụng công nghệ Trong thực ảo Particle lại thành phần vô quan trọng Chính mà đợt làm đồ án tốt nghiệp này, hướng dẫn giúp đỡ Th.S Nguyễn Văn Huân môn Các hệ thống thông tin – Khoa công nghệ thông tin Đại hoc Thái Nguyên Em hướng dẫn tìm hiểu đề tài : “Mô hành động nhân vật xây dựng mô hình 3D” Báo cáo gồm phần chính:  Tổng quan thực ảo hành động nhân vật thực ảo  Kỹ thuật mô  Xây dựng chương trình  Kết luận hướng phát triển CHƯƠNG I TỔNG QUAN VỀ THỰC TẠI ẢO VÀ 3D ANIMATION TRONG THỰC TẠI ẢO 1.1 Tổng quan thực ảo Theo cách truyền thống, việc tương tác với máy tính thực thông qua thiết bị bàn phím, chuột hay Joystick/Trackball/Keyboard/Styplus để cung cấp thông tin đầu vào sử dụng khối hiển thị trực quan (Video Display Unit-VDU) để nhận thông tin đầu từ hệ thống Với đời hệ thống Thực ảo (Virtual Reality-VR), phương thức giao tiếp phát triển cho phép người sử dụng tương tác cách tích cực với máy tính Thực ảo công nghệ sử dụng kỹ thuật mô hình hoá không gian ba chiều với hỗ trợ thiết bị đa phương tiện xây dựng giới mô máy tính – môi trường ảo (Virtual Environment) Trong giới ảo này, người sử dụng không xem người quan sát bên ngoài, mà thực trở thành phần hệ thống Một cách lý tưởng, người sử dụng tự chuyển động không gian ba chiều, tương tác với vật thể ảo, quan sát khảo cứu giới ảo góc độ khác mặt không gian Ngược lại, môi trường ảo lại có phản ứng tương ứng với hành động người sử dụng, tác động vào giác quan thị giác, thính giác, xúc giác người sử dụng thời gian thực tuân theo quy tắc vật lý tự nhiên, làm có cảm giác tồn giới thực Mục tiêu phần tổng quan đưa số nét tổng quát công nghệ Thực ảo, bao gồm: số nét lịch sử hình thành, lĩnh vực ứng dụng, phân loại hệ thống, phương pháp & công cụ phần mềm phổ biến tạo mô hình VR 1.1.1 Sơ lược lịch sử phát triển Mặc dù Thực ảo mô tả công nghệ mang tính cách mạng, ý tưởng việc nhúng người sử dụng vào môi trường nhân tạo đời từ sớm Thực ảo xem tiếp nối ý tưởng lâu hệ thống mô bay (Flight Simulation), rạp chiếu phim ảnh rộng (như Cinerama hay IMAX), rạp chiếu phim v.v… Sử dụng hệ thống vậy, người quan sát có cảm giác hình ảnh sống động trước mắt Sự đời máy điện toán mini báo khoa học Ivan Sutherland có tên “Màn hình tối tân” (Ultimate Display) vào năm 1965 xem hai bước đột phá lớn vào thập kỷ 60 cho công nghệ Thực ảo Trong báo mình, Sutherland tiên đoán phát triển Thiết bị Hiển thị đội đầu (Head Mounted Display-HMD) đầu tiên, mà sau ông tạo thiết bị vậy, có tên “Thanh kiếm Damocles” (The Sword of Damocles) Sutherland nhận tiềm máy điện toán việc tạo lập hình ảnh cho hệ thống mô bay, hình ảnh trước xây dựng Video Camera Những ý tưởng hai nhà khoa học Mỹ NASA Fisher McGreevy kết hợp lại dự án có tên “Trạm làm việc ảo” (Visual Workstation) vào năm 1984 Cũng từ NASA phát triển thiết bị Hiển thị đội đầu có tính thương mại đầu tiên, gọi hình môi trường trực quan (Visual Environment Display - VIVED), thiết kế dựa mẫu hình mặt nạ lặn với hình quang học mà hình ảnh cung cấp hai thiết bị truyền hình cầm tay Sony Watchman Sự phát triển thiết bị thành công dự đoán, NASA sản xuất thiết bị HMD có giá chấp nhận thị trường, ngành công nghiệp Thực ảo đời 1.1.2 Các lĩnh vực ứng dụng Thực ảo Mặc dù khái niệm Thực ảo xuất từ lâu, nhiều lý mặt công nghệ (cơ sở phần cứng phát triển, nghiên cứu, chi phí), phải nhiều thời gian nỗ lực để Thực ảo có thành tựu ngày Hiện lĩnh vực công nghệ nhiều tiềm xét khía cạnh ứng dụng Một số lĩnh vực ứng dụng có khuynh hướng phát triển mạnh mẽ thời gian gần a Kiến trúc thiết kế thiết bị công nghệ Một lĩnh vực ứng dụng tiêu biểu Thực ảo thiết kế kiến trúc Khả mô hình hoá giới thực công nghệ Thực ảo dường đáp ứng cách tự nhiên mục tiêu ngành thiết kế kiến trúc: đưa mô hình trực quan hình ảnh công trình mong muốn tương lai Hình - Ứng dụng Thực ảo thiết kế kiến trúc Việc xây dựng mô hình không gian kiến trúc hình ảnh lập thể với đầy đủ mô tả trực quan hình khối kiến trúc nhà, cách bố trí nội thất bên trong, chí hoa văn cửa sổ hay màu sơn tường, với khả cho phép khách hàng tự tham quan, khảo sát nhà họ tương lai theo nhiều góc độ vị trí, từ phòng sang phòng khác thực đem lại hiệu trực quan mang tính cách mạng lĩnh vực mang nhiều đặc điểm nghệ thuật b Giải trí Thị trường giải trí ứng dụng tiêu biểu khác môi trường Thực ảo Trên thực tế, lĩnh vực ứng dụng lớn xét theo khía cạnh lợi ích tài Rất nhiều công ty sản xuất trò chơi có sử dụng nguyên lý Thực ảo Số lượng người bị hút theo trò chơi vậy, đặc biệt giới trẻ, tăng theo cấp số nhân đánh dấu tiềm thương mại to lớn công nghệ Thực ảo lĩnh vực Hơn thế, ngành công nghiệp trò chơi điện tử có ảnh hưởng to lớn tới lĩnh vực Thực ảo Nó tạo động lực cần thiết để thúc đẩu phát triển nhiều phần cứng Thực ảo, chẳng hạn card tăng tốc đồ hoạ (Graphic Accelerator Cards) Nếu trở lại khoảng 10 năm trước, thật khó tìm thấy card tăng tốc đồ hoạ có đủ lực tính toán cần thiết cho phép tạo ứng dụng Thực ảo thời gian thực Tại thời điểm đó, card trị giá hàng ngàn đôla đủ khả sinh 100.000 đa giác/giây mức độ phân giải trung bình Những thiết bị phần cứng khác Găng tay liệu (DataGloves) Thiết bị hiển thị đội đầu (Head Mounted Displays-HMD) chịu ảnh hưởng phần công nghiệp giải trí Tóm lại, ứng dụng Thực ảo giải trí đóng vai trò vừa mục tiều vừa động lực cho công nghiệp Thực ảo Hình - Ứng dụng Thực ảo lĩnh vực giải trí c Giáo dục Đào tạo Phát triển công nghệ kỹ thuật cao, Thực ảo tích hợp đặc tính làm cho thân có tiềm vượt trội so với công nghệ đa phương tiện truyền thống khác: cho người sử dụng cảm nhận diện môi trường máy tính tạo khả tương tác, tự trị (Autonomy) người dùng môi trường ảo, phản hồi tức thời, trực quan từ phía môi trường ảo tới giác quan người sử dụng Hơn nữa, công nghệ Thực ảo cho phép mô môi trường nguy hiểm hay tốn buồng lái máy bay, phòng thí nghiệm hoá chất.v.v… Hình – Mô hình huấn luyện bay sử dụng công nghệ Thực ảo Tất đặc tính khiến công nghệ Thực ảo trở nên phù hợp cho ứng dụng có tính chất giáo dục hay đào tạo Trong đó, mô hình trình diễn lập đóng vai trò quan trọng Các vật thể giới ảo biểu diễn xác nhiều so với đối tượng phẳng (hình ảnh hai chiều) bổ sung thêm chiều sâu Kết trình diễn minh hoạ hay thí nghiệm mô xác quan sát từ nhiều góc độ khác mặt không gian, điều mà giới phẳng hai chiều không làm Tính chất trực quan giảng nâng cao bước làm tăng hứng thú học tập khả ghi nhớ khái niệm quan trọng giảng Xét mặt này, khả tương tác với môi trường ảo khía cạnh đáng lưu ý Nếu thiếu khả tương tác (hai chiều) môi trường ảo người tham dự, Thực ảo không khác giao diện lập thể ấn tượng sống Trong phòng thí nghiệm hay huấn luyện ảo, thực thao tác đối tượng môi trường ảo, nhận phản hồi kịp thời có nghĩa từ vật thể môi trường yếu tố tiên khiến cho học viên có cảm nhận trải nghiệm tình thực Từ đó, học viên nắm bắt nhanh chóng có ý thức với tính học Và viễn tưởng ta nói ngày học học sinh kỹ sống đào tạo môi trường ảo d Y học Y học lĩnh vực ứng dụng tiềm công nghệ Thực ảo Cho đến nay, lĩnh vực bật y học áp dụng thành công công nghệ Thực ảo giả lập giải phẫu (Surgical Simulation) Hình - Phẫu thuật ảo – Phương pháp đào tạo phẫu thuật dùng công nghệ Thực ảo Trên sở kỹ thuật đồ hoạ máy tính Thực ảo, hệ thống đào tạo y học bao gồm hai phận bản: Khối tương tác ba chiều mô hình sinh thể ảo cho phép người sử dụng thực thao tác giải phẫu thông qua dụng cụ giải phẫu ảo; Khối giao diện người dùng hai chiều cung cấp thông tin phản hồi trực quan từ mô hình trình giải phẫu thông tin hướng dẫn phiên đào tạo Phương pháp đào tạo có tính tương tác cao mang nhiều ưu điểm so với phương pháp truyền thống thực hành mô hình plastic hay bệnh nhân thực Thứ nhất, khác với phương pháp dùng mô hình plastic, sinh thể giải phẫu ảo có khả cung cấp thông tin phản hồi sinh học cách tự nhiên sinh thể sống thực, chẳng hạn thay đổi nhịp tim, huyết áp… Điều tạo cho học viên có cảm giác trải qua ca mổ tình thực Thứ hai, khác với thực hành bệnh nhân thật, sai lầm học viên trình thực tập trả giá thương tổn thực thể người bệnh Điều làm giảm áp lực lên học viên thực phẫu thuật ảo Từ đó, giúp họ tự tin chủ động học tập Phương pháp cho phép bác sĩ không ngừng nâng cao trình độ tay nghề, kỹ phối hợp làm việc cách liên tục đặt giả định tình bệnh, cập nhật liệu bệnh lý để thực phương pháp mới, kỹ thuật điều trị Bác sĩ tự lập kế hoạch mổ thử bệnh nhân ảo trước mổ bệnh nhân thật làm tăng mức độ an toàn hiệu điều trị, giảm thiểu sai lầm rủi ro đáng tiếc xảy Xu hướng ứng dụng thực ảo tương lai Chúng ta thấy phần kết to lớn việc ứng dụng thực ảo thấy phần việc ứng dụng thực ảo tương lai Thực ảo tiếp tục ứng dụng mạnh mẽ số lĩnh vực mở đường cho ứng dụng tin học vào lĩnh vực khác Thực ảo thâm nhập vào nhiều lĩnh vực có mặt tin học sống Ý nghĩa việc ứng dụng thực ảo Những kết ý nghĩa to lớn việc ứng dụng thực ảo giai đoạn tương lai nhắc tới Nhưng có câu hỏi đặt đằng sau điều tuyệt vời mà thực ảo mạng lại, có làm phải quan tâm? Vấn đề thực ảo gì? Để trả lời câu hỏi đó, tìm hiểu chi tiết phần Tất ứng dụng thực ảo liên quan đến việc xây dựng mô hình mô giới máy vi tính cung cấp khả quan sát tương tác mô hình với người sử dụng thông qua thiết bị đầu vào đầu Như vậy, nói vấn đề thực ảo phải xây dựng mô hình mô giới thực máy tính theo không gian 3D, cung cấp dịch vụ tương tác môi trường mô với người sử dụng thông qua thiết bị vào 1.2 Hành động nhân vật (3D Animation) thực ảo Trong VR hiệu ứng 3D đóng vai trò quan trọng việc xây dựng mô hình giới thực, hiệu ứng hành động đối tượng đóng vai trò thiếu Không thể thiếu đối tượng không tạo lên tương tác với đối tượng khác không gian giới không di chuyển hay thay đổi “trạng thái” (chính hiệu ứng) vị trí Như tạo cảm giác nhàm chán cho người xem, làm cho không gian giới ảo không linh động, “sức sống”, mà làm người xem nhầm tưởng coi ảnh với cảnh vật tĩnh Vì mà nói không đối tượng, vật giới không liên quan đến hành động Ở ví dụ : Một chịu sức thổi gió nghiêng ngả theo chiều gió, người chạy đường với đoạn đường khúc khủy, lên dốc hay xuống dốc lúc thấy rõ thay đổi vận tốc… Nhận thấy tầm quan trọng thiếu mà phải nghiên cứu tìm hiểu mô hiệu ứng hành động đối tượng môi trường thực ảo Hiện có nhiều hiệu ứng khác đối tượng mà tác giả chọn việc mô hành động nhân vật (3D Animation) môi trường không gian ảo để phân tích mô 1.2.1 Animation thực ảo gì? - Animation: Thực chất tập hợp hình ảnh có thứ tự khởi động cách liên tục, thường dùng để mô tả vật đống lửa, hình tivi v.v Hay nói cách khác, chuỗi có thứ tự hình ảnh thay nhau, tạo hiệu ứng vận động - 3D Animation: Là kết hợp hiệu ứng Animaition để tạo hành động đối tượng trở nên mềm mại, uyển chuyển trình chuyển động có thay đổi trạng thái môi trường không gian 3D 1.2.2 Hiệu ứng Animation thực ảo Hiệu ứng Animation hiểu việc sử dụng nhiều cử chỉ, hành động giống khác nhau, thiết lập, thay đổi trang phục, tính chất, kích thước, vận tốc…cho animation (đối tượng) cho chúng chuyển động tự nhiên tuân theo quy luật để tạo thành hiệu ứng 3D môi trường thực ảo Các hiệu ứng animation tạo 10 Morfit_engine_maximize_default_rendering_window(); if(Morfit_3D_card_set_window_mode() == VR_ERROR) { if(Morfit_3D_card_check_hardware_support() == YES) { MessageBox(NULL, "Loi cai dat 3D card.\n \nVui long kiem tra 3D card and DirectX 6.1 \n","No 3D card", MB_OK); } } } } else if((GetAsyncKeyState('R')&1)&& (GetAsyncKeyState('R')replace_skin(); } static int anim_toggle = 0; if(GetAsyncKeyState('7')&1) { if(anim_toggle == 0) { player1->replace_shape(anim2, " \\ \\ \\ \\ \\Worlds\\player2"); anim_toggle = 1; } else { player1->replace_shape(anim1, " \\ \\ \\ \\ \\Worlds\\player1"); anim_toggle = 0; } } if(GetAsyncKeyState(VK_F1)&1) { help_popup(); } } int init_stuff(player *player1, player *player2, camera *camera1,DWORD *animation1, DWORD *animation2) { //Morfit_3D_card_use(YES); int rc = Morfit_engine_load_world(" \\ \\ \\ \\ \\worlds\\country.wld", NULL, " \\ \\ \\ \\ \\worlds\\bitmaps", USER_DEFINED_BEHAVIOR); if(rc != OK) return(VR_ERROR); // Morfit_3D_sequence_duplicate() if(player1->init(" \\ \\ \\ \\ \\Worlds\\player1\\player.md2", " \\ \\ \\ \\ \\Worlds\\player1") == VR_ERROR) return(VR_ERROR); if(player2->init(" \\ \\ \\ \\ \\Worlds\\player2\\player.md2", " \\ \\ \\ \\ \\Worlds\\player2") == VR_ERROR) return(VR_ERROR); *animation1 = Morfit_object_get_3D_animation(player1->m_player_object); 64 *animation2 = Morfit_object_get_3D_animation(player2->m_player_object); //disable player2 Morfit_object_disable(player2->m_player_object); //Xac dinh vi tri nhan vat //Trong truong hop Z==10000 la vi itri cua nhan vat o duoi nen //Sau nhan vat se duoc dieu chinh toi mot vi tri tot hon Morfit_object_move(player1->m_player_object,OBJECT_SPACE, 1000,0,10000); if(camera1->init(player1->m_player_object) != OK) return(VR_ERROR); //Vai thiet lap voi cua so // //Cac hieu ung chi tren pm mo phong Morfit_engine_set_picture_quality(640*480); Morfit_engine_maximize_default_rendering_window(); Morfit_engine_set_default_rendering_window_title("Do an tot nghiep Cac phim dieu khien: F1, A,Z,X,S,W,1,2,3,4,5,6,7, V,F,R,D,C,H,N, ESC"); Morfit_engine_set_atmospheric_effect_intensity(0); ShowCursor(FALSE); if(Morfit_3D_card_set_window_mode() == VR_ERROR) { if(Morfit_3D_card_check_hardware_support() == YES) { MessageBox(NULL, "Failed to initialize your 3D card.\n This sample only works with hardware rendering\nPlease check that you have a 3D card and DirectX 6.1 and above\n","No 3D card", MB_OK); } //Tao mot cua so nho cho pm mo phong Morfit_engine_set_default_rendering_window_size(240,180,400,400); } Morfit_engine_hide_log_window(); return(OK); } //Ham tao vecto toa void set_vector(double vector[3], double x, double y, double z) { vector[0] = x; vector[1] = y; vector[2] = z; 65 } // player.cpp // ////////////////////////////////////////////////////////////////////// #include #include #include "player.h" #include " \\ \\ \\ \\ \\Engine\\Include\\mrft_api.h" //Ham tao vecto toa void set_vector(double vector[3], double x, double y, double z); player::player() { } player::~player() { } int player::init(char *file_name, char *bitmap_path) { m_speed = 0; m_friction = 0.8; m_max_speed = 50; m_min_speed = 2; m_skin_id = 0; m_player_object = Morfit_object_create_from_file(file_name); if(m_player_object == NULL) return(VR_ERROR); double scale[3] = {3,3,3}; Morfit_object_set_scale(m_player_object, scale); strcpy(m_bitmap_path, bitmap_path); return(update_according_to_new_animation()); } int player::update_according_to_new_animation(void) { //load chung can toi anh engine se ko du de load cac anh da co san bo nho char buff[MAX_PATH]; strcpy(buff,m_bitmap_path); strcat(buff,"\\skin.bmp"); m_skin_bitmap = Morfit_bitmap_load(buff,-1); strcpy(buff,m_bitmap_path); 66 strcat(buff,"\\pain.bmp"); m_pain_bitmap = Morfit_bitmap_load(buff,-1); //thiet lap trang phuc Morfit_object_set_bitmap(m_player_object, m_skin_bitmap); set_parameters_according_to_scale(); m_current_sequence = set_animation_sequence("stand", 0); m_sequence_id_num = STAND; m_stand_sequence = m_current_sequence; DWORD anim3d = Morfit_object_get_3D_animation(m_player_object); m_fall_sequence = Morfit_3D_sequence_get_using_name(anim3d, "death"); if(m_fall_sequence != NULL) { int num_of_frames = Morfit_3D_sequence_get_number_of_frames(m_fall_sequence); //dung trinh tu nga mot trang thai rieng Morfit_3D_sequence_set_frame_duration(m_fall_sequence, num_of_frames-2, 1000000); Morfit_3D_sequence_set_speed(m_fall_sequence,0.5); //times nhanh hon lan } m_walk_sequence = Morfit_3D_sequence_get_using_name(anim3d, "walk"); if(m_walk_sequence == NULL) return(VR_ERROR); m_attack_sequence = Morfit_3D_sequence_get_using_name(anim3d, "attak"); m_pain_sequence = Morfit_3D_sequence_get_using_name(anim3d, "pain"); return(OK); } //Thiet lap cac them so theo ti le kich thuoc //Khi trang thai nhan vat thay doi thi cac thuoc tinh cung thay doi void player::set_parameters_according_to_scale() { double scale[3]; Morfit_object_get_scale(m_player_object, scale); m_acceleration = ACCELERATION * scale[2] / 5; if(m_acceleration < ACCELERATION) m_acceleration = ACCELERATION; m_max_speed = MAX_SPEED * scale[2] / 3; m_min_speed = MIN_SPEED * scale[2] / 3; //thiet lap chieu cao 67 double box[2][3]; Morfit_object_get_bounding_box(m_player_object, box); m_height = box[1][2] - box[0][2]; } DWORD player::set_animation_sequence(char *sequence_name, int transition_duration) { DWORD anim3d = Morfit_object_get_3D_animation(m_player_object); DWORD sequence = Morfit_3D_sequence_get_using_name(anim3d, sequence_name); if(sequence == NULL) return(NULL); Morfit_object_set_3D_sequence(m_player_object, sequence, transition_duration); return(sequence); } void player::move(void) { int muscle_force_used = NO; double save_location[3]; //ghi lai vi tri truong hop nhan vat muon toi Morfit_object_get_location(m_player_object, &save_location[0], &save_location[1], &save_location[2]); DWORD sequence = Morfit_object_get_3D_sequence(m_player_object); if(m_sequence_id_num == WALK || sequence == m_stand_sequence) { //tien phia truoc if(GetAsyncKeyState(VK_UP) < 0) { m_speed += m_acceleration; muscle_force_used = YES; } //lui phia sau if(GetAsyncKeyState(VK_DOWN) < 0) { muscle_force_used = YES; m_speed -= m_acceleration; } } 68 if(m_sequence_id_num == WALK || sequence == m_stand_sequence || sequence == m_attack_sequence || sequence == m_pain_sequence) { //sang trai if(GetAsyncKeyState(VK_LEFT) < 0) { Morfit_object_rotate_z(m_player_object, 6, WORLD_SPACE); } //sang phai if(GetAsyncKeyState(VK_RIGHT) < 0) { Morfit_object_rotate_z(m_player_object, -6, WORLD_SPACE); } } double gravity_and_friction_factor = get_friction_and_gravity_factor(); if(muscle_force_used == NO || fabs(m_speed) > m_min_speed) { m_speed *= gravity_and_friction_factor; if(muscle_force_used == YES) if(fabs(m_speed) < fabs(m_min_speed)) m_speed = m_min_speed * m_speed / fabs(m_speed); } if(m_speed > m_max_speed) m_speed = m_max_speed; if(m_speed < -m_max_speed) m_speed = -m_max_speed; Morfit_object_move(m_player_object,OBJECT_SPACE, -m_speed,0,0); select_sequence(); // xac dinh mot diem duoi cung nen double point_below[3]; get_polygon_below(point_below); //chieu cao giua cua nhan vat co the la chieu cao len + chieu cao than tinh // tu giua xuong duoi (m_height/2) double new_altitude = point_below[2] + m_height / 2; if(new_altitude > save_location[2] + m_height / 3) { Morfit_object_set_location(m_player_object, save_location[0], save_location[1], save_location[2]); 69 m_speed = -m_speed * 0.5; } else { double location[3]; Morfit_object_get_location(m_player_object, &location[0], &location[1], &location[2]); Morfit_object_set_location(m_player_object, location[0], location[1], new_altitude); } } double player::get_friction_and_gravity_factor() { //cong thuc tinh luc // player_mass*earth_gravity*sin(alpha) double plane[4]; double point_below[3]; DWORD polygon = get_polygon_below(point_below); if(polygon==NULL) return(m_friction); Morfit_polygon_get_plane(polygon, plane); double gravity_direction[3]; double z_vector[3] = {0,0,1}; Morfit_math_cross(plane, z_vector, gravity_direction); Morfit_math_cross( plane, gravity_direction, gravity_direction); Morfit_math_normalize_vector(gravity_direction); if(plane[2] < -1 || plane[2] > 1) return(m_friction); //khong co gi xay double cos_alpha = plane[2]; double alpha = acos(cos_alpha); double gravity_force = sin(alpha); //m*g*sin(alpha) m*g==80 m==mass g==earth gravity double direction[3]; Morfit_object_get_direction(m_player_object, &direction[0], &direction[1], &direction[2]); double gravity_factor = Morfit_math_product(gravity_direction, direction); if(m_speed < 0) gravity_factor = -gravity_factor; 70 //nhan vat nga xuong toc qua cao hoac luc tac dung qua lon if((m_sequence_id_num != FALL) && (gravity_factor * gravity_force > 0.3) && (fabs(m_speed) > 0.8 * m_max_speed)) { m_current_sequence = set_animation_sequence("death",300); m_sequence_id_num = FALL; } double result = m_friction+gravity_factor * gravity_force; if(result < 0) result = 0; return(result); } void player::select_sequence() { DWORD sequence = Morfit_object_get_3D_sequence(m_player_object); if(sequence == m_stand_sequence) { m_sequence_id_num = STAND; m_current_sequence = m_stand_sequence; } else { if(sequence == m_walk_sequence) m_sequence_id_num = WALK; m_current_sequence = m_walk_sequence; } // chi mot trinh tu ket thuc thi trinh tu khac moi duoc bat dau // trinh tu van chuyen duoc tao tu dong if( (sequence == m_walk_sequence) && (m_speed < m_min_speed && m_speed > -m_min_speed)) { m_current_sequence = set_animation_sequence("stand",100); m_sequence_id_num = STAND; } else if((sequence == m_stand_sequence) && (m_speed >= m_min_speed || m_speed -m_min_speed)) { //kiem tra trinh tu nga da ket thuc hay chua DWORD anim3d = Morfit_object_get_3D_animation(m_player_object); DWORD fall_sequence = Morfit_3D_sequence_get_using_name(anim3d, "death"); int num_of_frames = Morfit_3D_sequence_get_number_of_frames(fall_sequence); double current_position = Morfit_3D_sequence_get_current_frame(fall_sequence); if(current_position >= num_of_frames - 2) { m_current_sequence = set_animation_sequence("stand",1000); m_sequence_id_num = STAND; } } if(m_sequence_id_num!=FALL) { //thiet lap mot trinh tu dung if(m_speed

Ngày đăng: 03/08/2016, 16:10

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan