tính toán vị trí đỉnh mới cho một ma trận biến đổi?


7

Làm cách nào tôi có thể nhận được vị trí mới của đỉnh của mình với ma trận biến đổi 4 x 4 hoặc chỉ đơn giản là 9 số float (vị trí X, vị tríY, vị tríZ, rotationH, rotationP, rotationR, scaleX, scaleY, scaleZ)? Thông thường tôi có thể gán ma trận cho lưới cuối cùng của mình (hoặc "nút" hoặc "đối tượng" hoặc "geom"), nhưng ngay bây giờ tôi cần phải thực hiện thủ công.

Câu trả lời:


5

Để áp dụng ma trận biến đổi 4 x 4 chung cho một đỉnh được biểu thị dưới dạng vectơ 3 chiều, bạn cần phải:

  1. Mở rộng vectơ vào chiều thứ 4 bằng cách thêm 1 làm thành phần w:

    (x, y, z) => (x, y, z, 1)

  2. Nhân ma trận biến đổi với vectơ 4 chiều ở trên. Kết quả sẽ là một vectơ 4 chiều khác:

    ( 4x4 matrix ) * (x, y, z, 1) => (tx, ty, tz, w)

    Công thức chung để nhân ma trận 4 x 4 với vectơ 4x1 là (nếu tôi không làm hỏng):

    [ m11 m12 m13 m14 ][ x ]   [ m11 * x + m12 * y + m13 * z + m14 * w ]
    [ m21 m22 m23 m24 ][ y ]   [ m21 * x + m22 * y + m23 * z + m24 * w ]
    [ m31 m32 m33 m34 ][ z ] = [ m31 * x + m32 * y + m33 * z + m34 * w ]
    [ m41 m42 m43 m44 ][ w ]   [ m41 * x + m42 * y + m43 * z + m44 * w ]
    

    Hoặc nếu bạn xem xét cấu hình thông thường của ma trận biến đổi:

    [ m11 m12 m13 px ][ x ]   [ m11 * x + m12 * y + m13 * z + px ]
    [ m21 m22 m23 py ][ y ]   [ m21 * x + m22 * y + m23 * z + py ]
    [ m31 m32 m33 pz ][ z ] = [ m31 * x + m32 * y + m33 * z + pz ]
    [ 0   0   0   1  ][ 1 ]   [ 1 ]
    
  3. Chuyển đổi nó trở lại chiều thứ 3 bằng cách đồng nhất hóa vectơ, tức là chia mọi thứ cho thành phần thứ tư w:

    (tx, ty, tz, w) => (tx/w, ty/w, tz/w)

    Vấn đề là nếu ma trận biến đổi của bạn chỉ thực hiện một bản dịch / xoay / tỷ lệ đơn giản, giá trị của wsẽ là 1 và bạn chỉ có thể bỏ thành phần thứ tư vì nó sẽ giống như chia cho 1.

    Nhưng thật tốt khi nhớ rằng việc thả thành phần w không hoạt động cho mọi trường hợp, ví dụ với ma trận chiếu bạn phải nhớ để thực hiện bước thứ ba này.


2
Sẽ không hại gì nếu bạn thêm rằng đây là cách bạn nhân cho một điểm được biểu thị dưới dạng cột, cho một hàng đầu tiên bạn viết vectơ sau đó là ma trận, cũng như nếu bạn muốn nhân nhiều ma trận bạn sắp xếp nó theo cách sao cho trong phương trình, ma trận gần nhất với vectơ được áp dụng trước tiên, thật tốt khi nói điều này bởi vì một số thư viện coi các điểm là hàng và một số là cột và bạn phải phân biệt để bạn áp dụng ma trận đúng cách, nếu bạn sẽ đi từ biểu diễn cột sang hàng, bạn phải hoán chuyển ma trận biến đổi
dreta

1
@dreta Tôi đã suy ngẫm về một số điểm đó. Tôi có thể thêm nó nhưng tôi nghĩ rằng nhận xét của bạn đã làm rất tốt trong việc bao quát tất cả các cơ sở, vì vậy tôi đã nâng cấp nó thay vào đó: P
David Gouveia

1

Phép nhân vectơ ma trận:

[ rxx rxy rxz px ] [ vx ]   [ vx' ]
[ ryx ryy ryz py ] [ vy ]   [ vy' ]
[ ryx ryy ryz pz ] [ vz ] = [ vz' ]
[   0   0   0  1 ] [  1 ]   [  1  ]

Xem trang trên wikipedia để biết thêm


Vì vậy, nhân từng thành phần vector với cột ma trận tương ứng và bỏ qua hàng cuối cùng?
ioa

Không, bạn làm phép nhân ma trận giống như trong toán học. Ví dụ: vx'thuật ngữ được tính như thế nàyvx' = rxx * vx + rxy * vy + rxz * vz + px
Mihai Maruseac

Được chứ. Tôi hy vọng bạn không phiền tôi chấp nhận câu trả lời trên. Tôi nghĩ rằng nó sẽ có nhiều thông tin hơn cho những người khác là tốt.
ioa

Tất nhiên, nó được viết sạch sẽ hơn, nó xứng đáng với điều đó :)
Mihai Maruseac
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.