Mô phỏng chất liệu trong thực tại ảo và xây dựng ứng dụng với chất liệu lông, tóc

Nội dung đồ án gồm: Chương 1:THỰC TẠI ẢO VÀ CHẤT LIỆU TRONG THỰC TẠI ẢO 1.1. Thực tại ảo và ứng dụng 1.2. Mô phỏng chất liệu trong thực tại ảo 1.3. Chức năng Chương 2: MÔ PHỎNG CHẤT LIỆU LÔNG, TÓC TRONG THỰC TẠI ẢO 2. 1. Mô phỏng tóc ở mức độ chi tiết 2.2. Nhóm và chia nhỏ nhóm 2.3. Phát hiện va chạm. 2.4. Việc thúc đẩy cho hệ thống khung kép 2.5. Thiết lập bộ khung kép . Chương 3: XÂY DỰNG CHƯƠNG TRÌNH ỨNG DỤNG 3.1. Giới thiệu một số mô hình tóc 3.2. Xây dựng chương trình ứng dụng

pdf69 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2481 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Mô phỏng chất liệu trong thực tại ảo và xây dựng ứng dụng với chất liệu lông, tóc, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ái mô phỏng hiện thời.Việc chia nhỏ được thực hiện như là một luồng xử lý, và thông tin được lưu lại, được sử dụng trong thời gian thực hiện quá trình mô phỏng. Trong khi thực hiện chia nhỏ một nhóm tóc, nhiều bộ khung được thêm vào hệ thống, tạo ra một cách mô phỏng ở mức độ chi tiết hơn. Sự phân cấp nhóm sợi của chúng ta được xây dựng theo kiểu từ trên xuống, tạo ra những nhóm nhỏ hơn, cho đến khi nào không thể chia nhỏ được nữa. Chúng ta thực hiện đồng thời những phân cấp nhóm sợi với những phân cấp bó và mảnh để đạt đến độ riêng biệt và liên tục của việc mô phỏng ở mức độ chi tiết. Sự phân cấp của kiểu trình bày tóc được minh họa trong hình 4, mảnh tóc gốc trong sự phân cấp mảnh là một kiểu trình bày thô nhất, cơ bản nhất cho một tập hợp tóc. Để đạt được độ chi tiết hơn, chúng ta phân theo chiều ngang và dần xuống, cho đến khi không thể chia nhỏ tiếp được nữa.Sau đó đưa những biến đổi mảnh ở mức độ chi tiết, tinh tế nhất vào trong mô phỏng cơ bản nhất của các bó, hoặc bó gốc trong việc mô phỏng phân cấp bó. Tương tự cho những bó, chúng ta cũng phân tích theo chiều ngang và đi dần xuống cho đến khi không thể chia nhỏ ra được nữa. Tại điểm này, việc mô phỏng các bó được thay thế bởi những đỉnh của những nhóm sợi trong việc phân cấp nhóm sợi. Để đạt tới độ mô phỏng chi - 34 - tiêt, chúng ta duyệt qua tất cả các nút ở cây nhóm sợi cho đến khi nào duyệt qua các sợi tóc riêng biệt. Những mục tiếp theo giải thích những quá trình xây dựng và phân cấp chia nhỏ của chúng ta bắt đầu với sự hình thành của sự phân cấp bó và mảnh tóc. Hình 2.2.1: Phân cấp tóc. Phân cấp tóc bao gồm: phân cấp mảnh đơn, nhiều phân cấp bó, phân cấp những nhóm sợi. Kiểu mô phỏng tóc thô nhất được thể hiện trong phân cấp mảnh, ở vị trí đỉnh đầu tiên trong toàn bộ công việc phân cấp tóc. 2.2.2. Chia nhỏ mảnh và bó Trước khi chúng ta có thể xây dựng việc phân cấp của những mảnh tóc hoặc những bó tóc, chúng ta phải tạo ra mảnh ở đỉnh đầu. Một mảnh ở mức đỉnh đầu tiên được tạo ra bằng việc chọn một vị trí trên đỉnh đầu cho gốc của bộ khung( điểm đầu tiên của bộ khung tóc ). Tiếp theo, một bề rộng do người dùng định ra để điều chỉnh độ dày và độ rộng của mảnh. Thông tin đặc biệt về kiểu tóc được khai báo, như xác định độ dài của tóc, số các điểm điều khiển của khung, độ quăn của tóc hay độ lượn sóng của tóc xuống chiều dài của khung. Do mảnh là một bề mặt hai chiều, chúng ta hạn chế việc chia nhỏ của nó sao cho có thể chỉ chia ra làm hai phần bằng nhau. Chia nhỏ mảnh đơn giản là trường hợp nhóm lại hoặc phân chia những nhóm sợi, việc sử dụng cây sinh tư, hoặc cây nhị phân, thay kết cấu dữ liệu của cây sinh 4 mà nó được sử dụng cho các bó hay các nhóm tóc. Quá trình chia nhỏ kết thúc khi mà chiều rộng hiện thời của bó bên dưới đạt đến một ngưỡng do người dùng định ra. Đối với quá trình chia nhỏ bó, chúng ta tạo ra một vòng tròn chéo qua khu vực mà ta định nghĩa bó. Mặt cắt ngang vòng tròn này chia ra thành 4 phần bằng nhau. Bốn mức dưới bó có cùng giá trị bán kính đó nhưng bốn góc lại đại diện cho 4 phần khác nhau của bó ban đầu. Việc - 35 - chia nhỏ của một bó luôn có kết quả là 4 bó con, vì vậy thông tin của nó được lưu trong cây sinh tư. Việc phân cấp những bó dừng lại khi bán kính của các đường tròn là một ngưỡng nào đó do người dùng định ra. Tại thời điểm này, mức độ chi tiết hơn đã được tạo ra trong việc phân cấp nhóm sợi. Hình 2.2.2: Quá trình chia nhỏ nhóm sợi. Một nhóm sợi được chia nhỏ thành các nhóm sợi khác. (a) Khu vực chéo nhau của một nhóm sợi đơn; (b) Nhóm sợi được chia thành 4 góc phần tư bằng nhau; (c) Mặt cắt ngang vòng tròn mỗi góc phần tư, là phần nhỏ của nhóm sợi gốc; (d) Bốn nhóm sợi mới được tạo ra mà chúng là những nhóm con của nhóm ban đầu; (e) Quá trình chia nhỏ được lặp lại đỗi với mỗi nhóm con. 2.2.3. Chia nhỏ những nhóm sợi Một nhóm sợi được định nghĩa bởi một bộ khung đơn giản, một bán kính để định nghĩa mặt cắt ngang vòng tròn của nhóm, những sợi tóc để biến đổi theo những mục đích khác nhau. Một mặt cắt ngang nhóm sợi được minh hoạ trong. Những sợi tóc riêng lẻ ngẫu nhiên được đặt vào các nhóm và đi theo những lực của bộ khung. Những hình dạng vòng tròn của nhóm sợi được sử dụng cho tính đơn giản của nó trong phát hiện va chạm. Chúng ta sử dụng một cấu trúc dữ liệu của cây sinh tư để chứa đựng thông tin phân cấp, bởi vậy mà từng nhóm sợi chia ra vào trong 4 mục bằng nhau. Việc chia nhỏ của một nhóm sợi vào trong 4 mục tạo ra mặt cắt ngang của vòng tròn phù hợp cho mỗi nhóm. Mỗi lần chia tách nhóm sợi, chúng ta tính toán số sợi trong mỗi góc phần tư. Nếu một góc phần tư nào đó không có những sợi bên trong ranh giới của nó, thì những cung phần tư nhỏ đó là tập hợp rỗng. Một nhóm sợi bao gồm từ 0 đến 4 nhóm con. Một nhóm sợi mà chứa duy nhất một sợi tóc thì nhóm con đó trở thành một lá của cây. Mỗi - 36 - nút trong việc phân cấp chứa đựng một nhóm sợi, mà bao gồm những bộ khung hình học tóc sử dụng cho giai đoạn biến đổi cuối cùng. Trong việc phát sinh thêm mỗi nhóm sợi, cũng như mỗi bó tóc và mảnh tóc, sử dụng n-1 những thể tích khối hộp giáp ranh cho việc phát hiện va chạm, khi mà n là số nút của khung. Một bộ khung chứa đựng cùng một số điểm điều khiển như nhóm tóc cha của nó, mà nó giúp cho chuyển động giữa các mức khác nhau . Hình 2.2.3: Việc phân cấp nhóm sợi, quá trình chia nhỏ tạo ra một cây sinh tư chứa đựng thông tin nhóm sợi, phân cấp nhóm sợi có thể mở rộng tới những sợi riêng biệt. 2.2.4. Hợp nhất ngầm định cho mô phỏng động Sau khi hệ thống tính toán những phản ứng cần phải trả lại đối với va chạm cho mô phỏng động, chúng ta đi theo những kiểu chuyển động cơ bản cho việc mô phỏng tóc. Chúng ta mở rộng những phương pháp này bởi vì việc sử dụng một kỹ thuật hợp nhất, để đạt được kết quả tốt hơn trong suốt thời gian mô phỏng hoạt động của tóc. Cách tiếp cận này tương tự như việc mô phỏng vải. Mỗi điểm điều khiển của khung tóc được điều khiển bởi tập hợp những phương trình vi phân: - 37 - Trong đó Ii là mô men quán tính cho điểm điều khiển thứ i của khung, i là hệ số tắt dần, ,  là những thành phần lực xoắn tương ứng. M và M, được tính toán từ lực đàn hồi điều khiển của tóc và những lực ngoài như là lực của gió. Kết quả M và M trở thành: Những lực xoắn do những lực đàn hồi được tính toán như: Khi K và K là những hằng số đàn hồi tương ứng. Hơn nữa, 0 và 0 là những giá trị hiện thời của góc , . Mặc dù những thuật toán rõ ràng như Euler hoặc fourth – order Runge – Kutter có thể sử dụng cho việc hợp nhất này, chúng ta lựa chọn việc hợp nhất ẩn cho sự chính xác hơn của quá trình mô phỏng. Chúng ta đang làm việc trong toạ độ cực, sẽ sử dụng những vị trí góc ,  , và những vận tốc góc w0, w0. Việc thay đổi vận tốc góc cho thành phần  của một nút trong khung làm xuất hiện: Gọi h là bước thời gian, w0 = w( t0 ) là vận tốc góc vào thời gian t0. Ở đây: = w  (t0 + h) - w ( t0 ). Mỗi lần chúng ta tính toán w chúng ta sẽ tính toán được - 38 - việc thay đổi trong vị trí góc  từ  =h(w0 +w ). Cũng quá trình đó có thể ứng dụng tới thành phần  của những vị trí góc và vận tốc góc cho mỗi điểm điều khiển của bộ khung. Việc hợp nhất ẩn cho phép chúng ta sử dụng cách đàn hồi cứng, ví dụ: khi miêu tả râu cứng hay tóc cứng và đưa ra những sự đàn hồi không thay đổi như trên tóc của một người đàn ông. Việc sử dụng những tính co giãn cứng, yêu cầu phải có nhiều bước thời gian nhỏ hơn để đảm bảo một quá trình mô phỏng ổn định. Hình 2.2.4: Những hiệu ứng của quá trình phát hiện va chạm giữa tóc với tóc. (a) hoạt động của tóc có va chạm. (b) hoạt động của tóc không có va chạm. 2.2.5. Khả năng chia nhỏ của tóc Sử dụng những luồng tính toán phân cấp , chúng ta chia cắt một nhóm tóc vào trong nhiều nhóm bởi việc phân cấp được thực hiện ở các mức khác nhau. Mỗi nhóm tóc của bộ khung có cùng số điểm điều khiển như là những nút cha của nó trong khung. Hơn nữa tất cả các thuộc tính được áp dụng từ nút cha đến nút con. Khi một sự chuyển tiếp của một nhóm tóc con xuất hiện, những bộ khung con kế thừa trạng thái động của bộ khung cha mẹ nó. Mỗi điểm điều khiển trong bộ khung con tương ứng với một điểm điều khiển trong một bộ khung của cha mẹ nó. Khi những nhóm con được sinh ra từ nhóm cha nó, thì mỗi địa chỉ tương ứng của nó với cha nó được lưu lại, khi di chuyển những nhóm con thì những địa chỉ này được dùng để định vị nhóm con đó. Ta thấy hai bộ khung động được chia nhỏ ra vào trong nhiều bộ khung nhỏ khi mà gió thổi qua tóc. - 39 - 2.2.6. Khả năng hòa trộn Hòa trộn nhiều bộ khung con vào bộ khung cha là một sự lặp lại dễ hiểu. Phương pháp của chúng ta là tính trung bình những trạng thái động của khung con, bao gồm những giá trị và vận tốc, sau đó gán những trạng thái này cho bộ khung cha. Để làm giảm bớt những hiện tượng thiếu trực quan xuất hiện bởi việc hoà trộn những nhóm con vào những nhóm cha, một sự chuyển tiếp chỉ có thể xuất hiện nếu tất cả các nhóm con sẵn sàng chuyển tiếp đằng sau vào trong nhóm cha. Hơn nữa để tránh một sự chuyển tiếp đột ngột trong vị trí của tóc, chúng ta áp đặt một vị trí ràng buộc trên nhóm con. Sau khi tính trung bình những điểm điều khiển của bộ khung con, chúng ta xác định khoảng cách giữa những điểm điều khiển của khung con tương ứng với những điểm điều khiển của cha mẹ. Nếu khoảng cách này lớn hơn một ngưỡng nhất định thì sự chuyển tiếp sẽ không xuất hiện. Nếu khoảng cách nhỏ hơn một ngưỡng nhất định nhưng vị trí không cần chính xác, thì một lực đàn hồi sẽ kéo nhóm con sao cho nó chuyển tiếp được mịn màng hơn. Hình 2.2.6: hình ảnh chia nhỏ của khung tóc. Những hình ảnh biến đổi của tóc được chia nhỏ và không được chia nhỏ. - 40 - Tương tác tóc Giải thuật của chúng ta dựa vào vùng lân cận của không gian quét, tự động phát hiện va chạm giữa tóc và Đầu, hoặc gần những đối tượng khác. Quá trình tương tác được tính toán dựa vào đầu ra của việc phát hiện va chạm. Khi cùng một mô hình khung được sử dụng cho mỗi cách mô phỏng, mỗi khi một va chạm nào đó được phát hiện, chúng ta tính toán tác động lại cũng dựa trên phương pháp đó. Khi va chạm giữa tóc và Đầu được phát hiện, đầu tiên chúng ta xác định phương hướng mà nó sẽ tác động lại. Vùng lân cận trên Đầu mà ta phát hiện va chạm là những tam giác tác động với những phần của tóc. Sau đó, chúng ta tính toán phương hướng trung bình của nó, Navg, của những hình tam giác này, bởi vì việc cộng trung bình liên quan đến mỗi hình tam giác, bởi toàn bộ n điểm cắt ngang của các tam giác. Chúng ta sử dụng hướng trung bình này (Navg ) dọc theo hướng mà chúng ta áp dụng. Navg được định nghĩa như sau: Navg = p Ni với i = 1, ……, n Ni là mặc định của mặt cắt ngang tam giác thứ i, ở trên Đầu, mà nó tác động đến một vùng của tóc. Điều quan trọng của việc tác động trở lại, đặt cơ sở ban đầu cho tốc độ của vùng tóc và của đầu. Mỗi vùng tóc được tạo ra từ một vùng nhất định trong bộ khung đó. Vùng nhất định này có hai điểm điều khiển, một là tại đỉnh của nó, và một điểm ở đáy. Không gian hoạt động thứ i của của một nhóm tóc có những điểm điều khiển Pi ở tại đỉnh và Pi+1 ở đáy. Vận tốc của vùng tóc được tính toán ở tại đỉnh của mỗi vùng, Vt , và đáy của mỗi vùng, Vb, bằng việc tính toán sự thay đổi vị trí của các điểm điều khiển trong những khoảng thời gian ngắn. Trong đó i là vùng tóc,  là thời gian hiện hành, t là khoảng thời gian ngắn. Những tốc độ tính toán là những tốc độ được sử dụng để tính toán những tác - 41 - động trở lại. Từ mỗi điểm điều khiển khung được kết nối với hai vùng lân cận, mỗi vùng là một không gian quét của tóc, trừ đi điểm điều khiển đầu và điểm điều khiển cuối của mỗi khung, chúng ta phải tính các lực tác động giữa mỗi điểm điều khiển. Sự tác động trở lại được tính toán như sau: Để áp dụng trên những điểm điều khiển, Pi và Pi+1. Một lực ma sát cũng được tạo ra, được áp dụng cho một điểm điều khiển trên khung, khi mà một vùng của tóc va đụng vào Đầu. Vector trung bình Navg được tính toán cho sự tác động lại va chạm, theo mặt phẳng tiếp tuyến với Đầu tại điểm xuất hiện va chạm. Những lực được áp dụng tới một điểm điều khiển của khung, kể cả những lực ở bên trong, trọng lực, và những lực bên ngoài như là gió. Kết quả là một vector lực được chiếu lên một đường thẳng, để tạo ra những lực thành phần hoạt động dựa trên những điểm được điều khiển, để nó hoạt động theo phương tiếp tuyến. Một lực ma sát xuất hiện và chống lại hoạt động của tóc dọc theo Đầu, hướng ngược lại của các lực thành phần là hướng của lực ma sát. Phần lớn các lực thành phần làm tăng thêm hệ số ma sát, và ứng dụng cho các điểm điều khiển của khung. 2.3.1. Tương tác giữa tóc với tóc Vì tóc tiếp xúc không thay đổi trong vùng không gian xung quanh tóc, tương tác giữa tóc quan trọng trong thực tại ảo. Đầu người tiêu biểu có hàng ngàn kiểu tóc. Vì vậy việc kiểm tra (n-1) vùng của mỗi nhóm tóc dựa vào những thành phần chính của mỗi nhóm tóc, làm cho việc mô phỏng tóc mất nhiều thời gian, công sức. Thay vào đó chúng ta phân tích không gian xung quanh tóc, trong những lưới ba chiều, và chèn mỗi mỗi vùng không gian lân cận của tóc vào hệ thống lưới đó. Chỉ vùng lân cận rơi vào trong vùng lưới đó được kiểm tra sự tác động lẫn nhau. Trung bình chiều dài của những đoạn cứng tóc của những bộ khung được sử dụng như chiều cao, chiều rộng, chiều sâu của mỗi ô lưới đó. Cho mỗi cặp của không gian lân cận rơi vào trong cùng ô lưới đó, chúng ta xác định - 42 - khoảng cách giữa điểm trung tâm của lõi bộ khung là s1 và s2 . Khoảng cách này gọi là d, nó được trừ đi tổng của hình cầu r1, r2, để xác định điểm giao nhau. Như: Overlap = d - (r1 + r2 ) Nếu sự chồng chéo là rõ ràng thì vùng của tóc không được gối lên nhau sẽ không được tính toán tương tác trả lại. Nếu có một sự giao nhau, chúng ta tính toán không gian chồng chéo nhau của những lõi của khung, s1,s2, để xác định hướng tác động lẫn nhau của mỗi khung. Nếu s1,s2, gần như song song nhau, thì chúng ta đặt vận tốc trung bình của nó tương ứng với vận tốc ban đầu. Chỗ giao nhau giữa các vùng tóc mà không phải là định hướng giống nhau được về một phía, dựa vào số lượng của chúng chồng chéo lên nhau. Phương hướng để di chuyển mỗi vùng tóc được xác định bởi việc tính toán bằng một vector từ điểm gần nhất từ s1 đến điểm gần nhất của s2. Mỗi vùng tóc được di chuyển bởi một nửa giá trị chồng chéo lên nhau và phương đối diện bên trong dọc theo vector từ s1 đến s2. Hình 8 cho thấy những hiệu ứng của tóc và những kiểu tương tác tóc. 2.3.2. Tương tác giữa tóc với vật thể khác Tóc có thể tương tác với bất kỳ vật thể nào trong vùng hoạt động của nó, chẳng hạn như Đầu hay thân thể con người, nơi mà đối tượng là một thân thể đặc mà không cho phép sự thâm nhập nào từ bên ngoài. Giải thuật phát hiện va chạm tóc với vật thể khác, bắt đầu bằng việc gói gọn đối tượng cùng với một vùng thể tích giáp ranh đã được phân cấp thể tích xung quanh vùng không gian quét của tóc mà được tính toán từ bên ngoài. Một va chạm được phát hiện ra giữa một khu vực của tóc và đối tượng bởi một cách đệ quy kiểm tra theo chiều ngang trong vùng thể tích hình hộp giáp ranh trong vùng không gian quét của tóc. Nếu tóc va chạm vào một đối tượng khác, thì vùng thể tích hình hộp giáp ranh sẽ trả lại những hình tam giác trong vùng tiếp xúc với tóc. Nếu một vùng của tóc đang đụng nhau với một đối tượng thì chúng ta điều chỉnh vị trí của vùng tóc đó để nó ở bên ngoài đối tượng. Chúng ta xác định số lượng để tính toán được số lượng tóc thâm nhập vào trong đối tượng. Chúng ta đẩy bộ khung theo hướng mặc định đến đối tượng được thâm nhập. Vùng tóc bây giờ không còn đụng với đối tượng - 43 - nữa. Vận tốc của vùng tóc tương tác với đối tượng có thể trở về 0, để hạn chế di chuyển theo phương tiếp tuyến khi tới và ra khỏi đối tượng. Ở những bước tiếp theo, chúng ta đã biết tóc là đứng yên khi nó ở gần đối tượng. Nếu không có giao nhau giữa đối tượng và tóc chúng ta xác định liệu có phải tóc còn ở một ngưỡng khoảng cách nhất định nào đó. Nếu nó bên trong ngưỡng này thì tóc vẫn còn hạn chế để vận tốc của nó trong hướng tới đối tượng là 0. Nếu tóc không ở bên trong ngưỡng này thì tóc có thể di chuyển quanh vật thể. Khi tóc tương tác với một đối tượng thì lực ma sát được tạo ra. Chúng ta tính toán lực ma sát này bằng việc chiếu gia tốc của tóc lên trên mặt phẳng tiếp tuyến tới đối tượng tại điểm tiếp xúc. Kết quả là thành phần gia tốc mà tiếp xúc với đối tượng, chúng ta áp dụng lực ma sát theo phương đối diện để chống lại chuyển động của tóc. Độ lớn của lực để cho tóc hoạt động dựa vào gia tốc của tóc và hệ số ma sát µ f , trên bề mặt của đối tượng, 0<µ f <1. 2.4. Phát hiện va chạm Nó rất quan trọng để kiểm tra tương tác của tóc với những vật thể khác. Tóc luôn luôn được tiếp xúc một phần với da Đầu. Vì độ phức tạp cao của tóc mà những tính toán cho tóc hoạt động rất tốn kém. Việc phát hiện va chạm được thực hiện hiệu quả do nó là một phần quan trọng trong toàn bộ thời gian hoạt động của tóc trong thời gian thực. Có nhiều kỹ thuật dùng cho phát hiện va chạm. Một vài giải thuật sử dụng cho những mô hình chung, nó dựa vào ranh giới thể tích hình hộp đã được phân cấp. Một cây những phần thể tích hình hộp giáp ranh là việc tính toán độc lập ngoài tập hợp những hình học ban đầu, những tam giác và những miếng tóc. Những phần diện tích giáp ranh khác nhau được sử dụng để phát hiện va chạm, nó bao gồm những hình hộp giáp ranh được sắp thẳng hàng, những hộp này định hướng theo trục và làm thành hình cầu, hoặc những khối hình học khác. Việc phát hiện va chạm dựa vào những phần giáp ranh này, nhờ kiểm tra những đối tượng đi ngang qua theo cách đệ quy. Để thực hiện quá trình phát hiện va chạm dựa trên những cách mô phỏng - 44 - khác nhau của các kiểu tóc, chúng ta sử dụng cách quét tập hợp các hình cầu có thể tích khác nhau để bao vây tóc. Tập hợp những hình cầu nằm dưới những phần giáp ranh tương ứng với lõi một bộ khung, nó được phát triển dần ra bên ngoài, từ một điểm ban đầu nào đó. Tập hợp lõi của bộ khung có thể bao gồm một điểm, một hàng hay một khung khép kín. Chúng ta có thể chọn sử dụng những hình chữ nhật có hướng tùy ý thay vì cả khung khép kín, như những bộ khung phức tạp nhất của chúng ta. Trong hình 9 : cho ví dụ của tập hợp hình cầu, chính xác, để cho C là lõi bộ khung và S là một hình cầu, bán kính r. Với mỗi tập hợp hình cầu đó, B có thể được định nghĩa như sau: B=C  S =  c + s c C, s  S  Hình 2.4: Tập hợp hình cầu được quét. (a) Một điểm hình cầu ; (b) hình cầu quét theo kiểu một hàng ; (c) Hình cầu quét theo một khung hình chữ nhật. Để trả lời những câu hỏi về phát hiện va chạm về một cặp tùy ý trong tập hợp hình cầu này, chúng ta có thể thực hiện một cách giao nhau đơn giản để kiểm tra trên những cặp tương ứng từ lõi của bộ khung và sau đó trừ dần đi bán kính của mỗi hình cầu tương ứng. Chúng ta có những thể tích khối cầu được chọn như những thể tích giáp ranh, vì những hình dạng của nó phù hợp với ba cách mô phỏng đơn giản của tóc. Sự khác nhau rõ rệt là quá trình quét tạo ra thể tích những khối cầu đã tạo ra những tính chất khác nhau cho những bó, những nhóm tóc riêng lẻ, những hàng quét tạo ra những hình cầu là cách tốt nhất cho mỗi vùng tóc. Trong khi những dòng quét của hình chữ nhật làm thành những hình cầu, có ứng dụng tốt cho những miếng tóc, và những điểm quét tạo thành hình - 45 - cầu cho những điểm ở đầu. Việc sử dụng tập hợp những hình cầu nằm bên dưới phần thể tích giáp ranh, khi đó việc phát hiện va chạm có thể thực hiện hiệu quả và dễ dàng kết hợp cùng một lúc ba cách mô phỏng đơn giản của tóc. Mỗi khu vực của bộ khung mà điều khiển hình dạng của ba kiểu tóc, chúng ta tính toán một vùng giáp ranh của khu vực mà hình cầu quét để xây dựng những vùng giáp ranh cho tóc và những đối tượng gần bên cạnh( ví dụ: Đầu, Cổ, và những vật thể khác ở xung quanh), những ảnh hưởng của những vật thể ở xung quanh tóc. Cho một bộ khung tạo ra n nút, ở đó có n-1 vùng, và n-1 phần thể tích hình hộp giáp ranh của vùng hình cầu quét. Bề dày của mỗi vùng được định nghĩa bằng bán kính của điểm gốc của đường mà hình cầu quét dọc theo chiều dài của nó. Để tính toán một vùng tiếp xúc với một miếng tóc, chúng ta sử dụng 4 điểm điều khiển của miếng tóc đó để tạo ra một vùng bao trùm lên nó. Khi đó nó thực hiện trên n-1 vùng. Tương tự cho cach mô phỏng đó, chúng ta sử dụng 8 điểm điều khiển để định nghĩa một khu vực, trong đó có 4 điểm điều khiển tạo ra mặt cắt ngang tại đỉnh của mỗi khu vực, và 4 điểm ở đáy để tạo ra một khu vực giáp ranh. Đối với những sợi tóc riêng lẻ, chúng ta có thể phát hiện va chạm cho mỗi sợi tóc hoặc nhóm lại theo một cách tương tự. Chúng ta tính toán một tập hợp điểm xung quanh bộ khung, để định nghĩa một khu vực với bề dày các bán kính. Đối với những sợi tóc riêng lẻ, khi đó bán kính là 0, như vậy việc phát hiện va chạm là sự kiểm tra sự giao nhau trên đường cong của bộ khung. Hơn nữa, bán kính của mỗi vùng quét dựa vào bề dày của mỗi nhóm. Mỗi một lần vùng lân cận tính toán cho một khu vực mô phỏng tóc một cách đơn giản, chúng ta xây dựng vùng lân cận của không gian quét, sử dụng cả phần trên và phần dưới cho tóc, và mỗi đối tượng cho một lần tính toán. Trong thời gian thực hiện mô phỏng, vùng lân cận được thực hiện để phát hiện va chạm, và được sử dụng một cách cẩn thận. Nhiều kỹ thuật về hoạt động của tóc và lông thú đã được nghiên cứu tỷ mỷ. Trong hệ thống của chúng ta có một sự pha trộn các kiểu của mô hình riêng biệt và liên tục của những khối hình học ở mức độ chi tiết, được sử dụng để trình bày sự thay đổi của tóc. Mỗi cách mô phỏng có một kiểu trình bày hình học rõ ràng - 46 - như: mỗi một sợi riêng biệt là một sự biến đổi của một đường cong của khung động, mỗi bó tóc là một cách biến đổi một bề mặt của khung( ví dụ như bề mặt được phát sinh bằng quá trình quét một đường cong xung quanh một trục ), mỗi mảnh là một cách biến đổi một bề mặt của khung. Bằng việc thay đổi các thông số màu sắc, như là một hàm khoảng cách tới người xem, gần như liên tục ở mức độ chi tiết, được cung cấp cho việc mô phỏng hình học của tóc. Một trong những điều quan trọng của biến đổi tóc ở phía bề ngoài, là nhờ tác động của ánh sáng. Những kiểu chiếu sáng truyền thống phụ thuộc vào bề mặt mặc định. Tuy nhiên, đối với sự biến đổi của những sợi riêng lẻ, không có sự lựa chọn ánh sáng của một vector pháp tuyến. Hơn nữa, tóc là một bề mặt không được định hướng. Sự phản chiếu ánh sáng đối với những bề mặt không được định hướng, thường xảy ra đối với tóc, làm cho tóc có thể bóng và có màu bạc, màu của tóc thay đổi theo những hướng nhìn khác nhau. Những giải thuật đối với những phản xạ bề mặt, chỉ số của nó được xác định bằng khoảng cách từ mắt tới hướng của ánh sáng chiếu vào và hướng mà chúng ta nhìn thấy tóc được chiếu sáng. Sự chiếu sáng truyền thống không được áp dụng trong quá trình miêu tả tóc của chúng ta. Thay vào đó, sự chiếu sáng không định hướng này được pha lẫn với màu nguyên thuỷ bên dưới, trong suốt quá trình biến đổi hoạt động của tóc. Đối với những sợi tóc, thì bóng sẽ được mặc định trong hệ thống màu của tóc cho mỗi sợi riêng lẻ. Những bề mặt khung được sử dụng tốt cho những miếng và những bó tóc, ánh sáng phản xạ trên bề mặt đó được gán bằng những màu trong một phạm vi tương tự. Sự chuyển tiếp giữa những sợi, bó, miếng là nguyên nhân gây ra sự rối loạn màu sắc khi ta quan sát tóc. Để có một chuyển tiếp mịn, thì phải khắc phục những hạn chế trên bề mặt khung, khi những miếng được sử dụng để thiết kế kiểu tóc. Những miếng được sử dụng khi tóc hoàn toàn che khuất, hoặc ở khoảng cách xa đối với người quan sát. Ngoài ra, những phần xung quanh của những kiểu tóc và xung quanh bề mặt, là tập hợp những điểm không chuyển tiếp dưới cách mô phỏng của một bó. Bởi vì không cho phép những phần tóc chuyển tiếp đến cách mô phỏng của miếng, thể tích và hình bóng của mỗi kiểu tóc được bảo vệ. Việc đưa ra ba cách mô phỏng của một khu vực tóc, một cách trình bày nhất định cho kiểu tóc và mô phỏng những vùng này được tính toán dựa trên - 47 - cơ sở của vài tiêu chuẩn. Chúng ta đã sử dụng những thành phần sau trong quá trình thực hiện là:  Tính rõ ràng  Khoảng cách quan sát  Sự hoạt động của tóc Tính rõ ràng Nếu người xem không thể nhìn thấy một vùng của tóc, thì vùng đó không cần mô phỏng, hoặc không cần hoạt động mô phỏng ở mức độ chi tiết cao cho những nhóm tóc riêng lẻ. Tóc không thể được nhìn thấy nếu nó ở ngoài vùng quan sát của camera, hoặc nó hoàn toàn bị che khuất bởi Đầu hoặc những đối tượng khác trong cảnh. Một vùng của nhóm những sợi tóc thông thường mô hình của nó được sử dụng đến 5 bộ khung, nhưng nó lại bị che khuất bởi các đối tượng khác, một mô hình tóc của chúng ta sử dụng một bó lớn, do vậy ta chỉ sử dụng một khung. Mô hình tốt nhất là mô hình có thể thay thế cho cả 5 khung, với cách tính toán thời gian bằng cách tính toán cho cả 5 khung hình trên. Khi mà khung hình của tóc được quay về chế độ hiển thị, thì vấn đề quan trọng là sắp xếp các hành động của tóc, nó thích hợp cho trường hợp tóc không được miêu tả ở mức độ chi tiết. Ví dụ: điều này có thể xảy ra khi mà một nhóm tóc bị cuốn lại bởi một cơn gió lốc. Đồng thời, khi tóc quay lại chế độ hiển thị bởi chuyển động của camera, hoặc chuyển động của Đầu, tất nhiên tóc được miêu tả một cách thích hợp, cùng với sự hiểu biết của người xem về mô hình đó. Việc duy trì mô hình tóc ở mức độ chi tiết nó cho phép mô phỏng ở đó một cách trực quan, trong khi giảm bớt được thời gian tính toán cho việc mô phỏng tóc. Trong quá trình thêm, khi những vùng tóc ít được chú ý thì qúa trình hoạt động của tóc cũng được đơn giản đi. Nếu tóc hoàn toàn đứng yên, thì không cần phải biến đổi nữa. Bởi vậy khi một vùng của tóc không hoạt động, chúng ta có - 48 - thể mô phỏng tóc ở những dạng đơn giản như: những bó, hoặc những nhóm tóc, hay những miếng tóc, mà sử dụng ít khung hình cho những vùng này. Cách mà chúng ta tính toán liệu có phải một vùng tóc nào đó có phải là quan trọng, hay là không trong quá trình thi hành, chúng ta sẽ thực hiện kiểm tra một cách đơn giản. Chúng ta đặt những cái hộp xung quanh cái đầu và điều chỉnh những cái hộp đó sao cho nó nhỏ hơn cái đầu. Chúng ta chiếu một đường từ camera đến đỉnh và phần dưới cùng của mỗi kiểu trình bày tóc. Nếu tóc có kiểu là một bó thì những tia sáng bắt nguồn từ camera và kết thúc ở tại đỉnh và phần dưới của bó. Chúng ta kiểm tra xem liệu có phải những tia sáng cắt chéo nhau với bất kỳ sáu mặt nào của cái hộp không. Nếu cả hai tia sáng cùng cắt ngang cái hộp trước khi chiếu đến vùng tóc, thì chúng ta kết luận rằng toàn bộ vùng tóc đó đã bị che khuất. Nó có thể được sử dụng để thành lập những giải thuật để che khuất tóc. Khoảng cách nhìn Một nguyên nhân tiếp theo để xem xét việc chọn một kiểu trình bày tóc, là từ khoảng cách người quan sát đến tóc, hay tóc ở xa người quan sát, thì ta không thể nhìn thấy tóc ở mức độ chi tiết được. Do vậy, chúng ta không thể sử dụng môt kiểu trình bày duy nhất cho tóc được. Chúng ta có thể đánh giá được mức độ chi tiết mà chúng ta nhìn thấy bằng việc tính toán vùng không gian màn hình mà tóc được thể hiện. Ví dụ: Một vùng tóc có thể được trình bày bằng một bó, một nhóm của vài ba bó, một miếng, hay một nhóm những sợi riêng lẻ. Mỗi sự trình bày này được thiết kế để bao trùm một vùng tương tự của không gian thế giới. Tổng hợp từ tất cả những gì đã được trình bày này, nó chiếm giữ một lượng tương tự của không gian thế giới, chúng ta sử dụng điều khiển các khung của những miếng như là đánh giá số lượng tóc đã được chiếm giữ bởi không gian hiển thị. Ví dụ: để xác định phạm vi thể hiện của một mảnh, chúng ta chiếu một hàng từ một điểm đầu tiên trong khung đến điểm cuối cùng của khung trong không gian hiển thị. Nếu số lượng không gian màn ảnh bao trùm bởi hàng này - 49 - vượt quá sự cho phép của kích cỡ cực đại của mảnh, thì vùng tóc này được biến đổi giống như một bó. Tương tự, nếu, số lượng không gian màn ảnh bao trùm bởi hàng vượt quá kích cỡ cực đại cho phép của một bó, thì nó sẽ được trình bày giống như những sợi tóc riêng lẻ. Chuyển động của tóc Một khía cạnh khác, để xem xét việc lựa chọn kiểu trình bày thích hợp cho tóc và hoạt động hiện thời của tóc. Nếu tóc là không chuyển động chút nào, thì không cần một sự tính toán lớn cho nó, vì vậy chúng ta không cần trình bày ở mức độ chi tiết. Khi mà con người làm cho nó chuyển động đột ngột, chẳng hạn như rung chuyển anh ấy, hoặc cái Đầu của cô ấy, hay một cơn gió lớn, khi đó chúng ta cần mô phỏng tóc ở một mức độ chi tiết. Khi một lực lớn tác động đến tóc, chẳng hạn như gió, những sợi tóc riêng lẻ có thể được nhìn thấy, nhưng thông thường ở khoảng cách xa, thì không thể nhìn thấy những sợi tóc riêng lẻ hoạt động. Đồng thời, nếu tóc chuyển động nhiều ở xung quanh, thì nó có nhiều va chạm với những đối tượng khác( ví dụ như thân thể ) xung quanh nó. Khi tóc va chạm vào nhau trong quá trình hoạt động của nó, ta sử dụng miêu tả ở mức chi tiết nhất để đạt được kết quả cao trong việc phát hiện va chạm của tóc. Chúng ta chọn những cách mô phỏng ở mức độ chi tiết đặc biệt dựa vào sự chuyển động của tóc bằng việc đầu tiên là xác định điểm điều khiển trong khung trong sự trình bày hiện thời, và có những lực tác động mạnh lên nó, bắt nó phải hành động theo. Giá trị này được so sánh với với những ngưỡng của định nghĩa cho những sợi hoặc những bó. Nếu những lực hoạt động trong khung không phải là đủ cao, nó chỉ đủ để dùng cho những sợi, hoặc những bó. Ở tại bất kỳ một khoảng thời gian nào trong quá trình miêu tả, một cái Đầu có tóc được đại diện bởi nhiều cách mô phỏng ở mức độ chi tiết khác nhau. Mỗi vùng của tóc sử dụng những tham số giá trị của chính mình để thúc đẩy một sự chuyển tiếp. Đối với những vùng tóc có một vị trí gốc nằm trên đỉnh đầu, vì vậy nó được nhìn thấy một cách dễ dàng hơn những nhóm tóc ở mức xa hơn như khu vực tóc ở cổ. Như vậy, mặc dù hai vùng tóc có cùng khoảng cách từ đó đến - 50 - camera và có cùng sự chuyển động, nhưng lớp ở đỉnh lại được quan tâm nhiều hơn, ví dụ như những sợi riêng lẻ được quan tâm nhiều hơn các bó, khi nó được quan sát trực tiếp. Khi xác định một LOD để sử dụng, trước hết chúng ta kiểm tra vùng mà tóc che khuất. Nếu tóc không cần miêu tả chi tiết cho người xem, thì chúng ta coi nó như một miếng tóc và không cần phải cho nó hoạt động. Trong trường hợp này không cần có sự kiểm tra chuyển tiếp nào được sử dụng đến. Nếu một vùng tóc cần miêu tả một cách rõ ràng, thì chúng ta thực hiện sự chuyển động và khoảng cách mô tả như ở trên. Mô phỏng ở mức độ chi tiết được lựa chọn dựa vào miêu tả ở mức độ chi tiết cao và mục đích quan sát của con người, vì vậy có thể bỏ qua một số lỗi khi thể hiện khung cảnh. Trong hình 10, thể hiện nhiều cách mô phỏng chi tiết khác nhau được sử dụng trong một lần mô phỏng. Sử dụng những cách mô phỏng khác nhau của tóc, hầu như người xem không thể thấy rõ những sợi tóc riêng lẻ khi quan sát. Hình 2.4.1: Mô phỏng của một cơn gió thổi qua đầu, được camera quay lại, hình bên trái là mô phỏng sử dụng mức độ chi tiết, Ảnh ở giữa cho thấy cùng một sự mô phỏng, những sợi là màu vàng, bó là màu đỏ, và những miếng tóc bị che khuất thì không được thể hiện. Hình bên phải nhất cho thấy mô phỏng từ phía sau sử dụng cùng màu đó lên sơ đồ ảnh trung tâm. Camera là điểm hội tụ của 4 đường màu trắng. Để tăng tốc độ những chuyển tiếp ở mức độ chi tiết khác nhau khi thực hiện mô phỏng tóc, nhiều thành phần phải được tính toán. Một công cụ có thể tương tác với tóc, cho phép người dùng đặt lại những bộ khung trên đầu tại những vị trí mong muốn. Những công cụ cho phép thiết kế những kiểu tóc, chẳng hạn như tóc quăn, hay gợn sóng thay đổi những hệ số hoặc một số thuộc tính của tóc, ví dụ: - 51 - kích thước chiều dài, rộng, bán kính. Chúng ta cũng cần tính toán vùng quét của mỗi kiểu tóc để phát hiện va chạm của tóc. Vì vậy trong thời gian chuyển tiếp mô phỏng chi tiết, những giá trị mà thường xuyên được cập nhật là những vị trí nút của các bộ khung. Hơn nữa, chúng ta trình bày mô phỏng một kiểu đầu đơn giản, để thực hiện phát hiện va chạm giữa Đầu và tóc. Hình 2.4.2: Quá trình mô phỏng tóc động sử dụng những mức chi tiết khác nhau, một sự nối tiếp của những ảnh được chụp khi mà có gió tác động vào. 2.5. Việc thúc đẩy cho hệ thống khung kép Chuyển động của tóc tuỳ thuộc vào những thay đổi trong việc xác định vị trí của các sợi tóc, những vị trí của một vùng nào đó được thay đổi, chẳng hạn như việc kéo dài ra của tóc quăn dưới một lực tác động. Trong khi những khu vực tóc được thiết kế chuyển động làm cho cứng nhắc khi sử dụng một sản phẩm hãm tóc cho một sự mạnh mẽ, tóc còn tuỳ thuộc vào một sự chuyển động toàn diện khi có những lực được ứng dụng tới nó. Những hệ thống làm mô hình tóc trên nền những mớ, bó, để làm được chúng ta cần sử dụng một đường cong của bộ khung đơn, nó như là một tập hợp những đoạn thẳng được nối với những lực đàn hồi và những khớp nối. Đối với tóc gợn sóng, được sản sinh bởi việc chỉ rõ tần số của sóng,và biên độ sóng cho mỗi mớ. Khi từng đoạn của mỗi mớ được căng ra, biên độ và tần số của sóng được điều chỉnh để thấy được độ gợn sóng của tóc. Sự chuyển động của khung đơn có thể làm cho biến dạng kiểu tóc, tuy nhiên không có kiểm tra để đảm bảo rằng độ dài của tóc được giữ gìn trong suốt thời gian mô phỏng, hay sự phát hiện ra va chạm chính xác và hiệu quả khi mô phỏng trong ánh sáng, theo các hướng thay đổi và những định vị của tóc trong mớ tóc. Để tìm ra tất cả sự chuyển động của toàn bộ và một vùng hoạt động của tóc thì phải tìm - 52 - ra hướng của tóc chuyển động, để bảo toàn độ dài của tóc trong suốt thời gian mô phỏng và thay đổi những phương pháp phát hiện va chạm hiệu quả, chính xác ở khắp nơi cho sự mô phỏng, chúng ta có thể tạo ra hệ thống những bộ khung kép cho việc làm mô hình tóc. Hệ thống khung kép này cung cấp những bộ khung đơn để điều khiển toàn bộ khung tóc hay một bộ phận tóc, và một khoảng ngắn cung cấp hướng để xác định vị trí, vùng để phát hiện ra va chạm. Chúng ta tham chiếu đến toàn bộ bộ khung, và những bộ khung địa phương thành phần theo một thứ tự định sẵn. 2.6. Thiết lập bộ khung kép Bộ khung được mô tả như là hàng loạt những đoạn thẳng nối với những nút điều khiển, Ng 0, Ng 1,…, Ng (n-1), khi n là số những điểm nút. Một kiểu tóc được định nghĩa bởi việc định vị những bộ khung con, và thiết lập những mối quan hệ đối với bộ khung chính (hình 12). Đoạn thẳng giữa Ng i và Ng( i-1) của bộ khung chính, điểm điều khiển là điểm thứ i trong đoạn của khung chính, Sg i . Ở nút thứ i của khung địa phương là Nl i , đoạn thẳng trong mặt phẳng vuông góc tới Sg i chứa Ng i . Mỗi bộ khung thành phần được định nghĩa bằng vị trí góc tới phạm vi xung quanh từng đoạn của bộ khung chính. Hình 2.5: định vị của bộ khung địa phương tương ứng với bộ khung chính - 53 - Sự biến đổi hình học của tóc theo mẫu theo bộ khung địa phương, Những sợi tóc riêng lẻ đươc mô phỏng như những đường cong được chia nhỏ. Những sợi ở gần nhau được nhóm lại cùng nhau theo một hệ thống của bộ khung kép đó. Nhóm này miêu tả tự nhiên cho những nhóm sợi, nhờ những chất mặt ngoài hay những lực tĩnh điện có thể tìm thấy trong thiên nhiên. Mỗi lần những bộ khung kép được tạo ra, những vòng tròn của mặt cắt ngang được định nghĩa tại mỗi điêm nút của bộ khung thành phần. Những sợi tóc được đặt ngẫu nhiên bên trong những ranh giới của những khu vực chéo nhau. - 54 - CHƯƠNG III XÂY DỰNG CHƯƠNG TRÌNH ỨNG DỤNG 3.1. Giới thiệu một số mô hình tóc Để thiết kế những kiểu tóc cho các nhân vật trong Game 3D, hay phim hoạt hình, chúng ta thường sử dụng phần mềm chuyên dụng để thiết kế nhân vật, một số phần mềm được sử dụng rộng rãi hiện nay là phần mềm Maya, hay phần mềm 3D smax. Trong chương này em xin giới thiệu một số mẫu thiết kế kiểu tóc sử dụng bằng phần mềm Maya và đã thu được một số kết quả như sau: Hình 3.1.1: Thiết kế khung tóc cho mô hình nhân vật, sử dụng phần mềm Maya. Để thiết kế được những mô hình tóc như trong hình 13, chúng ta phải sử dụng một hệ thống lưới khung, có thể thao tác đến từng điểm nút trên khung, việc thêm hay bớt những nút này tùy thuộc vào người thiết kế mô hình tóc hay tuỳ từng kiểu tóc mà số điểm nút của khung có thể dày hay thưa. Sau khi việc xây dựng mô hình lưới hoàn thành, có thể nói đây là một khung tổng quát có thể lưu lại để sử dụng cho việc tạo ra những mẫu tóc khác nhau, tuỳ theo kiểu tóc mà thay đổi độ dày mỏng khác nhau cho các lớp tóc, sau đó chúng ta áp ảnh của những sợi tóc lên khung đã được xây dựng, hình ảnh của tóc được thể hiện trong hình. - 55 - Hình 3.1.2: Áp hình ảnh của tóc lên khung đã được xây dựng. Để chuyển một kiểu tóc từ dạng thẳng sang dạng bó, khi đó chúng ta phải sử dụng những phương pháp tổng hợp và phân chia nhóm, để tạo ra những bó tóc mà vẫn giữ được nét mềm mại của nó (hình 16). Hình 3.1.3: Chuyển đổi dạng tóc thẳng sang dạng nhiều bó tóc, kết hợp tạo độ cong cho tóc. Phần tóc trước mặt được thể hiện trong hình ta thấy với bất kỳ một khuôn mặt nào cũng cần phải tạo tóc mai, để cho nó giống với hiện thực hơn, nhưng việc mô phỏng động của một nhóm tóc này lại phụ thuộc vào một khung riêng để có thể tạo những chuyển động riêng cho nó, chẳng hạn như khi có gió tác động vào. Trong hình là khung hình cho tóc mai, và đây cũng là khung cảnh mô phỏng những sợi tóc riêng biệt. - 56 - Hình 3.1.4: Khung tóc của những sợi tóc riêng biệt. Việc phát hiện va chạm của tóc khi có một lực bên ngoài tác động vào hay là việc chuyển động của Đầu và làm cho tóc di chuyển theo, được quan tâm nhiều trong mô phỏng hoạt động của tóc. Hình 3.1.5: thể hiện kết quả của tóc khi có gió tác động từ đằng trước và sau Hình 3.1.6: Phát hiện va chạm và sự tương tác trả lại va chạm của tóc. - 57 - Hình 3.1.7: So sánh kết quả trả lại kết quả ban đầu của tóc chịu sự tác động của một lực và của tóc không chịu tác động của lực. 3.2. Xây dựng chương trình ứng dụng 3.2.1. Chương trình mô phỏng chất liệu lông Việc mô phỏng chất liệu lông cũng giống như việc mô phỏng chất liệu tóc, là trước hết cần phải có mô hình 3d, chẳng hạn là một con gấu. Nó được xây dựng nhờ một số công cụ tạo hình 3d như 3dsmax, Maya, Milkshape3D… sau đó nó được load và lập trình để che phủ lông lên đối tượng đó. Ở đây đối tượng được tạo ra là một con gấu, với định dạng file là *.LWO. Hình 3.2.1a. Đối tượng 3d đã được tạo để phủ lông Sau khi đã có đối tượng này, ta có thể đánh dấu những vùng mà được che phủ chất liệu lông, cụ thể ở đây những vùng có màu tối hơn trên đối tượng là vùng cần được che phủ bằng lông. Đoạn mã lệnh dùng để mô phỏng chất liệu lông gần giống với mô phỏng chất liệu tóc và nó cũng đơn giản hơn. Đoạn mã lệnh sau mô tả quá trình tạo ra một sợi lông: void CLine::Init(CPoint3D p0, CPoint3D dp) - 58 - { pt0=p0; pt1=p0+dp; pta=pt1; } Hàm Cline:: Init() cho phép tạo ra một đoạn thẳng từ hai điểm trong không gian. Lông là một chuỗi các đoạn thẳng được liên kết với nhau, sau khi đã có mô hình và đã lấy được bề mặt để phủ chất liệu lông, ta có thể tạo ra một sợi lông hoàn chỉnh bằng việc sử dụng hàm Chair::Init() sau: void CHair::Init(CObject *_o,CSurface *_s) { nbl=NBHAIR; o=_o; s=_s; m=*s; m.flag&=~CMaterial::Lighting; for (int i=0;i<NBHAIR;i++) { int f=rnd(s->nbf); CTriFace *fc=s->fc+f; float a=rnd(1.0f); float b=rnd(1.0f); if (a+b>1.0f) { a=1.0f-a; b=1.0f-b; } CPoint3D pos=fc->v[0]->p + a*(fc->v[1]->p - fc->v[0]->p) + b*(fc->v[2]->p - fc->v[0]->p); CPoint3D dir=fc->v[0]->n + a*(fc->v[1]->n - fc->v[0]->n) + b*(fc->v[2]->n - fc->v[0]->n); dir.Scale(HAIRLENGTH/dir.Length()); ln[i].Init(pos,dir); } - 59 - { CColor4f col=m.diffuse; for (int i=0;i<HAIRNCOLOR;i++) { c[i]=col*((i+HAIRNCOLOR/2)*1.0f/HAIRNCOLOR); } } } inline void glVertex3D(const CPoint3D &p) { glVertex3f(p.x,p.y,p.z); } extern float fps; Mỗi một sợi lông đều phải có điểm gốc của nó, nếu như nó không được gắn vào đâu thì nó sẽ trở thành một sợi lông lơ lửng trong không gian, do vậy cần sử dụng hàm CHair::Aff(); để gắn lông vào bề mặt đã có. void CHair::Aff() { int pdata=m.Put(); CLine *l=ln; int n; //=NBHAIR; glBegin(GL_LINES); for (int ic=0;ic<HAIRNCOLOR;ic++) { glColor4fv(c[ic].t); if (ic==HAIRNCOLOR-1) n=nbl-(HAIRNCOLOR-1)*(nbl/HAIRNCOLOR); else n=nbl/HAIRNCOLOR; CPoint3D p; do { glVertex3D(l->pt0); - 60 - glVertex3D(l->pt1); ++l; } while (--n); } glEnd(); } Để thấy được những sợi lông này một cách trực quan và những sợi lông liên tục được cập nhật thì ta phải sử dụng hàm CHair::Update(); void CHair::Update(float dt,CPoint3D Depl) { if (dt>0) Depl.Scale(1.0f/dt); float f=(float)pow(0.1f,dt); Depl0=Depl0*f+Depl*(1.0f-f); Depl=Depl0; int i=nbl; CLine *pl=ln; Depl.Scale(HAIRLENGTH*4); do { pl->pt1.x=pl->pta.x+Depl.x; pl->pt1.y=pl->pta.y+Depl.y; pl->pt1.z=pl->pta.z+Depl.z; //pl->pt1.Scale(HAIRLENGTH/pl->pt1.Length()); ++pl; } while (--i); } Sau khi thực hiện quá trình che phủ chất liệu lông lên cho đối tượng ta có kết quả như sau: - 61 - Hình 3.2.1b. Đối tượng sau khi đã được che phủ lông 3.2.2. Chương trình mô phỏng chất liệu tóc Như đã nói ở phần trên, để mô phỏng được tóc trước hết ta phải xây dựng được mô hình 3d, sau đó mô hình này sẽ được sử dụng ngôn ngữ lập trình để phủ lông hoặc tóc lên. Mô hình 3d ở đây được xây dựng nhờ sử dụng phần mềm Milkshape 3D. định dạng của file là: *. LWO. Đầu người có hình như sau: Hình 3.2.2a. Mô hình đầu người đã được xây dựng - 62 - Nhưng việc xây dựng này là chưa đủ, vì thực tế nếu như thế này thì chúng ta không thể biết được vùng nào sẽ được phủ tóc, vì vậy nhưng vùng được phủ tóc phải được đánh dấu bằng màu khác để khi lập trình chúng ta còn biết. Hình 3.2.2b: những vùng phủ tóc đã được đánh dấu để phân biệt. Chúng ta đã có đối tượng 3d, nhưng thực tế khi lập trình chúng ta chỉ có thể lấy được những điểm của đa giác, vì vậy chúng ta phải vẽ lại các điểm đó và phủ kín đa giác để tái tạo lại cái đầu trong mô phỏng. Hàm lấy các điểm đó và vẽ lại các điểm là hàm: void CLine::Init(CPoint3D p0, CPoint3D dp) void CLine::Init(CPoint3D p0, CPoint3D dp) { n=dp; n.Normalize(); p0-=dp; for (int i=0;i<HAIRSIZE;i++) { pt[i].p=p0; p0+=dp; dp.x+=rnd(2*HAIRRANDOM)-HAIRRANDOM; dp.y+=rnd(2*HAIRRANDOM)-HAIRRANDOM; dp.z+=rnd(2*HAIRRANDOM)-HAIRRANDOM; } } - 63 - Cần phải lấy các nút và vẽ lại các nút đó, do vậy sử dụng thêm 2 hàm sau để vẽ và update lại. void CNode::Put(int pdata) { //if (pdata&PUT_NORMAL) //glNormal3f(n.x,n.y,n.z); //if (pdata&PUT_COORD) glVertex3f(p.x,p.y,p.z); } void CLine::Aff(int pdata) { //if (pdata&PUT_NORMAL) //glNormal3f(n.x,n.y,n.z); CNode *p=pt+1; int n=HAIRSIZE-1; glInterleavedArrays(GL_V3F,sizeof(CNode),p); glDrawArrays(GL_LINE_STRIP,0,n); } Sau khi đã tái tạo lại đối tượng ta tiến hành khởi tạo tóc bằng việc sử dụng hàm:void CHair::Init(CObject *_o,CSurface *_s), dựa trên bề mặt lấy được thông qua một loạt các hàm khác. void CHair::Init(CObject *_o,CSurface *_s) { o=_o; s=_s; m=*s; m.flag&=~CMaterial::Lighting; for (int i=0;i<NBHAIR;i++) { int f=rnd(s->nbf); CTriFace *fc=s->fc+f; float a=rnd(1.0f); float b=rnd(1.0f); - 64 - if (a+b>1.0f) { a=1.0f-a; b=1.0f-b; } CPoint3D pos=fc->v[0]->p + a*(fc->v[1]->p - fc->v[0]->p) + b*(fc->v[2]->p - fc->v[0]->p); CPoint3D dir=fc->v[0]->n + a*(fc->v[1]->n - fc->v[0]->n) + b*(fc->v[2]->n - fc->v[0]->n); dir.Scale(HAIRLENGTH/dir.Length()); ln[i].Init(pos,dir); } { CColor4f col=m.diffuse; for (int i=0;i<HAIRNCOLOR;i++) { c[i]=col*((i+HAIRNCOLOR/2)*1.0f/HAIRNCOLOR); } } } Bây giờ dùng hàm: void CHair::Aff(),để phủ tóc lên những vùng đã được chọn void CHair::Aff() { int pdata=m.Put(); CLine *l=ln; int n=NBHAIR; do { //glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE, c[((n-1)*HAIRNCOLOR)/NBHAIR].t); glColor4fv(c[((n-1)*HAIRNCOLOR)/NBHAIR].t); l->Aff(pdata); ++l; - 65 - } while (--n); } Mọi thông tin của tóc được định nghĩa như sau: #define LENGTH HAIRLENGTH #define LENGTH2 (4.0f*LENGTH) #define MAXLENGTH (1.2f*LENGTH) #define MAXLENGTH2 (1.1f*LENGTH) /*#define GRAVITY 0.01 #define STIFFNESS 0.1 #define STIFF2 0.004 #define FROT 0.2*/ #define GRAVITY 0.03f #define STIFFNESS 0.2f #define STIFF2 0.007f #define FROT 0.1f /*#define GRAVITY 0.01 #define STIFFNESS 0.1 #define STIFF2 0.004 #define FROT 0.2*/ //#define STEP 1.0 //#define NBUPD 1 //#define OFROT 2.0 //#define VFROT 0.1 //H3DVt GForce={0,0,-GRAVITY}; #define MAXL (MAXLENGTH*MAXLENGTH) #define MAXL2 (MAXLENGTH2) Sau đó ta dùng hàm: void CHair::Update(float dt,CPoint3D Depl) để hoàn thiện việc phủ tóc lên đối tượng. void CHair::Update(float dt,CPoint3D Depl) { CPoint3D v,v2; - 66 - float l,f1,f2; CLine *pl=ln; int i=NBHAIR; do { int p=HAIRSIZE-2; CNode *pp=pl->pt+2; do { pp->p+=Depl; v=pp[-1].p-pp[0].p; l=v.Length2(); if (l>MAXL) { // p0'=p1+(p0-p1)*L/l -> p0'=p0+p0*(-1+L/l)+p1*(1-L/l) = p0+(p1-p0)*(1-L/l) v*=(1.0f-MAXL2/(float)sqrt(l)); pp->p+=v; pp->v*=1.0f-FROT; } else { //f1=(STIFFNESS*(l-LENGTH*LENGTH))/LENGTH*LENGTH; f1=STIFFNESS*(1.0f-(LENGTH*LENGTH)/l); //v.Scale(1.0f/(float)sqrt(l)); v2=pp[-2].p-pp[0].p; l=v2.Length2(); //f2=0.4f*STIFF2*(l-LENGTH2*LENGTH2)/LENGTH*LENGTH; f2=0.4f*STIFF2*(1.0f-(LENGTH2*LENGTH2)/l); //v2.Scale(1.0f/(float)sqrt(l)); pp->v=pp->v*(1.0f-FROT)+v*f1+v2*f2; //+GForce; } pp->v.z+=GRAVITY; ++pp; - 67 - } while (--p); p=HAIRSIZE-2; pp=pl->pt+2; do { pp->p+=pp->v; ++pp; } while (--p); ++pl; } while (--i); } Hình ảnh của tóc khi được phủ lên những vị trí được chọn cho kết quả như sau: Hình 3.2.3 : Tóc đã được bao phủ lên đầu - 68 - KẾT LUẬN Mô phỏng chất liệu là một vấn đề khó khăn, nó đòi hỏi yêu cầu cao cả về phần cứng máy tính và phần mềm. Hiện nay ở Việt Nam mới được quan tâm đến lĩnh vực này, song đã nhận được rất nhiều sự quan tâm của các bạn yêu thích thực tại ảo. Mô phỏng chất liệu đang là một nhu cầu thiết yếu phục vụ cho điện ảnh, giải trí, đặc biệt là mô phỏng chất liệu lông, tóc không những phục vụ cho giải trí mà nó còn sử dụng cho việc thiết kế thời trang tóc.  Đồ án đã tập trung nghiên cứu một số kỹ thuật mô phỏng chất liệu tóc, nhằm giúp cho quá trình mô phỏng trong không gian 3 chiều được hoàn thiện hơn. Đồ án đã thu được một số kết quả sau:  Tổng quan về thực tại ảo, các lĩnh vực ứng dụng của thực tại ảo, tổng quan về mô phỏng chất liệu và mô phỏng chất liệu lông, tóc trong thực tại ảo.  Nghiên cứu mô hình mô phỏng chất liệu tóc.  Nghiên cứu phương pháp mô phỏng tóc dựa trên mô phỏng tóc bằng cách nhóm và chia nhỏ tóc ở mức độ chi tiết.  Nghiên cứu và cài đặt một số phương pháp mô phỏng chất liệu tóc dựa trên việc nhóm và chia nhỏ nhóm. Hướng phát triển Mô phỏng chất liệu tóc là một vấn đề khó, trong đồ án này mới chỉ là những bước đầu của việc mô phỏng chất liệu tóc. Do vậy bước tiếp theo của đồ án là hoàn thiện dần việc mô phỏng chất liệu tóc, mô phỏng được chuyển động của tóc khi có các ngoại lực tác động vào, chuyển động của tóc khi bị thấm ướt, màu sắc của tóc khi có ánh sáng chiếu vào. - 69 - TÀI LIỆU THAM KHẢO 1. Nguyễn Văn Huân - Phạm Việt Bình, Xử lý hiệu ứng màu và khí quyển trong thực tại ảo, Kỳ yếu hội thảo quốc gia lần thứ 8, Hải Phòng, 2006. 2. Nguyễn Văn Huân – Vũ Đức Thái, Một số kỹ thuật cải tiến xử lý hiệu ứng màu và khí quyển trong thực tại ảo, Hội nghị khoa học Khoa Công nghệ Thông tin - Đại học Thái Nguyên, 14/12/2005. 3. Nguyễn Văn Huân – TS. Đỗ Năng Toàn, Chế tác quần áo cho các nhân vật 3D trong thực tại ảo, Hội thảo khoa học quốc gia ICT.RDA’06, Hà Nội, 20-21/05/2006. 4. Nguyễn Văn Huân – Vũ Đức Thái – TS. Đỗ Năng Toàn, Cải tiến kỹ thuật mô phỏng vải Semi – Implicit trong thực tại ảo, Hội thảo quốc gia lần thứ 9, Đà Lạt, 15-17/06/2006. 5. http:// www.3dnews.com 6. - Hình ảnh về việc nghiên cứu hộp sọ của con người theo tạp chí tại địa chỉ này. 7. Kelly Ward and Ming C. Lin. (2003), Hardware Accelerated Hair Rendering. Technical Report, University of North Carolina at Chapel Hill. 2003 8. Kelly Ward and Ming C. Lin. (2003), Adaptive Grouping and Subdivision for Simulating Hair Dynamics. In Pacific Graphics Conference on Computer Graphics and Applications, pp.234-243, 2003. 9. Kelly Ward, Ming C. Lin, Joohi Lee, Susan Fisher, and Dean Macri (2003), Modeling Hair Using Level-of-Detail Representations. Proceedings of Computer Animation and Social Agents (CASA), pp. 41- 47, 2003. 10. Y. Bando, B.-Y. Chen, and T. Nishita (2003), “Animating hair with loosely connected particles,” Computer Graphics Forum, vol. 22, no. 3, pp. 411– 418, 2003, proceedings of Eurographics’03.

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

  • pdfMô phỏng chất liệu trong thực tại ảo và ứng dụng với chất liệu lông & tóc.pdf