2.4.1. Xương, khung xương là gì?
Trong thực tế, xƣơng là một phần rất quan trọng của cơ thể. Các xƣơng không tồn tại ở một vị trí đơn lẻ, riêng biệt mà đƣợc liên kết lại với nhau bởi các khớp xƣơng tạo thành một khung xƣơng. Nó góp phần vào việc cấu tạo nên cơ thể, giúp cơ thể có thể di chuyển đƣợc một cách linh hoạt hơn. Và khi một xƣơng chuyển động thì các xƣơng kêt nối với xƣơng đó chuyển động theo làm cho cả khung xƣơng chuyển động.
Ta có thể hiểu xƣơng là khung của một đối tƣợng cụ thể. Khung xƣơng của một đối tƣợng là một tập hợp các xƣơng đƣợc liên kết lại với nhau bởi các khớp xƣơng, nó có tác dụng giữ cấu trúc và tạo ra các chuyển động cho đối tƣợng. Do đó, để mô phỏng tạo chuyển động cho các đối tƣợng đó, ta cần tạo khung xƣơng cho các đối tƣợng đó.
2.4.2. Tạo khung xương cho đối tượng
Có ba phƣơng pháp để tạo khung xƣơng cho một đối tƣợng. Đó là sử dụng các xƣơng, các khớp nôi và khung xƣơng có sẵn.
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
Sử dụng các xƣơng có thể tạo khung xƣơng cho một đối tƣợng cụ thể. Nghĩa là ở đây cấu trúc khung xƣơng của chúng ta chỉ đƣợc cấu tạo bởi các xƣơng. Khi các xƣơng đƣợc liên kết với nhau tạo ra một cấu trúc khung xƣơng gần giống với thực tế.
Khi sử dụng xƣơng để xây dựng cấu trúc khung xƣơng cần quan tâm:
- Cấu trúc khung xƣơng trong thực tế nhƣ thế nào? Nó gồm các xƣơng nào độ dài của xƣơng cũng nhƣ là vị trí ra sao.
- Xác định sự liên kết của các xƣơng trong cấu trúc? Trong thực tế, một xƣơng có liên kết với nhiều xƣơng hoặc chỉ một xƣơng duy nhất. Do đó để đơn giản và thuận tiện trong việc lƣu trữ và xây dựng mối quan hệ giữa các xƣơng trong cấu trúc liên kết thì thƣờng cấu trúc xƣơng đƣợc tổ chức dƣới dạng cây phân hệ gồm: xƣơng cha, xƣơng con và xƣơng gốc. Trong đó:
* Xương gốc: Hay còn gọi là gốc của xƣơng. Trên cơ thể không có khái niệm xƣơng gốc, xong trong mô hình 3D để điều khiển đƣợc đối tƣợng, công cụ 3D đƣa ra khái niệm xƣơng gốc. Dựa vào xƣơng gốc ta có thể di chuyển toàn bộ đối tƣợng trong cấu trúc xƣơng.
* Xương cha: Thấp hơn xƣơng gốc. Nếu ta điều khiển xƣơng cha thì sẽ gây
ra chuyển động của các xƣơng khác.
* Xương con: Chịu điều khiển của các xƣơng khác, hay chính là Xƣơng cha.
Khi sử dụng cách này thì thƣờng có một số ƣu điểm và nhƣợc điểm sau: [11]
- Ƣu điểm: Ta có thể dễ dàng điều khiển các xƣơng một cách dễ dàng,
thƣờng chỉ phù hợp với những khung xƣơng đơn giản.
- Nhƣợc điểm: Tốn bộ nhớ, do để lƣu trữ đƣợc hai xƣơng ta cần lƣu tọa độ
vị trí của điểm đầu và điểm cuối của xƣơng. Trong khi sử dụng khớp nối tốn ít bộ nhớ hơn. Không phù hợp với những khung xƣơng phức tạp vì rất khó điều khiển.
+ Sử dụng các khớp nối:
Sử dụng các khớp nối để tạo cấu trúc khung xƣơng cho các đối tƣợng tiết kiệm bộ nhớ hơn hẳn xử dụng xƣơng. Trong cấu trúc khung xƣơng này thì chúng ta sẽ tạo các xƣơng trong khung xƣơng thông qua các khớp xƣơng (khớp nối). Khi đó
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
một xƣơng sẽ đƣợc coi là khoảng cách giữa hai khớp nối. Mỗi khớp nối này sẽ có một vị trí xác đinh trong không gian. Khi 2 khớp xƣơng đƣợc đặt tại vị trí mong muốn thì 1 đoạn xƣơng đƣợc tự động tạo ra giữa hai khớp xƣơng. Do đó, nếu chúng ta có 3 khớp xƣơng thì có 2 xƣơng đƣợc tạo ra.
Các điểm cần quan tâm khi tạo khung xƣơng:
- Cấu trúc khung xƣơng trong thực tế nhƣ thế nào? Bao gồm các khớp xƣơng, khoảng cách giữa các khớp ra sao?
- Phải xác định rõ ràng, đầy đủ các mục đích chuyển động của đối tƣợng. - Mối quan hệ giữa các khớp nối: Tƣơng tự nhƣ phƣơng pháp sử dụng xƣơng, trong phƣơng pháp này các khớp nối sự liên kết với 1 khớp duy nhất hoặc nhiều khớp, do đó để đơn giản thì thƣờng tổ chức mối quan hệ giữa các khớp nối dƣới dạng cây phân hệ gồm: khớp cha, khớp con, và khớp gốc. Trong đó:
Khớp gốc: Hay còn gọi là gốc của xƣơng. Trên cơ thể động vật không có khái niệm khớp xƣơng gốc, xong trong mô hình 3D để điều khiển đƣợc đối tƣợng, công cụ 3D đƣa ra khái niệm khớp xƣơng gốc. Dựa vào khớp gốc ta có thể di chuyển toàn bộ đối tƣợng.
Khớp cha: Thấp hơn khớp gốc. Nếu ta điều khiển khớp cha thì sẽ gây ra chuyển động của các khớp khác.
Khớp con: Chịu điều khiển của các khớp khác, hay chính là khớp cha. Tức là nó chuyển động không chỉ do chiụ sự tác động trực tiếp vào khớp mà còn do gián tiếp từ một khớp khác bị tác động.
Nhƣ vậy trừ khớp gốc và những khớp ở ngoài cùng thì các khớp còn lại vừa là khớp cha vừa là khớp con.
Khi tạo khung xƣơng cho đối tƣợng ta cần xác định điểm khớp gốc từ đó xác định các khớp con. Không có một quy tắc nhất định nào cho việc xác định khớp gốc, bởi vì các đối tƣợng trong tạo mô hình là rất đa dạng và phong phú, mỗi đối tƣợng có cấu trúc, đặc điểm chuyển động riêng. Tuỳ theo yêu cầu đặt ra mà xác định khớp gốc.
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
Một bộ khung xƣơng hoàn chỉnh sẽ thiết lập lên một cấu trúc thứ tự dạng cây theo quan hệ gốc - cành, cha - con.
Tuy nhiên ta hoàn toàn có thể xây dựng một khớp nối mà sử dụng cả xƣơng và khớp nối. Và khi nào dùng khớp nối và khi nào dùng xƣơng để tạo cấu trúc khung xƣơng cho một đối tƣợng? Đây là một câu hỏi khó, nó phụ thuộc vào từng bài toán nhất định tuy nhiên: [11]
- Sử dụng khớp nối: Tiết kiệm bộ nhớ, dễ dàng điều khiển và xây dựng các khung xƣơng phức tạp.
- Sử dụng xƣơng: Thì chỉ phù hợp với những bài toán có khung xƣơng đơn giản và ít điểm nối.
Tuy nhiên, ta có thể xây dựng một cấu trúc khung xƣơng sử dụng cả khớp nối và xƣơng.
+ Sử dụng khung xƣơng có sẵn:
Thƣờng đƣợc áp dụng khi tạo xƣơng ngƣời hay xƣơng động vật. Đối với các đối tƣợng dạng này, sử dụng khung xƣơng có sẵn sẽ giúp việc tạo xƣơng nhanh hơn. Và ta hoàn toàn có thể bổ xung thêm các xƣơng mới cho khung đã có sẵn.
Muốn sử dụng phƣơng pháp này đòi hỏi ngƣời lập trình phải hiểu biết và tìm hiểu về cấu trúc khung xƣơng thì mới có thể điều khiển sự chuyển động của nó một cách tốt nhất.
Do đó, tôi giả sử rằng tất cả các cấu trúc khung xƣơng của một đối tƣợng hoặc một chuỗi mà tôi sử dụng sau này đều đƣợc xây dựng tạo nên bởi các khớp nối.
2.5. Các kỹ thuật điều khiển chuyển động của xƣơng
Khi một phần của khung xƣơng chuyển động nó có thể làm các xƣơng liên quan đến phần đó chuyển động theo. Có hai kỹ thuật chính điều khiển sự chuyển động của đối tƣợng là :
- Điều khiển tiến FK (forward kinematics): Ta tác động đến thành phần
cao nhất của cấu trúc xƣơng để tạo chuyển động cho đối tƣợng.
- Điều khiển ngƣợc IK (inverse kinematics): Tác động đến thành phần thấp
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
2.5.1. Kỹ thuật điều khiển tiến FK (forward kinematics)
Kỹ thuật FK thƣờng đƣợc sử dụng để điều khiển chuyển động cho các cấu trúc hoặc mô hình liên kết. FK có một đặc điểm nổi bật là: kỹ thuật này bắt đầu điều khiển từ vị trí gốc của mô hình hoặc chuỗi liên kết sau đó xác định vị trí của tất các khớp nối thành phần trong các đối tƣợng tại một thời điểm đều đƣợc tính toán từ vị trí và hƣớng của gốc mô hình (hay là phần cao nhất của mô hình).
Khi sử dụng kỹ thuật điều khiển FK cần chú ý:
- Kỹ thuật này bắt đầu điều khiển từ vị trí gốc của mô hình hoặc chuỗi liên kết. Nên nó sẽ làm thay đổi vị trí của các thành phần liên quan. Nhƣ vị trí của các khớp con trong cấu trúc.
- Sự kế thừa những thay đổi về vị trí, sự xoay hoặc co dãn từ cha tới con. - Khi 2 đối tƣợng liên kết với nhau, đối tƣợng con duy trì vị trí, sự quay và sự co dãn của nó trong mối quan hệ tƣơng đối với đối tƣợng cha. Những thay đổi này là nhịp nhàng từ trụ của cha tới trụ của con. Ta có thể dịch chuyển, xoay hoặc co dãn.
- Đối tƣợng con kế thừa những thay đổi của cha nó, và đối tƣợng cha lại kế thừa những thay đổi từ đối tƣợng có cấp bậc cao hơn nó (tổ tiên).
- Tuy nhiên, với điều khiển FK, đối tƣợng con không bị cƣỡng ép việc liên kết với đối tƣợng cha. Ta có thể dịch chuyển, xoay hoặc co dãn đối tƣợng con độc lập với đối tƣợng cha.
Điều khiển tiến FK yêu cầu xoay mỗi khớp xƣơng lần lƣợt tới khi có đƣợc vị trí mong muốn cho một cảnh.
Ở trong hình, chân phải của chúng ta gồm 3 khớp: khớp thứ 1 là khớp bẹn (bên trên cùng) hay còn gọi là khớp gốc, khớp thứ 2 là khớp đầu gối, khớp thứ 3 là khớp cổ chân. Ba khớp này đƣợc liên kết với nhau tạo thành các xƣơng. Trong đó, khớp bẹn là khớp gốc và là cha của khớp thứ 2, khớp thứ 2 là con của khớp thứ 1 và là cha của khớp thứ 3.
Trạng thái đầu tiên: Là vị trí ban đầu của chân và quả bóng. Trạng thái thứ 2 là thực hiện xoay khớp gốc của chân một góc nhất định khi đó các khớp còn lại của
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
chân sẽ bị thay đổi so với vị trí ban đầu nhƣng vẫn duy trì vị trí tƣơng đối của nó với các khớp cha là chân vẫn duỗi thẳng. Trạng thái thứ 3, ta thực hiện gập khớp nối thứ 2 xuống (gập đầu gối lại). Trạng thái thứ 4 là quay khớp bàn chân để bàn chân tiếp xúc với quả bóng.
Để sử dụng kỹ thuật điều khiển tiến FK trong việc điều khiển các chuyển động của một đối tƣợng. Vấn đề chính của bài toán là xác định vị trí hƣớng của các khớp nối sau khi thực hiện một chuyển động có thể là quay hoặc tịnh tiến của khớp cha theo một cách xác định.
Có rất nhiều các nghiên cứu đƣa ra để tính toán vị trí, hƣớng của các khớp nối sau khi chuyển động nhƣ: Phƣơng pháp hình học đơn giản, Các Phƣơng pháp số, phƣơng pháp lặp,... Nhƣng kỹ thuật này chỉ phù hợp với chuyển động đơn giản còn đối với mô hình yêu cầu chuyển động phức tạp thì dùng FK sẽ là chậm không phù hợp gây cảm giác không uyển chuyển và chán nản, trong trƣờng hợp này FK đƣợc dùng để hỗ trợ cho IK. [10]
2.5.2. Kỹ thuật điều khiển ngược IK (inverse kinematics)
Kỹ thuật điều khiển ngƣợc IK là một kỹ thuật điều khiển các chuyển động cho một cấu trúc liên kết. Nhƣng ngƣợc với kỹ thuật FK. Kỹ thuật này thực hiện bắt đầu từ phần thấp nhất của cấu trúc để tạo chuyển động cho cả cấu trúc.
IK là một kỹ thuật cung cấp khả năng tƣơng tác cao và linh hoạt. Nó cho phép chúng ta không cần phải chuyển động tất cả các cấu trúc của hệ phân cấp và chỉ cần làm việc với điểm cuối cùng trong chuỗi sau đó thiết lập sự biến đổi cần thiết cho phần còn lại của chuỗi.
Nguyên tắc của kỹ thuật IK để giải quyết một vấn đề chuyển động là cung cấp một vị trí ban đầu trong không gian thế giới ảo (world space) và điểm kết thúc của một chuỗi liên kết (kết thúc phản ứng), xác định các phép quay cần phải đƣợc áp dụng cho các liên kết trong chuỗi theo một thứ tự để sau khi kết thúc chuỗi liên kết phải đạt đến mục tiêu (đích). Hay nói cách khác là xác định vị trí cuối cùng của các khớp nối trong chuỗi liên kết sau khi kết thúc các chuyển động, thông qua vị trí ban đầu và vị trí đích bởi các phép quay phù hợp.
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
IK là một cách trực quan của animating bởi vì nó là cách suy nghĩ truyền thống của chuyển động. Ví dụ, khi bạn muốn lấy một quả táo, bạn nghĩ về việc di chuyển tay của bạn để lấy táo (định hƣớng mục tiêu), sau đó di chuyển tay đến hƣớng quả táo và lấy nó. Và việc di chuyển tay ra sao là phụ thuộc hoàn toàn vào vị trí của mục tiêu trong không gian.
Hình 2.15: Sử dụng một giải pháp IK để làm cho bàn tay của một nhân vật đạt
Khi nào sử dụng IK và FK?
Kỹ thuật IK và FK, mỗi kỹ thuật có một ƣu điểm và nhƣợc điểm riêng. Vậy vấn đề đặt ra là khi nào sử dụng IK và FK? Câu trả lời ở đây là không có trƣờng hợp nào bắt buôc phải sử dụng IK và cũng nhƣ là bắt buộc phải sử dụng FK.
Tuy nhiên ta có thể so sánh tƣơng đối khi sử dụng kỹ thuật IK và FK nhƣ sau:
Kỹ thuật điều khiển tiến FK Kỹ thuật điều khiển ngƣợc IK
- Có thể điều khiển phép quay của một khớp nối đơn và giữ nguyên vị trí các khớp nối khác
- Chỉ cần di chuyển một đối tƣợng duy nhất để tạo chuyển động
- Không có một khớp nối con nào bị lật bất ngờ.
- Có thể giữ điểm end effector trong khi phần còn lại của cấu trúc thay đổi - Làm việc với nhiều khớp nối nhƣ dự kiến - Tuyệt vời khi điều khiển chuyển động
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
Trong một số các ứng dụng thời gian thực, các hành động của nhân vật đôi khi sẽ đƣợc tạo ra trƣớc khi chƣơng trình chạy. Do đó ta sẽ phải xác định hành động phù hợp nhất trong mỗi giai đoạn đặc biệt của ứng dụng. Nhƣng trên thực tế xuất hiện 1 vấn đề là, các ứng dụng của chúng ta có rất nhiều các thao tác, và ta không thể lƣu trữ hết tất cả các hành động để khi chạy chúng ta sẽ chọn sẵn trong đó. Vậy làm sao để giải quyết vấn đề này? Cách giải quyết sẽ là: chúng ta sẽ cung cấp một không gian địa phƣơng của 1 hành động, và lập trình để xác định các hƣớng của nhân vật thông qua không gian địa phƣơng đó, từ đó xác định vị trí cuối cùng của một hành động của nhân vật. Inverse Kinematics (IK) cung cấp cho ta giải pháp giải quyết vấn đề trên và có thể là một bổ sung hữu ích cho bất kỳ công cụ mã hóa mô hình 3D động nào.
Đối với kỹ thuật IK, vị trí của điểm cuối cùng trong chuỗi đƣợc biết đến, và chúng ta cần phải tìm các góc của các khớp nối. Đây là bài toán khó khăn hơn nhiều, có nhiều đáp án có thể có hoặc là có một tập hợp các các góc mà có thể đạt đến điểm đó hoặc là không có một tập hợp các góc nào thỏa mãn.
Có hai nhóm phƣơng pháp chính để giải quyết bài toán IK đó là:
Nhóm phƣơng pháp số: Phƣơng pháp này đòi hỏi rất nhiều các tính toán của đại số lƣợng giác hoặc ma trận
Nhóm các phƣơng pháp lặp: Phƣơng pháp này tốt hơn nếu có rất nhiều các liên kết và các loại khớp nối phức tạp.
Trƣớc khi tìm hiểu các giải pháp phức tạp tôi xin trình bày giải pháp đơn giản nhất cho trƣờng hợp đơn giản nhất có thể: