1 điểm bởi GN⁺ 2024-06-16 | 1 bình luận | Chia sẻ qua WhatsApp
  • Phép xoay 3D có những điểm mạnh khác nhau tùy theo cách biểu diễn, nên ma trận xoay thuận tiện cho biến đổi điểm, nhưng cần công cụ riêng cho nội suy, hợp thành và lấy trung bình
  • Euler angles dễ thao tác với con người, nhưng có thể gặp các vấn đề như gimbal lock, vận tốc góc không hằng, và nội suy tuyến tính bỏ lỡ đường đi ngắn nhất
  • Unit quaternion cung cấp nội suy đường đi ngắn nhất với tốc độ không đổi bằng slerp, nhưng vì không phải không gian vector nên việc trực tiếp tạo, nhân vô hướng hay lấy trung bình không trực quan
  • Ánh xạ mũ/log kết nối vector trục/góc với ma trận xoay để xây dựng nội suy đường đi ngắn nhất trong 2D·3D dưới dạng R(t) = exp(t log(R1 R0^-1)) R0
  • Trung bình của nhiều phép xoay có thể gặp catastrophic cancellation nếu chỉ lấy trung bình trục/góc đơn giản, còn Karcher mean lặp để tìm phép xoay tối thiểu hóa tổng bình phương khoảng cách góc, cho kết quả nhất quán hơn

Ưu và nhược điểm của từng cách biểu diễn phép xoay

  • Có nhiều cách biểu diễn phép xoay 3D, và lựa chọn phù hợp sẽ khác nhau tùy bạn muốn làm biến đổi, tạo nội dung, nội suy hay lấy trung bình
  • Ma trận xoay

    • Biểu diễn đại số tuyến tính trực tiếp nhất là ma trận trực chuẩn 3x3 có định thức dương
    • Ba cột của ma trận xoay cho biết các trục x, y, z sẽ đi tới đâu sau khi xoay
    • Biến đổi điểm có thể xử lý bằng phép nhân ma trận, và cũng có thể hợp thành với các biến đổi tuyến tính khác bằng phép nhân ma trận
    • Lý do dùng ma trận xoay khi vẽ lên màn hình là vì chỉ cần một phép nhân ma trận để đưa điểm từ world-space lên screen
    • Ma trận xoay không phải là không gian vector, nên cộng hai ma trận xoay lại không cho ra một ma trận xoay khác
    • Nội suy tuyến tính giữa hai ma trận xoay có thể trộn thêm cả scaling chứ không chỉ xoay
  • Euler angles

    • Euler angles chỉ định ba phép xoay quanh các trục x, y, z, còn được gọi là pitch, yaw, roll
    • Thứ tự áp dụng ba phép xoay thành phần thay đổi tùy quy ước, và ví dụ ở đây dùng thứ tự x, y, z
    • Chúng dễ hiểu với con người và thường được dùng để tạo chuyển động xoay, nhưng nội suy đơn giản có thể tạo ra kết quả không mong muốn
    • Gimbal lock, nơi một phép xoay thành phần làm hai trục xoay còn lại song song với nhau, là một dạng singularity
    • Ở singularity, thay đổi một trong hai góc bị khóa đều có thể tạo ra cùng một phép xoay đầu ra
    • Nếu đường nội suy chạm singularity thì số bậc tự do để biểu diễn vị trí hiện tại tăng lên, và việc chọn một biểu diễn tùy ý để nối tiếp có thể khiến nội suy đầu ra bị gián đoạn
    • Vì mỗi góc thành phần có tính cyclic, nội suy tuyến tính không phải lúc nào cũng chọn đường đi ngắn nhất giữa hai phép xoay
    • Nếu đường đi không đi qua singularity thì nội suy vẫn mượt, và nếu không cần biểu diễn “straight up” và “straight down” thì có thể né được giới hạn này
  • Quaternions

    • Unit quaternion là công cụ tiêu chuẩn cho hợp thành và nội suy phép xoay
    • Spherical linear interpolation, tức slerp, chọn đường đi ngắn nhất với tốc độ không đổi giữa hai quaternion
    • Unit quaternion cũng không phải là không gian vector, khó để con người trực tiếp tạo, và phép nội suy có thể tốn chi phí tính toán
    • Chúng cũng thiếu một khái niệm trực quan về nhân vô hướng hay lấy trung bình
    • Quaternion là double-cover của không gian xoay, nên trong một số trường hợp Q(1) có thể đi tới -Q1
  • Trục/góc

    • Phép xoay trục/góc được biểu diễn bằng một vector thực 3D
    • Hướng của vector chỉ trục xoay, còn độ lớn chỉ góc xoay quanh trục đó
    • Viết là θu, trong đó u là vector đơn vị và θ là góc xoay
    • Vì là vector 3D nên nó tạo thành không gian vector, có thể cộng, scale và nội suy
    • Nội suy tuyến tính giữa hai phép xoay trục/góc có thể cho chuyển động mượt với vận tốc góc không đổi
    • Tuy vậy, tùy theo cách chỉ định phép xoay đích bằng biểu diễn trục/góc, nội suy tuyến tính có thể không chọn đường đi ngắn nhất
    • Giống quaternion, vector trục/góc cũng là double-cover của không gian xoay

Ánh xạ mũ và ánh xạ log

  • Nếu có thể chuyển đổi qua lại giữa nhiều cách biểu diễn phép xoay theo đúng mục đích, ta có thể tận dụng đồng thời ưu điểm của từng cách
  • Vì biến đổi cuối cùng cần ma trận xoay nên lấy ma trận làm canonical form
  • Exponential map là hàm nhận một đối tượng xoay và trả về ma trận xoay tương đương
  • Logarithmic map là hàm nhận ma trận xoay và ánh xạ ngược lại về đối tượng xoay tương ứng
  • Ở đây ta xét các ánh xạ explog để đi qua lại giữa ma trận xoay và vector trục/góc

Trực giác bắt đầu từ trục/góc trong 2D

  • Trong 2D chỉ có một trục xoay duy nhất hướng ra khỏi mặt phẳng, nên phép xoay trục/góc có thể biểu diễn chỉ bằng góc θ
  • Điểm 2D p sau khi xoay một góc θ, ký hiệu , có thể viết như sau
    • pθ = p cosθ + Jp sinθ
    • J là ma trận xoay vector 2D đi 90 độ
  • J[[0, -1], [1, 0]], và vì J² = -I nên áp dụng hai lần tương đương xoay 180 độ
  • Khai triển biểu thức này sẽ thu được ma trận xoay 2D chuẩn [[cosθ, -sinθ], [sinθ, cosθ]]

Ánh xạ mũ và log trong 2D

  • Trong công thức Euler của số phức e^(iθ) = cosθ + i sinθ, i đóng vai trò quarter turn; trong công thức ma trận 2D, J đóng vai trò tương tự
  • Nếu đưa ma trận A = θJ vào Taylor series của hàm mũ, ta có thể thực hiện cùng phép tính bằng cộng ma trận, nhân ma trận và scaling
  • Kết quả khai triển xuất hiện Taylor series của sinθcosθ, từ đó nhận được công thức sau
    • e^(θJ) = [[cosθ, -sinθ], [sinθ, cosθ]]
  • Vì vậy, ánh xạ mũ trong 2D biến góc θ thành ma trận xoay tương ứng
  • Ánh xạ log được định nghĩa là hàm ngược của ánh xạ mũ
    • Nếu R = exp(θJ) thì log(R) = θJ
    • Có thể khôi phục θ bằng atan2(R21, R11)
  • Ánh xạ mũ không phải injective
    • exp(θJ) = exp((θ + 2π)J), thêm một vòng quay đầy đủ vẫn cho cùng một ma trận xoay
    • Ánh xạ log được định nghĩa để trả về góc nhỏ nhất tương ứng với ma trận xoay đó
    • atan2 hiện thực đúng định nghĩa này

Nội suy dựa trên exp/log

  • Có thể nội suy tuyến tính trực tiếp hai góc xoay 2D θ0, θ1, rồi tạo ma trận xoay từ đó
  • Nhưng nếu θ0θ1 cách nhau hơn π, cách này không phản ánh tính cyclic của góc và sẽ chọn đường đi dài
  • Nội suy dựa trên exp/log tính trực tiếp phép xoay dịch chuyển từ hai ma trận xoay R0, R1
    • R1 R0^-1 là phép xoay hoàn tác R0 trước rồi áp dụng R1
    • log(R1 R0^-1) cho biết góc nhỏ nhất để đi từ R0 sang R1
    • Scale phép xoay trục/góc đó theo t, rồi dùng exp đổi lại thành ma trận
  • Công thức nội suy cuối cùng là
    • R(t) = exp(t log(R1 R0^-1)) R0
    • R(0) = R0, R(1) = R1
  • Trong 2D có thể kiểm tra chênh lệch góc trực tiếp, nhưng cách này tổng quát lên 3D và không gian số chiều bất kỳ mà không cần sửa đổi

Trục/góc 3D và ma trận skew-symmetric

  • Trong 3D cũng có thể lấy lũy thừa mũ của θu để tạo ma trận xoay
  • Điểm mấu chốt là tìm được phép biến đổi quarter turn quanh trục là vector đơn vị u
  • Tích có hướng u × p được định nghĩa là vector vuông góc với mặt phẳng do up tạo ra, nhưng cũng có thể hiểu là quarter turn của p⊥, tức hình chiếu của p lên mặt phẳng vuông góc với u
  • Có thể tạo một ma trận û cho kết quả giống u × p
    • û = [[0, -uz, uy], [uz, 0, -ux], [-uy, ux, 0]]
    • ûp = u × p
  • ûᵀ = -û, û là một ma trận skew-symmetric
  • J trong 2D cũng là skew-symmetric và biểu diễn tích có hướng 2D, nên cùng một cấu trúc vẫn được duy trì
  • Tổng và tích vô hướng của các ma trận skew-symmetric vẫn là skew-symmetric, nên tính chất không gian vector của biểu diễn trục/góc cũng được giữ lại trong cách biểu diễn ma trận này
  • Đồng nhất thức û^(k+2) = -û^k xuất phát từ diễn giải hình học rằng áp dụng tích có hướng ba lần tương đương quay p⊥ ba quarter turn, tức bằng một quarter turn âm

Ánh xạ mũ 3D: công thức Rodrigues

  • Từ phép xoay trục/góc θu, tạo θû rồi lấy mũ để nhận được ma trận xoay 3D
  • Dùng Taylor series và û^(k+2) = -û^k, ta suy ra công thức sau
    • e^(θû) = I + sin(θ)û + (1 - cos(θ))û²
  • Công thức này được biết đến với tên Rodrigues’ formula
  • Nếu θ = 0 thì e^(0û)p = p, điểm được giữ nguyên
  • Nếu θ = π/2 thì được u × p + p∥, tức quarter rotation
  • Nếu θ = π thì được -p⊥ + p∥, tức half rotation
  • Ma trận này là trực chuẩn
    • Có thể kiểm tra điều kiện AᵀA = I bằng ûᵀ = -ûû^(k+2) = -û^k
  • Định thức của nó bằng 1 tại θ = 0, không có trường hợp định thức bằng 0, và vì exp liên tục theo θû nên định thức không thể âm
  • Do đó exp(θû) là một ma trận xoay 3D

Ánh xạ log 3D

  • Vì ánh xạ mũ 3D cũng không injective, ánh xạ log 3D được định nghĩa để trả về phép xoay trục/góc có độ lớn nhỏ nhất tương ứng với ma trận đã cho
  • Với R = exp(θû) = I + sin(θ)û + (1 - cos(θ))û², lấy trace sẽ suy ra được góc xoay
    • trace là tổng đường chéo
    • tr(I) = 3
    • û là skew-symmetric nên tổng đường chéo bằng 0
    • tr(û²) = -2
    • Vì vậy tr(R) = 1 + 2cosθ
    • θ = arccos((tr(R) - 1) / 2)
  • Trục xoay được khôi phục bằng cách antisymmetrize R
    • R - Rᵀ = 2 sin(θ)û
    • û = (R - Rᵀ) / (2 sinθ)
    • u = 1/(2 sinθ) [R32 - R23, R13 - R31, R21 - R12]ᵀ
  • Như vậy ánh xạ log đầy đủ để quay từ ma trận xoay 3D về trục/góc đã hoàn chỉnh

Kết quả nội suy trong 3D

  • Trong 3D cũng áp dụng nguyên vẹn công thức nội suy như trong 2D
    • R(t) = exp(t log(R1 R0^-1)) R0
  • Cách nội suy này giữ lại ưu điểm của phép xoay trục/góc đồng thời luôn chọn đường đi ngắn nhất
  • Với Euler angles, ví dụ tương tự có thể không cho cảm giác mượt như vậy

Trung bình của nhiều phép xoay

  • Dùng quaternion có thể cho nội suy tốt, nên bài toán nội suy có thể giải được ngay cả khi không dùng toán ma trận exp/log
  • Một công việc mà biểu diễn trục/góc làm dễ hơn là lấy trung bình của nhiều ma trận xoay
  • Cách đơn giản nhất là đổi từng ma trận sang trục/góc, lấy trung bình các vector, rồi đổi ngược lại
  • Cách này dùng được, nhưng có thể tạo ra hành vi không trực quan
  • Đặc biệt, khi cộng các vector trục/góc có thể xảy ra catastrophic cancellation
    • Ví dụ lấy trung bình [π, 0, 0][-π, 0, 0] sẽ cho ra 0
    • Hai giá trị này là cùng một phép xoay, nhưng kết quả trung bình là 0 lại không đại diện cho cả hai

Karcher mean

  • Trung bình điểm trên mặt phẳng có thể được xem là điểm làm nhỏ nhất tổng khoảng cách bình phương tới mọi điểm
  • Quy trình tìm nó bằng tối ưu lặp như sau
    • Chọn ước lượng ban đầu x̄ ∈ R²
    • Tính translation từ từng điểm tới ước lượng ui = xi - x̄
    • Tính trung bình vector u = (1/n) Σ ui
    • Dịch chuyển theo hướng trung bình bằng x̄ = x̄ + τu
    • Lặp lại khi |u| > ε
  • Có thể áp dụng cùng ý tưởng đó cho các phép xoay R0, ..., Rn
    • Chọn phép xoay ước lượng ban đầu R̄ ∈ R^(3×3)
    • Với mỗi ma trận, tính vector trục/góc từ ước lượng tới phép xoay đó: ui = log(Ri R̄^-1)
    • Tính trung bình vector u = (1/n) Σ ui
    • Di chuyển theo hướng xoay trung bình bằng R̄ = exp(τu) R̄
    • Lặp lại khi |u| > ε
  • Kết quả của thuật toán này là Karcher mean
  • Karcher mean là phép xoay làm nhỏ nhất tổng bình phương khoảng cách góc tới mọi phép xoay khác
  • Nó không bị catastrophic cancellation nên luôn hội tụ về một phép xoay trung gian khác 0
  • Kết quả của trung bình trục/góc đơn giản và Karcher mean thường khá giống nhau, nhưng Karcher mean cho hành vi nhất quán hơn

Quan hệ giữa quaternion và exp/log

  • Phần này giả định người đọc đã biết về quaternion
  • Tương tự việc phép mũ số phức tương đương với phép mũ của ma trận skew-symmetric 2D, phép mũ quaternion cũng tương đương với phép mũ của ma trận skew-symmetric 3D
  • Trong 2D, từ phép xoay trục/góc θ ta tạo số phức thuần ảo rồi lấy mũ
    • e^(iθ) = cosθ + i sinθ
    • Kết quả là một số phức mà khi nhân với điểm sẽ xoay nó đi θ
    • Vì luôn có norm bằng 1 nên phép xoay 2D có thể biểu diễn bằng số phức đơn vị
  • Trong 3D, từ vector xoay trục/góc u có thể tạo quaternion thuần ảo q = ux i + uy j + uz k
  • Dựa vào quy tắc nhân quaternion, ta có q² = -||q||² = -θ², khá giống với đồng nhất thức dùng cho ma trận skew-symmetric
  • Kết quả lấy mũ là
    • e^q = cosθ + (q/θ) sinθ
    • Công thức gần như giống hệt trong 2D, chỉ khác là có ba trục ảo thay vì một
  • Phép xoay trục/góc 3D vì thế được chuyển thành quaternion đơn vị
  • Nếu không cần ma trận xoay, ánh xạ mũ quaternion là một lựa chọn dễ tính toán
  • Ánh xạ log quaternion cũng đơn giản
    • θ = arccos(Re(q))
    • u = Im(q) / sinθ
  • Để xoay điểm p bằng quaternion q, ta tính phép liên hợp q p q^-1
    • Biểu diễn điểm bằng quaternion thuần ảo p = px i + py j + pz k
    • Về mặt kỹ thuật, phép liên hợp xoay quanh trục u một góc , nên ban đầu cần đặt |u| = θ/2

Đọc thêm

1 bình luận

 
GN⁺ 2024-06-16
Các ý kiến trên Hacker News
  • Sự tương ứng giữa nhóm Lie/đại số Lie là một trong những khái niệm thú vị nhất mà tôi ước gì đã được học ở trường. Nó chính là ánh xạ mũ và ánh xạ log được nói trong bài, nhưng xuất hiện dưới một dạng dễ tái sử dụng hơn nhiều
    Nếu nắm bắt một đối tượng trừu tượng mà ta muốn xử lý, như phép quay 3D, mà không bị cuốn vào chi tiết của tọa độ, đó là nhóm Lie; còn nếu từ đó dẫn ra một biểu diễn tọa độ hoạt động tốt, ta có đại số Lie tương ứng
    Khi đó, gần như tự nhiên ta có được cách chuyển qua lại giữa tọa độ và đối tượng trừu tượng, cách hợp thành chúng, v.v.; trong các trường hợp thường gặp trong kỹ thuật, nội suy và lấy trung bình cũng có thể được xử lý khá hợp lý
    Nếu có thể biểu diễn bài toán như một tổ hợp các nhóm Lie, việc tìm xem từng đại số là gì sẽ giúp tiết kiệm rất nhiều công sức so với tự làm trực tiếp
    Ở đây đối tượng cần có khái niệm biến đổi trơn và một chút cấu trúc bổ sung; quá trình chuyển qua lại đôi khi cũng gặp vấn đề về thành phần liên thông, nhưng đó cũng là lý do các kết quả đã biết rất đáng để mượn dùng

  • Một tuần dài gần kết thúc, và việc dùng thanh trượt để xoay con bò đúng là quãng nghỉ tôi cần

    • Vừa thấy một đống con số là mắt tôi đã mờ đi, nhưng con bò thì thật sự dễ thương
    • Có cảm giác rất hợp để làm thành một trò chơi vắt sữa iOS ít công sức
  • Từ lâu tôi đã không hài lòng việc nhiều phần mềm 3D không dùng giao diện Arcball cho phép quay
    Các sản phẩm của Autodesk như 3DSmax và Maya thì có dùng, nhưng Blender và OpenSCAD thì không; hồi làm ở Roblox tôi cũng không thuyết phục được PM vì lý do người dùng vẫn chịu được cách hiện tại
    Arcball dựa trên quaternion và dùng hàm mũ để nội suy; chỉ bằng một lần kéo có thể tạo ra bất kỳ phép quay nào, không có gimbal lock, và có tính chất là nếu kéo theo một vòng kín thì sẽ quay về vị trí ban đầu
    Điều này có thể chứng minh toán học từ việc quaternion đơn vị là phủ kép của SO(3), tương tự như số phức đơn vị biểu diễn chính xác phép quay trên đường tròn
    Bản triển khai tham khảo quaternion/Arcball có thể tự thử: https://romankogan.net/math/arcball_js/index.html
    Mã là Java có nhiều chú thích, chạy thư viện Processing trong JavaScript bằng ProcessingJS
    Bàn tay và cơ thể có thể hiểu quaternion trước cả bộ não, nên nếu bạn làm phần mềm 3D, tôi mong bạn dùng cách này
    Arcball: http://courses.cms.caltech.edu/cs171/assignments/hw3/hw3-not...
    Quaternion cho phép quay: https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotati...
    Arcball trong Processing: https://romankogan.net/math/arcball_js/index.html

    • Tôi thắc mắc vì sao khi kéo ở một điểm như phía bên phải thay vì ở giữa thì cảm giác tệ hơn nhiều. Có cảm giác bị vướng và đôi khi bị giật; nếu điểm chuẩn để tính phép quay thay đổi, tôi nghĩ ý nghĩa đó cần phải được thể hiện trực quan trên màn hình
    • Tôi tự hỏi liệu có thể làm cho nó hoạt động trên di động không
      Hiện tôi đang xem trên di động, và https://asliceofrendering.com/camera/2019/11/30/ArcballCamer... đã giúp tôi hiểu Arcball
  • Trong bối cảnh này, tôi không rõ vì sao mọi người lại thích quaternion đến vậy. Khó mà nói ma trận kém trực quan hơn quaternion
    Ma trận tác động lên vector, phép quay cũng tác động lên vector, vậy còn gì tự nhiên hơn việc xem phép quay là ma trận?
    Hàm mũ ma trận cũng trực quan nếu liên hệ với phương trình vi phân thường. Nghiệm của dx/dt = Axexp(t A), và nếu A phản đối xứng thì sự thay đổi của x luôn trực giao với x, nên nó trở thành phép quay không làm đổi độ dài
    Nhóm Lie/đại số Lie khái quát hóa điều này rất nhiều, nhưng điểm cốt lõi là tạo ra phép quay bằng cách liên tục sinh ra các biến đổi trực giao, và ánh xạ mũ mô tả quá trình đó. Hình dung này với tôi mang tính hình học và trực quan hơn nhiều

    • Bản thân quaternion cũng thường được biểu diễn bằng ma trận, như ma trận Pauli, và điều này được dùng rộng rãi trong mô hình hóa spin lượng tử
      Theo tôi, ưu điểm của quaternion là dễ xử lý bằng giấy bút hơn so với tính thủ công cùng một phép nhân ma trận
      Cá nhân tôi thấy nó trực quan theo nghĩa giống số phức. Ban đầu thì kỳ lạ, nhưng giờ đây tôi thấy dùng và suy luận với nó đơn giản hơn các lựa chọn thay thế mà tôi biết
    • Bài viết cũng đã giải thích lợi thế lớn của quaternion so với ma trận. Quaternion nội suy tốt, còn ma trận thì không
      Tính chất này rất quan trọng trong các công việc đồ họa như animation hoặc tính frame dọc theo các đường cong spline 3D
    • Xét từ góc độ tính toán, lợi thế của quaternion là chỉ dùng 4 con số thay vì 9 con số của ma trận 3x3, và khi áp dụng phép quay thì khối lượng phép toán cũng giảm tương tự
    • Ưu điểm cốt lõi của quaternion là hợp thành phép quay
      Tương tự như xử lý phép quay 2D bằng số phức: nhân hai số phức sẽ hợp thành các phép quay, và trong 2D điều đó tương ứng với việc cộng các argument. Cũng vậy, nhân hai quaternion có thể hợp thành các phép quay 3D, và hiệu quả hơn nhiều so với nhân ma trận 3x3
      Nói để tạo trực giác, quaternion có quan hệ mật thiết với biểu diễn trục-góc, vốn tương đương với đại số Lie so(3)
      Từ góc nhìn tác động lên vector, có thể xem nhiều cách tham số hóa phép quay là các triển khai của cùng một trait Rotation trừu tượng. Dù triển khai nội bộ là ma trận, quaternion, vector Euler, góc Euler hay vector Gibbs, phép quay đều tác động lên vector và được hợp thành theo cùng một cách
  • Quaternion đơn vị là một nhóm Lie; nếu muốn thứ gì đó có thể cộng tùy ý, thì cần xem xét đại số Lie của quaternion đầy đủ, thứ biểu diễn vận tốc quay. Nó tương đương với việc biểu diễn vận tốc quay bằng trục-góc
    So sánh quaternion đơn vị với trục-góc là hơi lệch phạm trù; sẽ phù hợp hơn nếu so sánh quaternion đơn vị với ma trận quay, và quaternion đầy đủ với trục-góc
    Dùng quaternion có lợi thế là có thể tính ánh xạ mũ dễ dàng, nhưng khi đã dùng quaternion thì gần như không cần ma trận quay. Như trong bài, có thể tính phép quay bằng pqp^-1
    Tôi nghĩ con đường dễ nhất để hiểu quaternion là đọc về đại số hình học. Mất hàng trăm năm để phát minh ra quaternion, nhưng nếu hiểu đại số hình học đơn giản đến đáng ngạc nhiên, bạn có thể tái phát minh quaternion chỉ trong vài phút
    Một bài viết tôi từng thấy là phần nhập môn tốt vài năm trước: https://crypto.stanford.edu/~blynn/haskell/ga.html

    • Khi nghĩ về phép quay, tôi vẫn cho rằng ánh xạ mũ là cách vững chắc nhất. Vì nó cho phép xử lý nhóm Lie của SO(3) một cách trực tiếp nhất, từ chuyển đổi tọa độ, vi phân cho đến không gian tiếp xúc
      Dù đi qua nhiều hình thức hóa khác nhau của đại số hình học, cuối cùng để biểu diễn không gian SO(3)/SE(3) ta vẫn dùng rotor và motor, vốn lần lượt đẳng cấu với quaternion và quaternion kép
      Nhưng nếu mục đích là vậy, tôi vẫn nghĩ ma trận quay 3x3 và ma trận biến đổi 4x4 kèm ánh xạ mũ hữu dụng hơn nhiều. Quaternion tốn ít bộ nhớ hơn và nhân với nhau cũng nhanh hơn, nhưng khi biến đổi điểm thì ma trận nhanh hơn; hiệu quả tổng thể còn tùy tình huống
    • Tôi tò mò “quaternion đầy đủ” ở đây có phải đang nói đến quaternion thuần ảo không
  • Một điều thú vị tôi học ở đại học là nếu định nghĩa lại toán tử + cho phù hợp với ma trận và lượng thay đổi trong không gian vector, và toán tử - cho phù hợp với hai ma trận, thì có thể đưa thẳng ma trận quay vào trạng thái bộ lọc Kalman
    Làm như vậy có thể ước lượng phép quay mà không phải lo về gimbal lock
    https://openslam-org.github.io/MTK

    • Tôi tò mò có phải ý là đặt không gian tiếp xúc của SO(2) làm trạng thái không
    • Việc triển khai toán tử + trong không gian tiếp xúc khá phổ biến không chỉ với bộ lọc Kalman mà còn trong tối ưu hóa phi tuyến nói chung. Thư viện Ceres cũng hỗ trợ LocalParameterization cho việc này
  • Bài thật sự hay, và không chỉ hay ở vài phần nhỏ
    Tôi đặc biệt thích việc cuối cùng các phương pháp này đều tính ra ma trận quay tiêu chuẩn. Nếu cần quay một triệu vector, chỉ cần làm phép tính thú vị một lần, rồi sau đó chạy pipeline nhân ma trận đã được tối ưu hóa cao

  • Blog rất hay, nhưng khi bấm vào hồ sơ tác giả để xem các bài khác, tôi thấy câu “lần đầu tiếp xúc với lập trình vào khoảng năm 2010, khi 9 tuổi”
    Tôi 13 tuổi vào năm 2010 và khi đó còn đang cố nhồi toán và khoa học bậc trung học vào đầu
    Mỗi khi đọc các bài viết hay về đồ họa máy tính, tôi lại có cảm giác tự ti nặng nề, như thể chúng được viết bởi ai đó trẻ hơn tôi và tài năng hơn tôi rất nhiều

    • Vẫn chưa muộn đâu. Trong vài năm gần đây tôi đã tự học một kỹ năng ngách, và có vẻ một tập đoàn lớn nào đó muốn trả tiền để dùng nó. Tôi khoảng 35 tuổi
      Tuy vậy tôi không giỏi đưa ra lời khuyên nên làm thế nào. Chỉ là tôi thật sự thích nó nên cứ tiếp tục làm. Dù vậy, những thứ như luyện tập có cấu trúc có lẽ cũng có khả năng hiệu quả
  • Khi tìm cách lấy trung bình của nhiều phép quay, tôi tìm thấy https://mathweb.ucsd.edu/~sbuss/ResearchWeb/spheremean/paper...
    Cách trong bài này, ít nhất ở trình độ toán của tôi, trông dễ hơn nhiều so với bài báo đó

    • Tôi tò mò về bối cảnh bạn muốn lấy trung bình của nhiều phép quay
      Trung bình là thao tác có thể làm bằng phép cộng, và với phép cộng thì thứ tự hợp thành không quan trọng. Nhưng phép quay không có tính giao hoán, nên khái niệm trung bình như ta thường hiểu không áp dụng nguyên xi được
      Cầm điện thoại, xoay màn hình 180° để hướng ra xa, rồi xoay 90° theo chiều kim đồng hồ so với mặt đất, camera sẽ hướng sang trái. Ngược lại, nếu thực hiện cùng hai phép quay đó theo thứ tự ngược lại, camera sẽ hướng sang phải
      Không có một đáp án duy nhất cho việc camera nên hướng về đâu trong “trung bình” của hai phép quay này; điều đó phụ thuộc vào các tính chất bạn muốn ở phép trung bình
    • Vài ngày trước tôi từng viết một bình luận hơi bên lề liên quan đến phép quay trên mặt phẳng. Trên mặt phẳng mọi thứ đơn giản hơn nhiều, và đặc biệt tiện nếu môi trường lập trình hỗ trợ phép toán số phức như tính năng hạng nhất
      https://news.ycombinator.com/item?id=40333541
      Trực giác cốt lõi là phép cộng là tịnh tiến, còn phép nhân là quay. Vì vậy với tịnh tiến trung bình ta có thể dùng trung bình cộng, còn với quay trung bình ta có thể dùng trung bình nhân
  • Tôi mất khá lâu mới nhận ra rằng trong toán học người ta cũng tạo ra trừu tượng hóa, tương tự như khi nghĩ về trừu tượng hóa trong kỹ nghệ phần mềm
    Hồi nhỏ tôi từng bối rối không hiểu vì sao lại tạo ra số ảo, và ma trận rốt cuộc có ý nghĩa gì
    Mãi về sau tôi mới biết những cách biểu diễn này là thứ được thiết kế ra. Khi tạo ra khái niệm số ảo, một số phép tính trở nên dễ hơn; khi viết hệ phương trình tuyến tính bằng ma trận, việc suy luận dễ hơn nhiều so với viết bung toàn bộ ra
    Nghe có vẻ hiển nhiên, nhưng không ai nói với tôi theo cách đó

    • Ngay cả khi học toán trừu tượng hơn, góc nhìn này vẫn tiếp tục đúng. Ví dụ nhóm là một interface, còn “một nhóm nào đó” có thể xem là một kiểu có phép toán triển khai ba tính chất/phương thức cần thiết
      Không gian vector, vành, không gian metric, phạm trù cũng vậy; toán học đầy những interface như các mẫu thiết kế
      Tuy nhiên interface trong toán học gần với type class hơn là kế thừa trong lập trình. Vì cùng một tập hợp/kiểu cũng có thể trở thành nhóm theo nhiều cách khác nhau