(91) 350-9520 support@omarine.org M-F: 7 AM - 7 PM; Weekends: 9 AM - 5 PM

Môi trường lập trình Android, phần 1: Lập trình OpenGL ES, bài 1: Các ma trận biến đổi, mục 1: Ma trận biến đổi mô hình (modeling transformation matrix)

Lập trình đồ họa ba chiều cho Android với Android Studio cần áp dụng các kỹ thuật OpenGL ES – một giao diện phần mềm tới phần cứng đồ họa với năng lực gia tốc bộ xử lý đồ họa (graphics processing units – GPUs).

cube

OpenGL ES (“Open Graphics Library for Embedded Systems”) hay GLES là một bộ phận của OpenGL được thiết cho các hệ thống nhúng và do đó bao gồm cả điện thoại thông minh.

OpenGL ES là “Triển khai rộng lớn nhất về giao diện lập trình ứng dụng đồ họa 3D trong lịch sử”.

Các chặng biến đổi đỉnh (vertex transformations)

Hình dạng của đối tượng 3 chiều được xác định dựa trên các đỉnh. Giữa các đỉnh là các mảnh (fragment) được nội suy. Các đỉnh của đối tượng được biến đổi tọa độ qua các không gian nhờ vào các ma trận tương ứng. Có 4 bước biến đổi và 6 hệ tọa độ

  • Hệ tọa độ đối tượng/mô hình (object/model coordinates): Khi thiết kế đối tượng như nhân vật trong game, các đỉnh của đối tượng có tọa độ mô hình, thường gốc tọa độ đặt tại tâm của đối tượng. Sau đó các tọa độ được biến đổi sang không gian toàn cảnh với biến đổi mô hình (modeling transformation, world transformation) với ma trận Mobjectworld
  • Hệ tọa độ toàn cảnh (world coordinates): Trong không gian này, các đối tượng được đặt vào vị trí trong cảnh do người lập trình quy định. Tiếp theo, quang cảnh phải được nhìn thấy bởi người chơi dưới góc độ quan sát của họ. Điều đó được thực hiện bởi biến đổi view hay camera (viewing/camera transformation), với ma trận Mworldview
  • Hệ tọa độ view (view/eye/camera coordinates): Xác định bởi gốc tọa độ đặt tại mắt người quan sát, một hướng ngắm (nhìn vào tâm điểm nào) và một hướng lên trên (up, một hướng khởi tạo để qui định đầu người quan sát hướng về phía nào trong không gian toàn cảnh). Các cảnh vật 3D rồi cũng phải hiển thị trên màn ảnh 2D. Do đó cần có biến đổi phép chiếu (projection transformation) với ma trận Mprojection
  • Hệ tọa độ clip (clip coordinates): Biến đổi phép chiếu thực hiện cắt và giới hạn cảnh xem vào một hình chóp cụt, thường xác định bởi: góc nhìn theo chiều thẳng đứng (fovy – field of view in y direction), tỉ lệ màn hình (hay cửa sổ chương trình), tỉ lệ này xác định góc nhìn ngang, mặt phẳng clip gần và mặt phẳng clip xa. Về nguyên lý, phép chiếu phải ánh xạ tọa độ camera vào tọa độ màn ảnh trong các khoảng [-1,1]. Tuy nhiên, biến gl_Position của OpenGL chỉ nhận tọa độ clip. Việc chuẩn hóa tọa độ được thực hiện bên trong bởi OpenGL qua phép chia phối cảnh (perspective division). Chúng ta sẽ xem chi tiết vấn đề này trong các phần sau.
  • Hệ tọa độ thiết bị chuẩn hóa (ndc – normalized device coordinates): OpenGL thực hiện chuẩn hóa tọa độ bằng cách chia các tọa độ thành phần của biến gl_Position bởi thành phần thứ tư của nó là gl_Position.w. Tại đây, tất cả các tọa độ x, y, x đều nằm trong khoảng [-1,1]. Tọa độ này được gọi là tọa độ thiết bị chuẩn hóa.
  • Hệ tọa độ màn ảnh/cửa sổ (screen/window coordinates): Tọa độ cuối cùng là tọa độ màn ảnh hay cửa sổ, với biến đổi cuối cùng là biến đổi khung nhìn (viewport transformation). Biến đổi này cũng được thực hiện bằng ma trận nhưng được áp dụng tự động với hai hàm glViewport và glDepthRangef. Dù ma trận được tạo bên trong bởi OpenGL nhưng nguyên lý của nó đặc biệt liên quan tới buffer độ sâu (depth buffer) là khá quan trọng. Chúng ta sẽ phân tích kỹ vấn đề này trong một bài tới đây.

Ma trận biến đổi mô hình (modeling transformation matrix)

Biến đổi mô hình bao gồm tịnh tiến (translation), định tỉ lệ (scaling) và xoay đối tượng (rotation). Một điểm 3 chiều được biểu diễn bởi vector 4 chiều với thành phần thứ tư được thêm vào có giá trị là 1. Tọa độ thứ tư được sử dụng cho các tính toán thêm chẳng hạn dùng cho phép chia phối cảnh. Một điểm P với các tọa độ 3 chiều p1, p2, p3 được viết dưới dạng vector cột như sau

p

Các ma trận biến đổi là các ma trận vuông cấp 4. Nếu M là một ma trận biến đổi thì điểm P’ là kết quả của tích của P nhân bên trái với ma trận M

P’ = MP

1. Tịnh tiến (translation)

Ban đầu, gốc tọa độ mô hình của đối tượng được coi như đặt trùng với gốc tọa độ toàn cảnh. Khi đặt đối tượng tại một vị trí biểu diễn bởi vector t = (t1, t2, t3) trong hệ tọa độ toàn cảnh, chúng ta đã tịnh tiến đối tượng cùng hệ tọa độ mô hình của nó tới điểm đó, các tọa độ thành phần của các đỉnh của đối tượng được cộng thêm các thành phần tương ứng của t

P’ = (p1 + t1, p2 + t2, p3 + t3, 1)

Gọi Mtranslation là ma trận tịnh tiến thì

translation1

Chúng ta sẽ đi tìm ma trận Mtranslation

P sẽ không thay đổi khi nó nhân bên trái với ma trận đơn vị cấp 4

translation2

Cho Mtranslation xuất phát từ ma trận đơn vị. Để có kết quả như yêu cầu, chúng ta cộng t1 lần hàng 4 của ma trận vào hàng 1, cộng t2 lần hàng 4 vào hàng 2 và cộng t3 lần hàng 4 vào hàng 3. Điều đó tương đương với nhân bên trái Mtranslation với ma trận

translation3

Do đó

translation4

Chúng ta có

translation5

2. Định tỉ lệ (scaling)

Định tỉ lệ là nhân các tọa độ x, y ,z với các hệ số Sx, Sy, Sz (tương đương, giảm độ dài của các vector cơ sở i, j, k của không gian mô hình đi Sx, Sy, Sz lần). Scale cần được thực hiện trước khi đưa đối tượng vào không gian toàn cảnh, và do đó trước khi tịnh tiến đối tượng. Lý do là các đối tượng khác nhau có thể được định tỉ lệ khác nhau nhưng khi đặt đối tượng vào một vị trí trong không gian toàn cảnh, chúng ta sử dụng cơ sở thống nhất toàn cảnh cho mọi đối tượng

P’ = (Sxp1, Syp2, Szp3, 1)

Tương tự như phân tích trong tịnh tiến, chúng ta xây dựng ma trận định tỉ lệ Mscaling như sau: nhân hàng 1 với Sx, nhân hàng 2 với Sy và nhân hàng 3 với Sz, chúng ta có ma trận

scale1

scale2

3. Kết hợp định tỉ lệ và tịnh tiến

Như đã nêu trên, scale phải được thực hiện trước

P’ = MscalingP

Sau đó P’ được tịnh tiến bởi ma trận Mtranslation

P’’ = MtranslationP’ = MtranslationMscalingP

Áp dụng tính chất kết hợp của phép nhân ma trận chúng ta có

P’’ = (MtranslationMscaling)P

*Chú ý: phép nhân ma trận có tính kết hợp nhưng không có tính giao hoán, nghĩa là với hai ma trận A và B thì AB nói chung khác với BA.

Đặt Mscaling+translation = MtranslationMscaling =

scaletrans1

Vậy

P’’ = Mscaling+translationP =

scaletrans2

4. Xoay (rotation)

Phần này được viết với giả định rằng bạn đọc đã nắm vững các kiến thức về tích vô hướng, tích có hướng của hai vector, chuẩn hóa vector, cơ sở trực chuẩn của không gian vector, đổi cơ sở trong không gian vector; các kiến thức về ma trận bao gồm ma trận chuyển vị, ma trận nghịch đảo, ma trận trực giao. Riêng khái niệm ma trận đối xứng xoắn và biểu diễn tích có hướng của hai vector dưới dạng ma trận không có trong sách Toán cao cấp (tập 1, 1998) nên tôi sẽ trình bày ở đây.

4.1 Ma trận xoắn hay đối xứng xoắn (Skew-symmetric matrix)

Ma trận đối xứng xoắn là ma trận vuông mà có các phần tử đối xứng qua đường chéo chính có trị tuyệt đối bằng nhau và trái dấu nhau. Cho A là ma trận vuông cấp n, A là ma trận đối xứng xoắn nếu thỏa điều kiện aij = -aji với mọi i, j ∈ {1,…,n}. Nói cách khác, AT = -A. Với điều kiện như vậy, ma trận xoắn phải có các phần tử trên đường chéo chính bằng 0. Ví dụ

skew

4.2 Biểu diễn dạng ma trận tích có hướng của hai vector

Nhắc lại biểu diễn tích có hướng của hai vector a = axi + ayj + azk, và b = bxi + byj + bzk theo các vector đơn vị i, j, k trong không gian 3 chiều

skew12

Đặt c = a × b, chúng ta có

c = (aybz – azby)i – (axbz – azbx)j + (axby – aybx)k

Vector c viết dưới dạng vector cột như sau

skew2

Vector cột này là tích của vector cột (bx by bz)T nhân bên trái với một ma trận như dưới đây

skew3

Đó là một ma trận xoắn với các phần tử là tọa độ của vector a, kí hiệu là [a]× . Vậy chúng ta có

a × b = [a]× b

4.3 Ma trận vuông cấp 3 xoay một điểm chung quanh trục z một góc α ngược chiều kim đồng hồ trong không gian 3 chiều

Ma trận này đã rất quen thuộc. Xoay một điểm P chung quanh trục z một góc α ngược chiều kim đồng hồ tương đương với việc cho P đứng yên và xoay hệ trục tọa độ (xoay mặt phẳng Oxy chung quanh trục z) một góc α thuận chiều kim đồng hồ. Tọa độ của P trong cơ sở mới là tọa độ kết quả.

Các vector cơ sở mới là

rotation_z

Ma trận của cơ sở mới là

rotation_z2

Ma trận chuyển cơ sở sang cơ sở mới là R = M-1. M là ma trận trực giao nên

M-1 = MT.

Vậy ma trận chuyển cơ sở hay ma trận xoay cần tìm là

rotation_z4

4.4 Xoay một góc α quanh một trục chuẩn hóa bất kỳ (x, y, z)

Hướng xoay mặc định là ngược chiều kim đồng hồ. Trước tiên chúng ta xây dựng một cơ sở mới nhận trục xoay làm trục z với vector cơ sở gọi là z’. Chúng ta có

rotation_xyz

Chọn trục y là trục hướng lên (up), trục x mới với vector cơ sở x’ được tính như sau

rotation_xyz22

z’ đã chuẩn hóa nên x2 + y2 + z2 = 1, suy ra x2 + z2 = 1 – y2

Chúng ta chuẩn hóa x’ bằng cách chia các thành phần của nó bởi

rotation_xyz3

rotation_xyz4

Vector cơ sở mới y’

rotation_xyz5

Chúng ta đã có các vector cơ sở mới trực chuẩn là x’, y’, z’. Ma trận của cơ sở này là

rotation_xyz6

M1 là ma trận trực giao nên ma trận chuyển cơ sở sang cơ sở mới là M2 = M1T

rotation_xyz_m2

Sau khi chuyển sang cơ sở mới, đối tượng được xoay trong không gian mới quanh trục z mới của nó với ma trận xoay một góc α

rotation_xyz_m3

Vậy ma trận kết hợp là M4 = M3M2

rotation_xyz_m4

Sau khi được xoay, các đỉnh của đối tượng mang tọa độ của không gian có ma trận cơ sở là M1 (chứ không phải tọa độ của không gian gốc của mô hình). Và M1 chính là ma trận dùng để chuyển cơ sở trở lại không gian ban đầu. Do vậy, ma trận M4 cần được nhân bên trái với M1, được ma trận tổng hợp cuối cùng

M = M1M4

rotation_xyz_m

Gọi mij là phần tử hàng i, cột j của M

rotation_xyz_m_ij

Chúng ta lần lượt tính các phần tử của M

rotation_xyz_m11_23

rotation_xyz_m31_33

Vậy ma trận M

rotation_xyz_result2

Ma trận xoay cấp 4

Nếu chúng ta thêm vào tọa độ thứ tư để không gian trở thành 4 chiều thì các tọa độ thứ tư của 3 vector cơ sở đầu đều bằng 0, và vector cơ sở thứ tư là

rotation_xyz_4x4_1

Vector cơ sở này không thay đổi qua các biến đổi không gian nói trên. Nó tựa như vector cơ sở của trục z trong không gian 3 chiều khi chúng ta xoay mặt phẳng Oxy chung quanh trục z vậy. Trong cách xây dựng cơ sở mới theo trục xoay ở trên, cơ sở mới 4 chiều vẫn thỏa mãn là trực chuẩn vì các vector cơ sở đều có độ dài là 1 và chúng đôi một trực giao (tích vô hướng bằng 0).

Ma trận cơ sở mới trở thành cấp 4

rotation_xyz_4x4_2

Việc thêm vào tọa độ thứ tư như thế không làm thay đổi kết quả tính toán trước đó trong phương diện của ma trận con cấp 3. Trong khi đó các ma trận trong phép xoay luôn được bảo toàn hàng thứ tư và cột thứ tư, và chúng ta có ma trận xoay cấp 4

rotation_xyz_4x4_3

Nếu một biến đổi mô hình bao gồm cả xoay, định tỉ lệ và tịnh tiến thì

Mobject→world = MtranslationMscalingMrotation

 

 

 

Advertisements

Gửi phản hồi

Website này sử dụng Akismet để hạn chế spam. Tìm hiểu bình luận của bạn được duyệt như thế nào.

%d bloggers like this: