Cách kết hợp xoay theo 2 trục thành một ma trận


8

Tôi đã biết về các ma trận tôi phải sử dụng để thực hiện các phép quay. Nếu tôi phải xoay theo trục z và sau đó theo trục x, tôi sẽ thực hiện theo 2 bước. Câu hỏi của tôi là, có thể kết hợp cả hai phép quay thành một ma trận không? Tôi sẽ đánh giá cao phản hồi của bạn.

Câu trả lời:


8

(Câu trả lời này về cơ bản giống như của Stefan nhưng tôi muốn thêm một số chi tiết về vectơ hàng và cột và cách xác định bạn đang sử dụng cái nào.)

Vâng, điều này là có thể, nhưng các chi tiết phụ thuộc vào việc bạn biểu diễn các vectơ của mình dưới dạng hàng hay cột.

Vectơ cột

Nếu bạn đang sử dụng các vectơ cột , thông thường bạn sẽ biến đổi chúng bằng cách sử dụng trái các ma trận của bạn:

vector = mRotateZ * vector;
vector = mRotateX * vector;

Tất nhiên, bạn cũng có thể làm điều này trong một bước:

vector = mRotateX * mRotateZ * vector;

Nhưng phép nhân ma trận là kết hợp, điều đó có nghĩa là việc nhân nào được thực hiện trước tiên:

A * B * C = (A * B) * C = A * (B * C)

Vì vậy chúng tôi có thể viết

Matrix mRotate = mRotateX * mRotateZ;
vector = mRotate * vector;

Bây giờ chúng tôi đã tạo ra một ma trận duy nhất, tương đương với xoay vòng đầu tiênZthứ hai về X. Điều này khái quát tầm thường cho bất kỳ số lượng chuyển đổi. Lưu ý rằng các phép biến đổi được áp dụng từ phải sang trái.

Vectơ hàng

Mặt khác, nếu bạn đang sử dụng các vectơ hàng , thông thường bạn sẽ đúng -multiply ma trận của bạn:

vector = vector * mRotateZ;
vector = vector * mRotateX;

Một lần nữa, viết nó trong một bước, chúng ta nhận được

vector = vector * mRotateZ * mRotateX;

có thể được viết lại thành

Matrix mRotate = mRotateZ * mRotateX;
vector = vector * mRotate;

Lưu ý rằng trong trường hợp này, các phép biến đổi được áp dụng từ trái sang phải.


1
Tôi sẽ rất kiên quyết với nhận xét về sự kết hợp đó rất dễ hiểu lầm
joojaa

@joojaa Tôi không biết chính xác ý bạn là gì, nhưng tôi đã cố gắng làm rõ điều đó.
Martin Ender

Thật khó để một giáo dân tách biệt thứ tự betveen cho bạn nhân lên nhiều thứ và thứ tự các yếu tố được nhân lên.
joojaa

vì vậy họ không hiểu sự khác biệt giữa giao tiếp và giao hoán. vì vậy nếu bạn nói về thứ tự nhân, nhiều người có thể nghĩ về giao hoán
joojaa

6

Có, chỉ cần nhân chúng theo thứ tự ngược lại:

Matrix myrotation = Matrix.CreateRotationX(xrot) * Matrix.CreateRotationZ(zrot);

BIÊN TẬP. Câu trả lời của tôi chỉ áp dụng nếu bạn đang sử dụng vectơ cột. Xin vui lòng xem Martin Büttner câu trả lời chi tiết.


Tôi xin lỗi nhưng tôi không có ý tưởng. Bạn có ý nghĩa chính xác của "trật tự ngược" là gì?
JORGE

1
Nhân x với z thay vì z với x;
Stefan Agartsson

1
thực tế thứ tự là tùy ý người ta có thể mô hình hóa bằng cách sử dụng vectơ hàng và người ta có thể mô hình hóa vectơ cột. Việc tính toán kết quả giống nhau ở cả hai nhưng thứ tự nhân thay đổi. Nhưng vâng, đây là câu trả lời đúng.
joojaa

Joojaa, cảm ơn vì đã làm rõ điều đó! Ma trận hàng có nghĩa là thứ tự đảo ngược của phép nhân, điều đó có đúng không?
Stefan Agartsson

3

Từ toán học:

Có một phép đồng hình 2: 1 từ các bậc bốn đơn vị đến SO (3) (nhóm xoay vòng).

Điều này (về cơ bản) có nghĩa là:

  1. Mọi định hướng có thể được biểu diễn như một tứ
  2. Đệ tứ đại diện cho một vòng quay duy nhất
  3. Phép nhân của tứ phân tạo ra một bậc bốn (đóng) và tương đương với việc tạo các phép quay.
  4. Do đó, bất kỳ số lượng quay có thể được biểu diễn dưới dạng một vòng quay!

Nghĩ về điều đó. Bắt đầu từ không gian đối tượng, bạn có thể xoay đối tượng của mình thành bất kỳ hướng nào chỉ bằng một vòng quay duy nhất .


Tôi muốn chỉ ra rằng việc mang các bậc bốn trong không chỉ là toán học ngẫu nhiên. Ngược lại với các câu trả lời khác, cách tiếp cận được ưa chuộng trong đồ họa thực sự là đại diện cho các phép quay như là bậc bốn, vì chúng chiếm ít không gian hơn và nhanh hơn để kết hợp.

Có nhiều cách dễ dàng để chuyển đổi giữa ma trận xoay và bậc bốn, tùy thuộc vào việc bạn thích. Vấn đề là các phép quay các bậc bốn theo nghĩa toán học, do đó, các kết hợp của chúng cũng là các phép quay đơn.

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.