Làm cách nào tôi có thể xoay về một điểm tùy ý trong 3D (thay vì gốc)?


15

Tôi có một số mô hình mà tôi muốn xoay bằng cách sử dụng bậc bốn theo cách thông thường, ngoại trừ thay vì xoay về nguồn gốc, tôi muốn nó được bù nhẹ. Tôi biết rằng bạn không nói, trong không gian 3d, bạn xoay quanh một điểm; bạn nói bạn xoay quanh một trục. Vì vậy, tôi đang hình dung nó như xoay quanh một vectơ có đuôi được định vị không ở gốc địa phương.

Tất cả các phép biến đổi affine trong công cụ kết xuất / vật lý của tôi được lưu trữ bằng SQT (thang đo, bậc bốn, dịch thuật; một ý tưởng mượn từ cuốn sách Kiến trúc công cụ trò chơi .) Vì vậy, tôi xây dựng một ma trận mỗi khung hình từ các thành phần này và chuyển nó sang trình tạo bóng đỉnh. Trong hệ thống này, dịch thuật được áp dụng, sau đó chia tỷ lệ, sau đó xoay vòng.

Trong một trường hợp cụ thể, tôi cần dịch một đối tượng trong không gian thế giới, chia tỷ lệ và xoay nó về một đỉnh không tập trung tại điểm gốc cục bộ của đối tượng.

Câu hỏi: Với các ràng buộc của hệ thống hiện tại của tôi được mô tả ở trên, làm thế nào tôi có thể đạt được một vòng quay cục bộ tập trung vào một điểm khác với điểm gốc? Tự động upvote cho bất cứ ai có thể mô tả cách thực hiện điều này bằng cách chỉ sử dụng ma trận :)


Đệ tứ đã mô tả một vòng quay về một trục tùy ý; Bạn có gặp vấn đề khi xây dựng một bộ tứ như vậy từ dữ liệu bạn có không?
Martin Sojka

3
Nghiêm túc mà nói, những người upvote câu trả lời thực sự đọc chúng ? Tôi đã đưa ra một phương pháp, một công thức hiệu quả và thậm chí là một cuộc biểu tình. Tuy nhiên, câu trả lời duy nhất được nêu lên, trong khi cung cấp một số thông tin có giá trị (và cả một số thông tin sai rõ ràng), không có tính năng nào trong số này và thậm chí không trả lời câu hỏi!
sam hocevar

@MartinSojka, đây là điểm và tùy ý, không phải là trục tùy ý.
thịt

@SamHocevar Cả hai câu trả lời của bạn đều hữu ích. Tôi đã chọn của bạn bởi vì nó kỹ lưỡng hơn và giúp tôi đi đến một giải pháp. Cảm ơn cả hai người.
thịt

À, xin lỗi - tôi đã nhầm lẫn với Dual Quancyions (những người giúp bạn dịch "miễn phí"). Tôi sẽ viết lên những gì tôi muốn nói trong câu trả lời sau; có lẽ những người khác sẽ thấy nó hữu ích, đặc biệt vì bạn có thể giảm ba thành phần của mình xuống chỉ còn một - mặc dù phức tạp hơn một chút.
Martin Sojka

Câu trả lời:


17

Nói ngắn gọn

Bạn chỉ cần thay đổi T trong mẫu SQT của bạn.

Thay thế vectơ dịch vbằng v' = v-invscale(p-invrotate(p))vị trí vcủa vectơ dịch ban đầu, plà điểm xung quanh mà bạn muốn xoay vòng xảy ra invrotateinvscalelà nghịch đảo của xoay và tỷ lệ của bạn.

Trình diễn nhanh

Hãy plà điểm xung quanh mà bạn áp dụng xoay vòng r. Hãy slà các tham số tỷ lệ và vvector dịch của bạn. Việc chuyển đổi ma trận cuối cùng là T(p)R(r)T(-p)S(s)T(v)thay vì R(r)S(s)T(v).

Những gì bạn muốn là thông số chuyển đổi mới v', r's'như vậy việc chuyển đổi ma trận cuối cùng là R(r')S(s')T(v')và chúng ta có:

T(p)R(r)T(-p)S(s)T(v) = R(r')S(s')T(v')

Hành vi ở vô cực chỉ ra rằng các tham số xoay và tham số tỷ lệ không thể thay đổi (điều này có thể được chứng minh). Do đó, chúng tôi có r = r's = s'. Do đó v', tham số bị thiếu duy nhất là vectơ dịch mới của bạn:

T(p)R(r)T(-p)S(s)T(v) = R(r)S(s)T(v')

Nếu các ma trận này bằng nhau, nghịch đảo của chúng bằng nhau:

T(-v)S(-s)T(p)R(-r)T(-p) = T(-v')S(-s)R(-r)

Điều này đặc biệt đúng với nguồn gốc O:

T(-v)S(-s)T(p)R(-r)T(-p)O = T(-v')S(-s)R(-r)O

Thu nhỏ và xoay gốc tọa độ mang lại gốc, do đó, có được:

T(-v)S(-s)T(p)R(-r)(-p) = -v'

v'là vectơ dịch mới mà bạn đang tìm kiếm cho phép bạn lưu trữ chuyển đổi của mình ở dạng SQT. Có lẽ có thể đơn giản hóa việc tính toán; nhưng ít nhất dung lượng lưu trữ yêu cầu không tăng.


Cảm ơn đã giải thích. BTW, bạn có biết bất kỳ tài nguyên nào mà tôi có thể đọc thêm về các thủ thuật đại diện SQT không?
pachanga

Sửa lỗi cho tôi nếu tôi sai nhưng có vẻ như một giải pháp khác là lưu trữ Đệ tứ của bạn như bình thường và nếu bạn cần tính toán dịch xung quanh một điểm / trục tùy ý, sau đó xây dựng ma trận Q kèm theo, chỉ cần trích xuất vectơ dịch từ ma trận này (cột cuối cùng, thường) và thêm nó vào các đối tượng Dịch vector, sau đó loại bỏ ma trận tạm thời của bạn.
johnbakers

15

Tất cả các công thức quay chính tắc được sử dụng để lấy ma trận xoay của bạn là để xoay quanh gốc tọa độ. Thay vào đó, nếu bạn muốn áp dụng xoay vòng đó quanh một điểm cụ thể, trước tiên bạn phải bù gốc - hoặc, tương đương, di chuyển đối tượng sao cho điểm bạn muốn xoay là ở điểm gốc.

Trước tiên hãy xem xét trường hợp 2D, vì nó đơn giản hơn và quy mô kỹ thuật. Nếu bạn có một khối có chiều rộng 2 tập trung vào gốc tọa độ và bạn muốn xoay nó 45 độ về tâm của nó, đó sẽ là một ứng dụng tầm thường của ma trận xoay 2D .

Nhưng nếu thay vào đó, bạn muốn xoay nó quanh góc trên bên phải (nằm ở 1,1) trước tiên bạn phải dịch nó để góc đó ở gốc. Điều này có thể được thực hiện với một bản dịch của -1,-1. Sau đó, bạn có thể xoay đối tượng như trước, nhưng bạn phải theo dõi điều này bằng cách dịch nó trở lại (bởi 1,1). Vì vậy, nói chung, để đạt được ma trận xoay Rcho một vòng quay rvề điểm Pbạn làm:

R = translate(-P) * rotate(r) * translate(P)

tương ứng trong đó translaterotatelà ma trận dịch / xoay chính tắc. Khi điều đó xảy ra, tỷ lệ này không đáng kể so với 3D, ngoại trừ việc phải cung cấp một trục cho phép quay - bạn luôn có thể chọn ma trận xoay trục X, Y hoặc Z chính tắc, nhưng điều đó sẽ rất buồn tẻ. Bạn sẽ muốn sử dụng ma trận xoay góc tùy ý . RDo đó, trận chung kết 3D của bạn là như vậy:

R = translate(-P) * rotate(a,r) * translate(P)

trong đó amột vectơ đơn vị đại diện cho trục quay và Pbây giờ là một điểm 3D trong không gian mô hình đại diện cho điểm xoay.

Khi điều đó xảy ra, các bậc bốn có thể được chuyển đổi thànhtừ các biểu diễn ma trận, vì vậy bạn có thể thực hiện phép nối của mình theo cách mà bạn nên chọn. Hoặc bạn chỉ có thể để mọi thứ như ma trận (tứ phương có một số lợi thế tốt như dễ dàng nội suy theo kiểu lành mạnh, nhưng liệu bạn có cần điều đó hay không là tùy thuộc vào bạn).

Cũng thế:

Vì vậy, tôi đang hình dung nó như xoay quanh một vectơ có đuôi được định vị không ở gốc địa phương.

Nói một cách chính xác, trong khi các vectơ có thể được sử dụng để biểu diễn các vị trí bằng cách coi chúng là các chuyển vị từ một nguồn gốc, thì vectơ không có vị trí nên sẽ hơi bất thường khi hình dung một vị trí như vậy.


Cảm ơn, đây là một trả lời tốt. Nó không phù hợp với các ràng buộc của hệ thống của tôi mặc dù. Tôi nên đưa vào câu hỏi của mình, "có thể thực hiện điều này với những hạn chế này không?" Và tôi nghĩ câu trả lời là không, vì điều này đòi hỏi hai bản dịch và tôi chỉ cung cấp cho một bản dịch. Đây có phải là một thiếu sót không thể tránh khỏi của việc sử dụng SQT như là một đại diện cho các biến đổi affine?
thịt

Nó phù hợp hoàn hảo trong các ràng buộc của bạn. Ma trận R (được sản xuất dưới dạng dịch-xoay-dịch-trở lại) là ma trận xoay vòng của bạn. Thay thế Q bằng R trong hệ thống "SQT" của bạn để bạn có mô hình dịch xoay-tỷ lệ phổ biến hơn, và bạn đã hoàn thành. Bản dịch cuối cùng đó độc lập với hai bản dịch trung gian được thực hiện để tạo ra vòng quay mong muốn.

Bạn đang đề xuất tôi thay thế tứ phương bằng một ma trận? Đó là thêm 12 byte cho mỗi đối tượng (8 nếu tôi lưu trữ dưới dạng ma trận 4x3)! Tuy nhiên, tôi sẽ làm cho người lạc quan im lặng và quay cuồng. (Điều đó thực sự có thể thậm chí sẽ không tăng thêm 2kb dấu chân ...) Cảm ơn câu trả lời của bạn.
thịt

Bạn có thể - bạn cũng có thể chuyển đổi giữa chúng, xây dựng bộ tứ xoay theo cách đó và cắm lại vào hệ thống hiện tại của bạn.

1
@SamHocevar: Ngoài ra, bất kỳ sự kết hợp nào của chúng có thể được thể hiện dưới dạng một ốc vít .
Martin Sojka
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.