Kỹ thuật xoay được cải thiện theo cấp số nhân (2022)
(thenumb.at)- 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 đóulà 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ạ
expvàlogđể đ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
psau khi xoay một gócθ, ký hiệupθ, có thể viết như saupθ = p cosθ + Jp sinθJlà ma trận xoay vector 2D đi 90 độ
Jlà[[0, -1], [1, 0]], và vìJ² = -Inê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 = θJvà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θvàcosθ, từ đó nhận được công thức saue^(θ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ằngatan2(R21, R11)
- Nếu
- Ánh xạ mũ không phải injective
- Vì
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 đó
atan2hiện thực đúng định nghĩa này
- Vì
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
θ0vàθ1cá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,R1R1 R0^-1là phép xoay hoàn tácR0trước rồi áp dụngR1log(R1 R0^-1)cho biết góc nhỏ nhất để đi từR0sangR1- Scale phép xoay trục/góc đó theo
t, rồi dùngexpđổ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)) R0R(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 douvàptạo ra, nhưng cũng có thể hiểu là quarter turn củap⊥, tức hình chiếu củaplên mặt phẳng vuông góc vớiu - Có thể tạo một ma trận
ûcho kết quả giốngu × pû = [[0, -uz, uy], [uz, 0, -ux], [-uy, ux, 0]]ûp = u × p
- Vì
ûᵀ = -û,ûlà một ma trận skew-symmetric Jtrong 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) = -û^kxuấ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 quayp⊥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 saue^(θû) = I + sin(θ)û + (1 - cos(θ))û²
- Công thức này được biết đến với tên Rodrigues’ formula
- Nếu
θ = 0thìe^(0û)p = p, điểm được giữ nguyên - Nếu
θ = π/2thì đượcu × 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 = Ibằngûᵀ = -ûvàû^(k+2) = -û^k
- Có thể kiểm tra điều kiện
- Đị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ìexpliên tục theoθvàû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 0tr(û²) = -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
RR - 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]và[-π, 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
- Ví dụ lấy trung bình
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| > ε
- Chọn ước lượng ban đầ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| > ε
- Chọn phép xoay ước lượng ban đầ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 ảoiθ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
ucó thể tạo quaternion thuần ảoq = 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
pbằng quaternionq, ta tính phép liên hợpq 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
umột góc2θ, nên ban đầu cần đặt|u| = θ/2
- Biểu diễn điểm bằng quaternion thuần ảo
Đọc thêm
- Tài liệu học quaternion có thể xem tại quaternions của eater.net
- Lý do geometric algebra trực quan hơn được trình bày trong bài viết của Marc ten Bosch
- Nếu học về SO(3), tức cấu trúc đại số của phép xoay 3D, sẽ dễ hiểu hơn về trục/góc, quaternion và quan hệ double-cover
- Có một video giải thích trực quan mối quan hệ giữa SO(3), SU(2), quaternion và trục/góc
- Trang Wikipedia về SO(3) trình bày trục/góc, topology, SU(2), quaternion và mối liên hệ với Lie algebra
- Không gian vector của các ma trận skew-symmetric tạo thành so(3), là Lie algebra tương ứng với
SO(3)
1 bình luận
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
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
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 = Axlàexp(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àiNhó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
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
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
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
Rotationtrừ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áchQuaternion đơ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^-1Tô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
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
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 KalmanLà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
+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ợLocalParameterizationcho việc nàyBà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
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 đó
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
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 đó
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