Chúng tôi đang 'vào chung kết' khi hoàn thành dự án, nhưng ngay trước khi triển khai hệ thống hoạt hình.
Khách hàng của chúng tôi đã quyết định chọn "Hoạt hình xương" - đó là tôi nên xuất từng Ma trận chuyển đổi (ma trận xoay4x4 + bản dịch) cho mọi khung hình và cho mọi xương mà đối tượng hoạt hình này có.
Các đối tượng trong trò chơi của chúng tôi được làm động bằng 3DS Max Physique Modifier, vì vậy chúng tôi sẽ có dữ liệu xương / trọng số trên mỗi đỉnh. Nhưng tôi sẽ đơn giản hóa mọi thứ ở đây chỉ để có một chút ánh sáng về chủ đề này.
Tôi muốn chia bài này thành 2 điểm, trong đó:
Xuất ma trận xương cho mọi khung
- xử lý về phương pháp chính xác để xuất các vị trí xương cho các mục đích hoạt hình sau này, trong đó tôi phải 'di chuyển' và 'xoay' mọi đỉnh bị ảnh hưởng bởi vị trí xương này sang vị trí xương ở khung X.
Tính toán vị trí đỉnh cuối cùng
- xử lý các hoạt động ma trận thích hợp để tính toán vị trí đỉnh mới theo sự biến đổi xương trong khung X.
1. XUẤT KHẨU VẬT LIỆU TIỀN THƯỞNG CHO MỌI KHUNG
Tôi có hiểu chính xác rằng trong khi xuất đối tượng hoạt hình tôi nên:
Lấy ma trận biến đổi BONE ở khung 0 và Đảo ngược ma trận này
Lấy ma trận chuyển đổi Bone tại FRAMEx
Nhân 1 * 2 để lấy phần bù chuyển đổi của Bones tại FRAMEx
[pseudocode]
// Animation export
// For each frame, export bone transformation offset
for(int iFrame = 0; iFrame < vFrames.size(); iFrame++)
{
// For every bone in the object
for(int iBone = 0; iBone < vBones.size(); iBone++)
{
// Grab transformation matrix for this bone at frame 0 and inverse it
Matrix3 matBoneMatrixAtStart = pNode->GetObjectTMAfterWSM( 0 );
matBoneMatrixAtStart.Inverse();
// Grab transformation matrix for this bone at frame iFrame
Matrix3 matBoneMatrixAtCurrentFrame = pNode->GetObjectTMAfterWSM( iFrame );
// Multiply Inversed Transformation Matrix of this bone at frame 0 - with
// current frame transformation matrix
Matrix3 matBoneTransformationOffset = matBoneMatrixAtStart
* matBoneMatrixAtCurrentFrame ;
// Save matBoneTransformationOffset - vertex will be multiplied by this
// matrix for animation purposes
fwrite(.....)
}
}
[/pseudocode]
Như vậy đã đủ chưa? Hoặc có một cái gì đó tôi đang thiếu ở đây?
2. TÍNH TOÁN CÁC VỊ TRÍ CHỨNG NHẬN MỚI (VỊ TRÍ VERTEX CUỐI CÙNG TẠI KHUNG X)
Sau này, khi kết xuất, các đỉnh đối tượng sẽ được nhân với ma trận biến đổi xương xuất khẩu cho khung hình động thực tế, và sau đó nhân với toàn bộ ma trận biến đổi mô hình này để đặt đối tượng vào đúng vị trí bên trong mức:
[pseudocode]
Update()
{
// The model transformation matrix describing the position of
// the model in the level
matModelTransformationMatrix
// Calculate new vertex position according to it's bone transformation offset
NewVertexPosition = (OriginalVertexPosition * matBoneTransformationOffset[iFrame])
* matModelTransformationMatrix;
// Increment the frame for testing purposes
iFrame++;
}
[/pseudocode]
Tôi có nghĩ đúng ở đây không? Vì vậy, có bù chuyển đổi xương cho khung X, nhân mọi đỉnh bị ảnh hưởng bởi xương này bằng bù này sẽ dẫn đến một đỉnh biến đổi chính xác như xương này phải không?