Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 75 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
75
Dung lượng
1,56 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƢỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI - PHAN THỊ CÚC NGHIÊN CỨU MÔ PHỎNG ĐỘNG TÁC CHUYỂN ĐỘNG CỦA CON NGƢỜI TRONG THỰC TẠI ẢO LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN Hà Nội - Năm 2016 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƢỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI - PHAN THỊ CÚC NGHIÊN CỨU MÔ PHỎNG ĐỘNG TÁC CHUYỂN ĐỘNG CỦA CON NGƢỜI TRONG THỰC TẠI ẢO Chuyên ngành: Công nghệ thông tin LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN NGƢỜI HƢỚNG DẪN KHOA HỌC PGS.TS ĐỖ NĂNG TOÀN Hà Nội - Năm 2016 MỤC LỤC MỤC LỤC i LỜI CAM ĐOAN i LỜI CẢM ƠN ii DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT iii DANH MỤC HÌNH ẢNH iv LỜI NÓI ĐẦU CHƢƠNG TỔNG QUAN VỀ THỰC TẠI ẢO VÀ CHUYỂN ĐỘNG TRONG THỰC TẠI ẢO 1.1 Tổng quan Thực ảo 1.1.1 Khái niệm thực ảo .3 1.1.2 Lịch sử phát triển thực ảo .4 1.1.3 Hệ thống thực ảo 1.1.4 Đặc điểm hệ thống thực ảo 1.1.5 Một số ứng dụng thực ảo 1.2 Chuyển động Thực ảo 14 1.2.1 Vai trò việc tạo chuyển động 15 1.2.2 Phân loại chuyển động 15 1.2.3 Tạo chuyển động 18 CHƢƠNG MỘT SỐ KỸ THUẬT TẠO CHUYỂN ĐỘNG 21 CHO CON NGƢỜI TRONG THỰC TẠI ẢO 21 2.1 Kỹ thuật tạo chuyển động không dựa vào xƣơng 21 2.1.1 Kỹ thuật tạo chuyển động Keyframe Animation 21 2.1.2 Kỹ thuật tạo chuyển động Path Animation 28 2.1.3 Kỹ thuật tạo chuyển động Non linear Animation With Track 30 2.1.4 Kỹ thuật tạo chuyển động Set Driven Key .30 2.2 Kỹ thuật tạo chuyển động dựa vào xƣơng .31 2.2.1 Kỹ thuật điều khiển tiến FK (Forward kinematics) 35 2.2.2 Kỹ thuật điều khiển ngƣợc IK (Inverse kinematics) 36 CHƢƠNG 3: CHƢƠNG TRÌNH THỰC NGHIỆM 47 3.1 Mô tả toán 47 3.2 Phân tích lựa chọn công cụ mô 47 3.3 Một số kết thực nghiệm 49 PHẦN KẾT LUẬN 63 TÀI LIỆU THAM KHẢO 64 LỜI CAM ĐOAN Tôi xin cam đoan toàn nội dung luận văn tự sƣu tầm, tra cứu xếp cho phù hợp với nội dung yêu cầu đề tài Nội dung luận văn chƣa đƣợc công bố hay xuất dƣới hình thức không đƣợc chép từ công trình nghiên cứu Tất phần mã nguồn chƣơng trình tự thiết kế xây dựng, có sử dụng số thƣ viện chuẩn thuật toán đƣợc tác giả xuất công khai miễn phí mạng Internet Nếu sai xin xin hoàn toàn chịu trách nhiệm Hà Nội, Tháng năm 2016 Học viên Phan Thị Cúc i LỜI CẢM ƠN Với lòng biết ơn sâu sắc, em xin gửi lời cảm ơn tới thầy, cô giáo Viện công nghệ thông tin Truyền thông - Trƣờng Đại học Bách Khoa Hà Nội tâm huyết truyền đạt vốn kiến thức quý báu cho chúng em suốt thời gian học tập trƣờng Và em xin cảm ơn thầy, cô giáo quản lý khoa sau đại học Viện Công nghệ thông tin truyền thông Thái Nguyên giúp đỡ, tạo điều kiện tốt cho em trình học tập Luận văn đƣợc thực dƣới hƣớng dẫn PGS TS Đỗ Năng Toàn Viện Công nghệ thông tin - Đại học Quốc gia Hà Nội Em xin bày tỏ lòng biết ơn sâu sắc tới Thầy hƣớng dẫn có ý kiến dẫn quý báu trình em làm luận văn Em xin cám ơn anh chị Phòng Thực ảo -Viện Công nghệ thông tin - Viện Hàn lâm khoa học Việt Nam nhiệt tình giúp đỡ em trình làm luận văn Tôi xin cảm ơn đồng nghiệp ngƣời thân động viên, giúp đỡ trình nghiên cứu thực luận văn Hà Nội, Tháng năm 2016 Học viên Phan Thị Cúc ii DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT STT Ký hiệu/ Chữ viết tắt Viết đầy đủ Ý nghĩa VR Virtual Reality Thực ảo 3D Dimentional Chiều HMD Head Mounted Displays Mũ đội đầu có hiển thị FK forward kinematics Điều khiển tiến IK inverse kinematics Điều khiển ngƣợc iii DANH MỤC HÌNH ẢNH Hình 1.1 Giao diện ngƣời sử dụng hệ thống máy tính 3D Hình 1.2 Thiết bị mô Sensorrama-1960 Hình 1.3 Ivan Sutherland thiết bị mô HMD .5 Hình 1.4 Thiết bị VIDEOPLACE Myron Kreuger .6 Hình 1.5 Scott Fisher, McGreevy Thiết bị HMD-1984 NASA Hình 1.6 Hệ thống thực ảo Hình 1.7 Mô hình lớp học ảo 10 Hình 1.8 Hệ thống phẫu thuật ảo .11 Hình 1.9 Mô thiết kế kiến trúc nhà 3D 12 Hình 1.10 Binh lính học nhảy dù thực tế ảo 12 Hình 1.11 Hệ thống xƣơng phần mềm đồ họa 17 Hình 1.12 Hệ thống khớp xƣơng liên kết đƣợc phân cấp phần mềm đồ họa 18 Hình 1.13: Cấu trúc chung mô hình phân cấp .19 Hình 1.14 Số lƣợng khung hình nội suy xác định chuyển động 20 Hình 2.1 Hệ thống Frame phần mềm đồ họa 3D 21 Hình 2.2 Mô tả chuyển động theo thời điểm 21 Hình 2.3 Chuyển động nhận vật sử dụng keyframe 22 Hình 2.4: Nội suy tuyến tính cho Keyframe theo thời gian 23 Hình 2.5 Nội suy bậc hai cho Keyframe .24 Hình 2.6 Mô tả chuyển động theo đƣờng cong xác định trƣớc .29 Hình 2.7 Mô tả chuyển động theo ràng buộc thuộc tính .31 Hình 2.8 Mô tả khớp gối xƣơng chân 32 Hình 2.9 Hệ thống xƣơng khớp thể ngƣời .32 Hình 2.10 Sự phân cấp mô hình khung xƣơng ngƣời 33 Hình 2.11 Tạo xƣơng bàn tay 34 Hình 2.12 Mô tả chuyển động dựa vào khung xƣơng 34 Hình 2.13 Hình ảnh điều khiển xoay nhánh xƣơng 35 Hình 2.14 Hệ thống khớp xƣơng sử dụng phƣơng pháp FK 35 iv Hình 2.15 Sử dụng FK để tạo chuyển động cho chân thao tác với bóng 36 Hình 2.16 Hình ảnh điều khiển IK đƣợc thêm cho nhánh xƣơng .37 Hình 2.17 Hình ảnh điều khiển xoay nhánh xƣơng 37 Hình 2.18 Sử dụng IK để tạo chuyển động cho cánh tay .38 Hình 2.19 Dịch chuyển chân từ vị trí đứng để nâng lên .39 Hình 2.20 Sử dụng giải pháp IK để làm cho bàn tay nhân vật đạt đƣợc mục tiêu .40 Hình 2.21 Một liên kết IK đơn 40 Hình 2.22 Môt liên kết đôi IK 41 Hình 2.23 Xoay liên kết cuối cách sử dụng kỹ thuật Phối hợp Descent Cylic cho IK 42 Hình 2.24 Quay liên kết trung gian cách sử dụng kỹ thuật Phối hợp Descent Cylic cho giải pháp IK .43 Hình 3.1 Mô hình skin mặt Front .61 Hình 3.2 Mô hình Wireframe 61 Hình 3.3 Mô hình Skeleton 61 Hình 3.4 Mô hình skin góc nhìn right 62 Hình 3.5 Mô hình skin vừa vừa chào góc nhìn right 62 v LỜI NÓI ĐẦU Ngày nay, phát triển máy tính đem đến cho ngƣời hội để nghiên cứu vấn đề thực tế Bằng việc xây dựng lên môi trƣờng thực ảo, ngƣời xây dựng giới thực vào máy tính, mô kiện có thật giả định thực tế vào vi tính để tìm hiểu Thực ảo (VR – Virtual Reality) [1] môi trƣờng ba chiều đƣợc phát sinh, tổng hợp điều khiển thông qua máy vi tính nhằm mục đích mô lại giới thực giới theo tƣởng tƣợng ngƣời Nó cho phép ngƣời dùng thông qua thiết bị ngoại vi tƣơng tác với vật, tƣợng giới ảo giống nhƣ tƣơng tác với vật, tƣợng giới thực Các ứng dụng VR ngày trở nên hấp dẫn phong phú đặc biệt lĩnh vực y học, kiến trúc, kỹ thuật, khoa học, giáo dục giải trí Trong môi trƣờng ảo, hầu hết ứng dụng chế độ tạo mẫu ảo Các đối tƣợng đƣợc tạo giới nhân tạo dạng mô hình hình học Có thể nói lĩnh vực Thực ảo lĩnh vực vô rộng lớn công nghệ thông tin Nó bao gồm nhiều hƣớng phát triển ứng dụng, không nói tới vấn đề điều khiển mô hình tạo chuyển động cho đối tƣợng cần thiết, quan trọng Khi có chuyển động, tƣơng tác đối tƣợng với đối tƣợng khác môi trƣờng xung quanh Từ mô hình trở nên chân thực sống động Vậy làm để tạo chuyển động cho đối tƣợng để thể đƣợc hành vi, trạng thái đối tƣợng giới thực không đơn giản Việc đòi hỏi ngƣời tạo chuyển động phải hiểu rõ đƣợc đối tƣợng thực tế có kiến thức sâu hỗ trợ tạo chuyển động mà công cụ đƣa Xuất phát từ thành thực ảo đem lại nên định lựa chọn đề tài: “Nghiên cứu mô động tác chuyển động ngƣời thực ảo” việc làm ý nghĩa khoa học mang đậm tính thực tiễn thực tế đặt yêu cầu đòi hỏi Mục đích nghiên cứu đề tài là: 1 -0.004095 -0.025855 -0.156381 0.987350 //(2) keyframe 1 0.001318 0.012536 -0.104520 0.994443 //(2) keyframe 0.002281 0.026077 -0.087126 0.995853//(2) keyframe -0.003417 0.025953 0.130481 0.991105 //(2) keyframe 12 0.000460 -0.026173 0.017548 0.999503 //(2) keyframe 12 16 -0.004095 -0.025855 -0.156381 0.987350 //(2) keyframe 16 track "joint4" // (1) khớp gối trái keyframes // đánh dấu keyframe 0.000000 0.000000 0.000000 1.000000 // (2) keyframe 1 0.000000 0.000000 0.026177 0.999657 //(2) keyframe 0.000000 0.000000 0.173648 0.984808 //(2) keyframe 0.000000 0.000000 0.087156 0.996195 //(2) keyframe 11 0.000000 0.000000 0.216440 0.976296 //(2) keyframe 11 13 0.000000 0.000000 0.258819 0.965926 //(2) keyframe 13 16 0.000000 0.000000 0.000000 1.000000 //(2) keyframe 16 track "joint5" // (1) Khớp cổ chân trái keyframes // đánh dấu keyframe 0.000000 0.000000 0.069756 0.997564 //(2) keyframe 1 0.000000 0.000000 -0.043619 0.999048 //(2) keyframe 0.000000 0.000000 0.087156 0.996195 //(2) keyframe 0.000000 0.000000 0.008727 0.999962 //(2) keyframe 13 0.000000 0.000000 -0.121869 0.992546 //(2) keyframe 13 16 0.000000 0.000000 0.069756 0.997564 //(2) keyframe 16 track "joint23" // (1) Khớp đùi phải keyframes // đánh dấu keyframe -0.003417 0.025953 0.130481 0.991105 //(2) keyframe 1 0.001041 -0.026156 0.039757 0.998866 //(2) keyframe -0.004095 -0.025855 -0.156381 0.987350 //(2) keyframe 11 0.001318 0.012536 -0.104520 0.994443 //(2) keyframe 11 12 0.002098 0.026093 -0.080102 0.996443 //(2) keyframe 12 16 -0.003417 0.025953 0.130481 0.991105 //(2) keyframe 16 track "joint24" // (1) Khớp gối phải keyframes // đánh dấu keyframe 0.000000 0.000000 0.087156 0.996195 //(2) keyframe 1 0.000000 0.000000 0.216440 0.976296 //(2) keyframe 0.000000 0.000000 0.258819 0.965926 //(2) keyframe 0.000000 0.000000 0.000000 1.000000 //(2) keyframe 52 11 0.000000 0.000000 0.026177 0.999657 //(2) keyframe 11 13 0.000000 0.000000 0.173648 0.984808 //(2) keyframe 13 16 0.000000 0.000000 0.087156 0.996195 //(2) keyframe 16 track "joint25" // (1) Khớp cổ chân phải keyframes // đánh dấu keyframe 0.000000 0.000000 0.008727 0.999962 //(2) keyframe 1 0.000000 0.000000 -0.121869 0.992546 //(2) keyframe 0.000000 0.000000 0.069756 0.997564 //(2) keyframe 11 0.000000 0.000000 -0.043619 0.999048 //(2) keyframe 11 14 0.000000 0.000000 0.087156 0.996195 //(2) keyframe 14 16 0.000000 0.000000 0.008727 0.999962 //(2) keyframe 16 track 10 "joint11" // (1) Khớp lƣng - đốt sống keyframes // đánh dấu keyframe 0.026177 0.000000 0.000000 0.999657 //(2) keyframe 1 -0.026177 0.000000 0.000000 0.999657 //(2) keyframe 16 0.026177 0.000000 0.000000 0.999657 //(2) keyframe 16 track 11 "joint12" // (1) Khớp cổ keyframes // đánh dấu keyframe 0.043619 0.000000 0.000000 0.999048 //(2) keyframe 1 -0.043619 0.000000 0.000000 0.999048 //(2) keyframe 16 0.043619 0.000000 0.000000 0.999048 //(2) keyframe 16 track 14 "joint15" // Khớp bả vai phải keyframes // đánh dấu keyframe 0.121368 0.158169 -0.596540 0.777427 //(2) keyframe 1 -0.116157 -0.151379 -0.597577 0.778777 //(2) keyframe 15 0.131760 0.171713 -0.594331 0.774548 //(2) keyframe 15 16 0.121368 0.158169 -0.596540 0.777427 //(2) keyframe 16 track 10 15 "joint16" // Khớp khuỷu tay phải keyframes // đánh dấu keyframe 0.000000 0.173648 0.000000 0.984808 //(2) keyframe 1 0.000000 0.300706 0.000000 0.953717 //(2) keyframe 0.000000 0.000000 0.000000 1.000000 //(2) keyframe 14 0.000000 0.043619 0.000000 0.999048 //(2) keyframe 14 16 0.000000 0.173648 0.000000 0.984808 //(2) keyframe 16 track 11 18 "joint19" // khớp bả vai trái keyframes // đánh dấu keyframe -0.116157 -0.151379 -0.597577 0.778777 //(2) keyframe 53 0.131760 0.171713 -0.594331 0.774548 //(2) keyframe 0.121368 0.158169 -0.596540 0.777427 //(2) keyframe 16 -0.116157 -0.151379 -0.597577 0.778777 //(2) keyframe 16 track 12 19 "joint20" // Khớp khuỷu tay trái keyframes // đánh dấu keyframe 0.000000 0.000000 0.000000 1.000000 //(2) keyframe 1 0.000000 0.043619 0.000000 0.999048 //(2) keyframe 0.000000 0.173648 0.000000 0.984808 //(2) keyframe 11 11 0.000000 0.300706 0.000000 0.953717 //(2) keyframe 16 0.000000 0.000000 0.000000 1.000000 //(2) keyframe Bài toán mô trạng thái ngƣời vừa đi, vừa vẫy tay Bài toán: Ở tác giả mô tả trạng thái vẫy tay phải (1 trạng thái) Động tác vẫy tay: Tay phải giơ lên cao vuông góc với vai, khuỷu tay gập lại Khi thực động tác tay phải dịch chuyển sang phải, dịch chuyển dần sang phải Quá trình lặp lặp lại nhƣ tạo chuyển động động tác vẫy tay Mô Với trạng thái đƣợc thiết lập, tác giả xây dựng liệu cho trạng thái vẫy tay chào Ở trạng thái vẫy tay, cần tính toán tham số vị trí hƣớng quay chuỗi liên kết cánh tay phải (khớp bả vai, khớp khuỷu tay khớp cổ tay phải) Hành động liên quan tới khớp bả vai khớp khủy tay chủ yếu Do vậy, tác giả xây dựng tham số chuyển động cho khớp xƣơng sử dụng số frame animation // tạo chuyển động khớp, khớp làm việc với frame track 14 "joint15" // (1) Khớp bả vai phải keyframes // đánh dấu keyframe 0.537300 0.000000 0.000000 0.843391 //(2) keyframe 1 0.536788 -0.023437 -0.036788 0.842589 //(2) keyframe 0.537300 0.000000 0.000000 0.843391 //(2) keyframe track 15 "joint16" // (1) Khớp khuỷu tay phải keyframes // đánh dấu keyframe 0.000000 0.474053 0.000000 0.880496 //(2) keyframe 1 0.000000 0.737277 0.000000 0.675590 //(2) keyframe 0.000000 0.461749 0.000000 0.887011 //(2) keyframe Các thuộc tính: + vertexArray: mảng chứa tất đỉnh tất key-frame (các đỉnh đƣợc đặt liên tiếp mảng hết key-frame đến key-frame khác) 54 + normalArray: mảng chứa vector normal đỉnh + texCoordArray: mảng chứa texture Coordinate đỉnh + num_frame: số lƣợng key-frame + num_xyz: số lƣợng đỉnh key-frame Các phƣơng thức: + loadModel(): load model từ file lấy thông tin model + interpolate(): phƣơng thức tính toán nội suy frame, dựa vào thời gian chạy số lƣợng key-frame cuả loại animation mà định chuyển đến key-frame hay tính nội suy frame Một số lớp chƣơng trình Skeleton and joints (Hệ thống xƣơng khớp) Để tạo đƣợc chuyển động cho nhân vật cần phải thiết lập khung xƣơng Hệ thống xƣơng liên kết có thứ bậc Hệ thống đƣợc cấu thành từ nhiều nút liên kết thƣờng nút gốc Đối với hệ xƣơng thể ngƣời, nút gốc thƣờng đƣợc đặt nút khớp hông Hệ thống thứ bậc cho phép nhóm phân vùng thành phần khác nhân vật public Skeleton createInstance() { Skeleton skeleton = new Skeleton(); ArrayList joints = new ArrayList(jointData.Count); foreach(JointData jData in jointData) { Joint joint = new Joint(jData); joint.setSkeleton(skeleton); joints.Add(joint); } skeleton.setJoints(joints); skeleton.setSkeletonData(this); return skeleton; } Animation Classes Lớp Animation chứa hay nhiều hoạt hình tùy thuộc vào hình ảnh động Đối với hình ảnh động kiểm tra khung Nếu khung keyframe, vòng xoay đƣợc thiết lập trực tiếp cách nhìn lên vòng xoay keyframe Nếu khung khung hình, tính toán khung hình từ keyframe trƣớc để thiết lập Lớp tạo chuyển động chuỗi khung xƣơng dựa kỹ thuật chuyển động theo thời điểm (keyframe) Trong code mô phỏng, tác giả chọn 16 frame để tạo chuyển động public bool isKeyFrame(int trackIndex, uint frame) { AnimationTrack track = (AnimationTrack)tracks[trackIndex]; 55 for(int i=0; i< track.keyFrames.Count && frame >= ((KeyFrame)track.keyFrames[i]).frame; i++) { if(frame == ((KeyFrame)track.keyFrames[i]).frame) { return true;}} return false;} public KeyFrame getKeyFrame(int trackIndex, uint frame) { AnimationTrack track = (AnimationTrack)tracks[trackIndex]; KeyFrame key = new KeyFrame(); for(int i=0; i< track.keyFrames.Count; i++) { if(frame == ((KeyFrame)track.keyFrames[i]).frame) { key = (KeyFrame)track.keyFrames[i]; break;}} return key;} public KeyFrame getNextKeyFrame(int trackIndex, uint frame) { AnimationTrack track = (AnimationTrack)tracks[trackIndex]; KeyFrame key = (KeyFrame)track.keyFrames[0]; for(int i=0; i< track.keyFrames.Count; i++) { if(frame < ((KeyFrame)track.keyFrames[i]).frame) { key = (KeyFrame)track.keyFrames[i]; break;}} return key;} public KeyFrame getPrevKeyFrame(int trackIndex, uint frame) { AnimationTrack track = (AnimationTrack)tracks[trackIndex]; KeyFrame key = (KeyFrame)track.keyFrames[track.keyFrames.Count-1]; for(int i=0; i< track.keyFrames.Count; i++) { if(frame < ((KeyFrame)track.keyFrames[i]).frame) { if(i != 0) { key = (KeyFrame)track.keyFrames[i-1]; }break;} } return key; SkeletalAnimation Project chứa tất mã chuyển động xƣơng nhƣ xƣơng lớp lƣới Nó chứa lớp cho tải mô hình hình động Có nghĩa là, tạo liên kết để chuyển động khung xƣơng dẫn tới chuyển động mô hình Tạo thể liệu lƣới để tạo chuyển động: public Mesh createInstance() { Mesh mesh = new Mesh(); mesh.setMeshData(this); mesh.setSkeleton(skeletonData.createInstance()); mesh.setVertices(new double[vertices.Length]); mesh.setNormals(new double[normals.Length]); mesh.createVertexArrays(vertexIndices.Length); mesh.fillInUVArray(); return mesh; Quaternion Class: Quaternion phần mở rộng số phức Số phức đƣợc định nghĩa bậc hai -1 Một số phức đƣợc biểu diễn nhƣ 56 số thực bội số: a + bi Dƣới a số thực b bội số Quaternions mở rộng thêm cách sử dụng ba bậc hai -1, i, k l i*i = -1 j*j = -1 k*k = -1 Phép nhân số phức khác nhau: i*j=-j*i=k j*k=-k*j=i k*i=-i*k=j Khi sử dụng quaternion để thể cho phép quay, tác giả sử dụng tập hợp quaternion với |q| = x^2 + y^2 + z^2 + w^2 = 1^2 Thực phép nhân bổ sung quaternion đƣợc định nghĩa giống nhƣ việc nhân với số phức q1 * q2 = (w1 + x1*i + y1*j + z1*k) * (w2 + x2*i + y2*j + z2*k) = (w1*w2 - x1*x2 y1*y2 - z1+z2) + (y1*z2 - z1*y2 + w1*x2 + x1*w2)i + (z1*x2 - x1*z2 + w1*y2 + y1*w2)j + (x1*y2 - y1*x2 + w1*z2 + z1*w2)k Phép nhân đƣợc sử dụng để nối phép quay Việc thực phép nhân quaternion lớp đƣợc nhìn thấy dƣới public static Quaternion operator *(Quaternion left, Quaternion right) { Quaternion ret = new Quaternion(); ret[0] = left[1]*right[2] left[0]*right[3]; ret[1] = left[2]*right[0] left[1]*right[3]; ret[2] = left[0]*right[1] left[2]*right[3]; ret[3] = left[3]*right[3] left[2]*right[2]; return ret; - left[2]*right[1] + left[3]*right[0] + - left[0]*right[2] + left[3]*right[1] + - left[1]*right[0] + left[3]*right[2] + - left[0]*right[0] - left[1]*right[1] - } Bây nhìn vào hoạt động khác theo quy định cho lớp quaternion Phƣơng pháp dotProduct giống nhƣ dotProduct lớp vector kết 57 nhƣ nhau, cos a * | q | Vì tất quaternion đơn vị Quaternions kết phƣơng pháp cos a getConjugate getInverse chất giống nhau, nhƣng điều yêu cầu cần phải giải thích Một conjugate đƣợc định nghĩa là: q* = [-x -y -z w] Một Inverse đƣợc định nghĩa là: 1/q = q*/|q|, nhƣng làm việc với đơn vị quaternions định nghĩa trở nên giống LoadIdentity tải định nghĩa phép nhân quaternions q = [0 0 1] Các phƣơng pháp bình thƣờng hóa chắn làm cho |q| thực tế Nếu không chia quaternion cho |q| Làm để áp dụng xoay tọa độ cho khớp? Một quaternion thiết lập tham số [x,y,z,w] Cụ thể phép quay đƣợc tính theo cách sau: // Góc quay tính radian x = RotationAxis.x * sin(RotationAngle) y = RotationAxis.y * sin(RotationAngle) z = RotationAxis.z * sin(RotationAngle) w = cos(RotationAngle) Sau xác định đƣợc keyframe sử dụng ma trận chuyển động quay nhƣ trình bày mục 2.1.1 thực xoay phải thiết lập giới hạn cho khớp Có nghĩa dựa vào khả xoay khớp để xoay dịch chuyển (m ục 2.2.2 trang 44) Tạo ma trận từ quaternion để tiến hành xoay cho khớp xƣơng thể dựa ma trận quay [38][39] [40] public Matrix toMatrix() { Matrix ret = new Matrix(); // Row ret[0] = - 2*(this.values[1]*this.values[1] + this.values[2]*this.values[2]); ret[4] = 2*(this.values[0]*this.values[1] - this.values[3]*this.values[2]); ret[8] = 2*(this.values[3]*this.values[1] + this.values[0]*this.values[2]); ret[12] = 0; // Row ret[1] = 2*(this.values[0]*this.values[1] + this.values[3]*this.values[2]); ret[5] = - 2*(this.values[0]*this.values[0] + this.values[2]*this.values[2]); ret[9] = 2*(this.values[1]*this.values[2] - this.values[3]*this.values[0]); 58 ret[13] = 0; // Row ret[2] = 2*(this.values[0]*this.values[2] - this.values[3]*this.values[1]); ret[6] = 2*(this.values[1]*this.values[2] + this.values[3]*this.values[0]); ret[10] = - 2*(this.values[0]*this.values[0] + this.values[1]*this.values[1]); ret[14] = 0; // Row ret[3] = 0; ret[7] = 0; ret[11] = 0; ret[15] = 1; return ret; } Làm để tính nội suy hai quaternion? Bây giờ, tìm hiểu phƣơng pháp nội suy LERP LERP kiểu viết tắt nội suy tuyến tính Phƣơng pháp không đƣợc tính toán nội suy hai quaternion mà sử dụng hàm tuyến tính t LERP đƣợc định nghĩa là: (q1, q2, t) = 1-t * q1 + t * q2 LERP không bảo tồn đƣợc độ lớn phải bình thƣờng hóa kết trƣớc trả public static Quaternion lerp(Quaternion from, Quaternion to, double time) { Quaternion ret = from*(1-time) + to*time; ret.normalize(); return ret; } Trong đồ họa máy tính, Slerp viết tắt cho phép nội suy tuyến tính hình cầu, đƣợc giới thiệu Ken Shoemake bối cảnh nội suy quaternion với mục đích tạo hiệu ứng động xoay 3D Nó đề cập đến chuyển động liên tục tốc độ đơn vị bán kính vòng tròn lớn vòng cung, kết thúc số nội suy SLERP đƣợc biểu diễn nhƣ slerpNoInvert phƣơng thức lớp Quaternion SLERP kiểu viết tắt cho bán nội suy hình cầu Một đơn vị quaternion xác định điểm hypersphere bốn chiều SLERP tạo hình ảnh 59 động mƣợt mà LERP cách làm theo kết nối vòng cung lớn hai điểm lĩnh vực SLERP đƣợc định nghĩa là: SLERP (q1, q2, t) = [q1 * sin (a (1t)) + q2 * sin (a (t))] / sin (a) với a góc hai quaternion Nếu góc hai quaternion trở nên đủ nhỏ, việc thực chuyển sang LERP public static Quaternion slerpNoInvert(Quaternion from, Quaternion to, double time) { double cosAngle = from.dotProduct(to); if(cosAngle < 0.95 && cosAngle > -0.95) { double angle = Math.Acos(cosAngle); double sinInvert = / Math.Sin(angle); double fromScale = Math.Sin(angle * (1 - time)) * sinInvert; double toScale = Math.Sin(angle * time) * sinInvert; return from*fromScale + to*toScale; } else { return lerp(from, to, time); } } Một số hình ảnh minh họa cho trình thực nghiệm Dƣới giao diện chƣơng trình thử nghiệm tạo chuyển động ngƣời thực ảo dựa vào mô hình có xƣơng thông qua sử dụng ngôn ngữ lập trình C++ OpenGL sở kiến thức đƣợc hệ thống hóa đƣợc 60 Hình 3.1 Mô hình skin mặt Front Hình 3.2 Mô hình Wireframe Hình 3.3 Mô hình Skeleton 61 Hình 3.4 Mô hình skin góc nhìn right Hình 3.5 Mô hình skin vừa vừa chào góc nhìn right 62 PHẦN KẾT LUẬN Cùng nghiên cứu vấn đề công nghệ thực ảo, Việt Nam có số công trình nghiên cứu góp phần giúp bạn trẻ Việt Nam có nhìn tổng quát công nghệ thực ảo giới, khả ứng dụng phần mềm để thiết kế giới ảo xây dựng hệ thống thực ảo Việt Nam Một vấn đề tƣơng đối phức tạp việc mô tạo chuyển động, tƣơng tác đối tƣợng với môi trƣờng xung quanh.Việc nghiên cứu kỹ thuật tạo chuyển động cho đối tƣợng 3D để điều khiển tƣ động tác cho ngƣờilà hƣớng phát triển tính thời sự, ý nghĩa khoa học mà mang đậm tính thực tiễn ứng dụng đời sống xã hội Với mục tiêu nội dung đặt ra, luận văn đạt đƣợc kết có hƣớng phát triển sau: Kết đạt đƣợc: Sau thời gian thực đề tài với nỗ lực, cố gắng thân thu đƣợc số kết nhƣ sau: - Trình bày khái quát thực ảo tạo chuyển động thực ảo - Hệ thống hóa số kỹ thuật tạo chuyển động cho ngƣời thực ảo - Xây dựng chƣơng trình thử nghiệm tạo chuyển động cho nhân vật dựa mô hình có xƣơng thông qua việc sử dụng ngôn ngữ lập trình C++ OpenGL sở kiến thức hệ thống hóa đƣợc Hƣớng phát triển đề tài: Trong tƣơng lai, tác giả mong muốn hoàn thiện đƣợc vấn đề sau: - Trình bày chi tiết vào việc tìm hiểu đƣợc mối ràng buộc thuộc tính, đối tƣợng chuyển động, ràng buộc chuyển động với bề mặt đối tƣợng Do vậy, chuyển động mô hình trở lên chân thực sống động, linh hoạt uyển chuyển, để thể đƣợc hành vi, trạng thái đối tƣợng giới thực Từ đó, cài đặt thêm dạng chuyển động khác ngƣời nhƣ: chạy, nhảy,… - Phải nâng cao kỹ phân tích kỹ thuật tạo chuyển động, đảm bảo tính thẩm mỹ Tiến tới, đƣa mô hình ứng dụng vào toán nhận dạng đối tƣợng 63 TÀI LIỆU THAM KHẢO Tiếng Việt [1] Quang Huy, Tín Dũng, (2004), Đồ họa máy tính 3DSMax vẽ phối cảnh ảnh chiều, NXB Thống Kê, Tr 37-96 [2] Lê Tấn Hùng, Huỳnh Quyết Thắng (2004), Đồ họa máy tính, NXB Khoa học kỹ thuật, Tr 40-50 [3] Nguyễn Công Minh, (2009), 3DS Max 2009, NXB Hồng Đức, Tr 45-85 [4] Lƣu Triều Nguyên, (2002), Thiết kế chiều với 3DsMax 4, NXB Lao Động Xã Hội, Tr 445-494, Tr 589-595 [5] Lƣu Triều Nguyên, (2006), Các thủ thuật 3DSMax, NXB Lao Động - Xã Hội, Tr 131-145 [6] Nguyễn Huy Sơn (2006), “Virtual Reality Technologie - Công nghệ Thực ảo ”, http://tusach.thuvienkhoahoc.com [7] Lê Huy Vần (2005), Nghiên cứu phát va chạm ứng dụng, Khoá luận văn tốt nghiệp, ĐH Công nghệ -ĐHQG Hà Nội, Tr 41-50 [8] Đề tài “Ứng dụng công nghệ thực ảo Virtual Reality-VR bảo tàng di sản”, Đề tài trọng điểm cấp Viện KH CN Việt Nam 2004-2006 Tiếng Anh [9] Roman Filkorn, Marek Kocan Slovak, Simulation of human body kinematic, Department of Computer Science and Engineering, University of Technology Bratislava/ Slovak Republic [10] Keyframe Animation; http://www.cadtutor.net/dd/bryce/anim/anim.html [11] Henry David (2005), “MD5Mesh and MD5Anim files formats”, http://tfc.duke.free.fr/coding/md5-specs-en.html [12] Learning Mayay - Character Rigging And Animation http://www.learningmaya.com/24-0-character-setup-tutorials.html [13] Andy Beane, 2012, “3D Animation Essentials”,John Wiley &Son, Inc,Canada [14] Steve Roberts, 2011,“Character Animation Fundatmentals”, Focal Press, USA [15] Dariush Derak, 2011, “Introducing Autodesk Maya 2012”, Sybex [16] John Edgar Parrk, 2005, “Understanding 3D Animation using Maya”, Springer [17] Animation - Keyframe, IK http://www.autodesk.com/techpubs/aliasstudio/2010/index.html?url=AnimationIKA ddIKhandle.htm,topicNumber=d0e213743 [18] The Art of Maya character Animation; http://www.highend3d.com 64 [19] Learning Mayay - Character Rigging And Animation http://www.learning-maya.com/24-0-character-setup-tutorials.html [20] Forward kinematics https://en.wikipedia.org/wiki/Forward_kinematics [21] Inverse kinematics https://en.wikipedia.org/wiki/ Inverse _kinematics [22] Simple Inverse Kinematics example with source code using Jacobian [23] J M McCarthy, 1990, Introduction to Theoretical Kinematics, MIT Press, Cambridge, MA [24] Mark J Kilgard, 1996, OpenGL Programming for the X Windows System, Addison-Wesley [25] Steve Roberts, 2011,“Character Animation Fundatmentals”, Focal Press, USA [26] Andy Beane, 2012, “3D Animation Essentials”, John Wiley &Son, Inc, Canada [27] Chris Webster, 2012,“Action Anaalysis for Animator”, Focal Press, USA [28] John Edgar Parrk, 2005, “Understanding 3D Animation using Maya”, Springer [29] Dariush Derak, 2011, “Introducing Autodesk Maya 2012”, Sybex [30] Serdar Kucuk, Zafer Bingul (2006), Robot Kinematics: Forward and Inverse Kinematics, Sam Cubero [31] Gggg Kenwright, 2013, Game Inverse Kinematics: A Practical Introduction, CreateSpace Independent Publishing Platform [32] SELRP: https://en.wikipedia.org/wiki/Slerp [33] Inverse Kinematics http://softimage.wiki.softimage.com/xsidocs/ik_AnimatingwithInverseKinema tics.htm [34] Inverse Kinematics - Forward kinematics http://blog.digitaltutors.com/understanding-inverse-and-forward-kinematics/ [35] Erik B Dam Martin Koch Martin Lillholm (1998), Quaternions - Interpolation and Animation, University of Copenhagen [36] Quaternions and spatial rotation https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation 65 [37] Using Quaternion to Perform 3D rotations http://www.cprogramming.com/tutorial/3d/quaternions.html [38] Maths - Conversion Quaternion to Matrix http://www.euclideanspace.com/maths/geometry/rotations/conversions/quatern ionToMatrix/ [39] Tutorial 17: Rotations http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/ [40] J B Kuipers (1999) Quaternions and rotation Sequences: a Primer with Applications to Orbits, Aerospace, and Virtual Reality, Princeton University 66 ... THỰC TẠI ẢO VÀ CHUYỂN ĐỘNG TRONG THỰC TẠI ẢO 1.1 Tổng quan Thực ảo 1.1.1 Khái niệm thực ảo .3 1.1.2 Lịch sử phát triển thực ảo .4 1.1.3 Hệ thống thực ảo. .. tạo chuyển động mà công cụ đƣa Xuất phát từ thành thực ảo đem lại nên định lựa chọn đề tài: Nghiên cứu mô động tác chuyển động ngƣời thực ảo việc làm ý nghĩa khoa học mang đậm tính thực tiễn thực. .. loại chuyển động Thực tế ngƣời ta phân chuyển động làm loại: chuyển động đối tƣợng có xƣơng chuyển động đối tƣợng xƣơng Trong phạm vi đề tài, tác giả tập trung nghiên cứu kĩ thuật tạo chuyển động