Tôi đang viết thư cho nhà nhập khẩu COLLADA của riêng tôi. Tôi đã nhận được khá xa, tải mắt lưới và vật liệu và như vậy. Nhưng tôi đã đánh một hình ảnh động, đặc biệt là: xoay vòng.COLLADA: Đảo ngược ràng buộc đặt ra trong không gian sai?
Công thức Tôi đang sử dụng cho skinning mắt lưới của tôi là thẳng về phía trước:
weighted;
for (i = 0; i < joint_influences; i++)
{
weighted +=
joint[joint_index[i]]->parent->local_matrix *
joint[joint_index[i]]->local_matrix *
skin->inverse_bind_pose[joint_index[i]] *
position *
skin->weight[j];
}
position = weighted;
Và như xa như các tài liệu có liên quan, đây là công thức chính xác. Bây giờ, COLLADA chỉ định hai loại phép quay cho các khớp: cục bộ và toàn cục. Bạn phải ghép các vòng xoay với nhau để có được phép biến đổi cục bộ cho khớp.
Tài liệu COLLADA không phân biệt được giữa vòng quay địa phương của khớp và vòng xoay toàn cầu của khớp. Nhưng trong hầu hết các mô hình tôi đã thấy, các phép quay có thể có id là rotate
(toàn cầu) hoặc jointOrient
(cục bộ).
Khi tôi bỏ qua vòng quay toàn cục và chỉ sử dụng các phép quay cục bộ, tôi có được tư thế liên kết cho mô hình. Nhưng khi tôi thêm phép quay toàn cầu vào sự biến đổi cục bộ của khớp, những điều kỳ lạ bắt đầu xảy ra.
Đây là mà không sử dụng phép quay toàn cầu:
Và đây là với phép quay toàn cầu:
Trong cả hai ảnh chụp màn hình tôi đang vẽ bộ xương bằng đường nét, nhưng trong đầu tiên nó là vô hình bởi vì các khớp nằm bên trong lưới. Trong ảnh chụp màn hình thứ hai các đỉnh là tất cả các nơi!
Để so sánh, đây là những gì các ảnh chụp màn hình thứ hai nên trông giống như:
Thật khó để nhìn thấy, nhưng bạn có thể thấy rằng các khớp đang ở vị trí chính xác trong ảnh chụp màn hình thứ hai.
Nhưng bây giờ điều kỳ lạ. Nếu tôi bỏ qua các ràng buộc nghịch pose theo quy định của COLLADA và thay vào đó lấy nghịch đảo của phụ huynh của doanh địa phương chuyển đổi lần của doanh địa phương chuyển đổi, tôi nhận được như sau:
Trong ảnh chụp màn hình này tôi vẽ một dòng từ mỗi đỉnh đến các khớp có ảnh hưởng. Thực tế là tôi nhận được ràng buộc đặt ra không phải là quá xa lạ, bởi vì công thức lúc này là:
world_matrix * inverse_world_matrix * position * weight
Nhưng nó dẫn tôi để nghi ngờ rằng ràng buộc ngược COLLADA của pose là trong không gian sai.
Vì vậy, câu hỏi của tôi là: trong không gian nào COLLADA xác định tư thế ràng buộc nghịch đảo của nó? Và làm thế nào tôi có thể biến đổi ràng buộc nghịch đảo đặt ra không gian tôi cần?
Bạn đã đọc phần "Skinning a Skeleton in COLLADA" của thông số 1.4.1 chưa? Công thức của bạn trông giống như – jterrace