Trong một nỗ lực để giải quyết câu hỏi này , tôi quyết định tìm ra các hướng tuyệt đối (không gian thế giới) của mỗi khớp trong tư thế nguồn (như các vectơ đơn vị chuẩn hóa), và sau đó xoay các khớp của mục tiêu để khớp với hướng đó. Vấn đề là, làm thế nào để tôi tính toán bậc bốn xoay sao cho xương (vectơ từ khớp đến con của nó) theo hướng xác định trong không gian thế giới.
CẬP NHẬT: Đây là suy nghĩ hiện tại của tôi. Đối với mỗi xương, ma trận biến đổi sẽ là:
(1) absolute transform = local rotation * relative transform to parent in bind pose * parent absolute trasform
Vì vậy, giả sử chúng ta có 3 khớp: Vai -> Khuỷu tay -> Cổ tay. Chúng tôi đã có một biến đổi tuyệt đối cho Vai và đang cố gắng tính toán xoay cho Khuỷu tay sao cho Khuỷu tay -> Cổ tay sẽ đi theo hướng tương tự như trong hoạt hình nguồn. Từ (1), các phép biến đổi tuyệt đối sẽ là:
(2) ELBOW absolute = ELBOW local * SHOULDER to ELBOW relative * SHOULDER absolute
(3) WRIST absolute = WRIST local * ELBOW to WRIST relative * ELBOW absolute
Bằng cách thay thế, chúng tôi nhận được:
(4) WRIST absolute = WRIST local * ELBOW to WRIST relative * ELBOW local *
SHOULDER to ELBOW relative * SHOULDER absolute
Hằng số của chúng tôi là: ELBOW to WRIST relative
, SHOULDER to ELBOW relative
, và SHOULDER absolute
. WRIST local
sẽ chỉ bao gồm xoay vòng, không có bản dịch / tỷ lệ. Vấn đề là tìm một giá trị sao cho ELBOW local
...
(5) normalize(position(ELBOW absolute) - position(WRIST absolute)) = desired direction
(6) ELBOW local consists only of rotations (no translation/scale)
Bây giờ vì chúng ta đã biết chiều dài của xương và hướng mong muốn, có thể ước tính phần vị trí của WRIST absolute
, nhưng xoay sẽ không xác định được (và vấn đề này dường như không thể thực hiện đệ quy, AFAICT).
Suy nghĩ ban đầu của tôi là bởi vì WRIST local
chỉ xoay vòng và tôi sẽ giải quyết nó trong lần lặp tiếp theo của vòng lặp, tôi hoàn toàn có thể bỏ qua nó trong tính toán ELBOW local
. Câu trả lời của Steven Stadnick bên dưới cho thấy nó có thể không dễ dàng như vậy, vì sự định hướng của xương rất quan trọng đối với việc lột da. Tuy nhiên, nếu tôi có thể làm việc này trên một cây gậy, tôi có thể đi qua cây cầu đó sau.
M = inv(childRelative) * childAbsolute * inv(parentAbsolute) * inv(selfRelative)
như bạn làm với các phương trình ma trận như vậy? Các ma trận selfRelative và childRelative là gì? Cách thông thường mà người ta thực hiện chuyển đổi chuỗi là: childTransform = ParentToChild * ParentTransform . Các ma trận khác không rõ ràng trong mục đích của chúng là gì. Vấn đề là thú vị và nó có thể sẽ sưng lên để phá vỡ bí ẩn :).
elbow_local
giới thiệu 8 phương trình khác .. đó là 4 phương trình với 8 ẩn số .. Hãy xem xét sử dụng các chuỗi động học .. với ít độ tự do hơn. Bạn đã nghe nói về hội nghị Denavit-Hartenberg chưa? Tôi đã sử dụng nó với kết quả khá tốt