Trang chủ > Phát triển di động > Nội dung chính

OpenGL ES và biến đổi tọa độ (một)


Bạn bè làm trong lĩnh vực công nghệtỷ số bóng đá hôm nay, đặc biệt là những ai chuyên về phát triển ứng dụng trên nền tảng client-side, chắc hẳn đã từ Muốn hiểu sâu về cơ chế rendering của client-side, thì việc không tìm hiểu OpenGL là điều khó có thể thực hiện được. Hơn nữa, trong vài năm trở lại đây, nhu cầu xử lý hình ảnh và video trong các dự án client-side ngày càng tăng, và để có thể đảm đương những công việc "chuyên nghiệp" này, việc học OpenGL là một yêu cầu không thể thiếu. Tuy nhiên, con đường học tập OpenGL cũng khá dốc, đặc biệt khi liên quan đến các kiến thức chuyên sâu về đồ họa máy tính, điều này đôi khi khiến nhiều người cảm thấy e ngại và nản chí.

Muốn thành thạo việc sử dụng OpenGLtỷ số bóng đá hôm nay, có hai khía cạnh kiến thức liên quan cần được chú ý đặc biệt.

  • Một phần quan trọng trong OpenGL chính là pipeline đồ họa (graphics pipeline)tỷ số bóng đá hôm nay, đây là toàn bộ quy trình mà mọi tác vụ vẽ hình được thực hiện. Pipeline này bao gồm nhiều bước khác nhau, mỗi bước đều có vai trò riêng biệt và đóng góp cho việc tạo ra hình ảnh cuối cùng. Ví dụ như vertex shader và fragment shader - những đoạn mã mà chúng ta viết sẽ hoạt động tại các giai đoạn khác nhau củ Vertex shader xử lý từng đỉnh (vertex) của đối tượng, biến đổi chúng thành không gian màn hình, trong khi fragment shader đảm nhiệm việc tính toán màu sắc cho từng mảnh nhỏ (fragment) trên bề mặt đối tượng. Ngoài ra, còn có depth testing (kiểm tra độ sâu), giúp loại bỏ các mảnh không cần thiết nằm sau đối tượng khác; stencil testing (kiểm tra mẫu) lại dùng để tạo các hình dạng phức tạp hoặc tạo hiệu ứng đặc biệt như cắt xẻ, hay tạo khung viền; và rasterization (quang sai hóa) - quá trình chuyển đổi các đỉnh từ dạng vector sang dạng pixel để hiển thị lên màn hình. Tất cả các bước này kết hợp lại để tạo nên hình ảnh hoàn chỉnh mà chúng ta nhìn thấy.
  • Một khía cạnh khác là sự biến đổi tọa độtỷ số bóng đá hôm nay, vốn là chức năng chính mà vertex shader cần thực hiện. Làm thế nào để đưa một đối tượng trong không gian 3D vào đúng vị trí, điều chỉnh nó vào tư thế phù hợp, và cuối cùng, làm cách nào để chuyển đổi tọa độ 3D thành hình ảnh trên mặt phẳng 2D (thường là màn hình). Điều này đòi hỏi một quy trình phức tạp nhưng vô cùng quan trọng để tạo ra những khung cảnh trực quan sống động trong đồ họa máy tính.

Chủ đề chính mà bài viết này muốn đề cập sẽ tập trung chủ yếu vào khía cạnh thứ hai của kiến thức mà chúng ta vừa thảo luậnkeo banh, đó là biến đổi tọa độ. Phần này liên quan đến một chút kiến thức toán học, do đó có thể khó hiểu hơn so với các phần khác và tài liệu trên mạng cũng phân tán ở nhiều nơi, hiếm khi có những mô tả đầy đủ và có hệ thống. Về mặt lý thuyết, phần này không hoàn toàn nằm trong phạm vi quy định của OpenGL, nhưng nó lại có mối liên hệ chặt chẽ với nền tảng này. Trong bài viết sắp tới, tôi sẽ trình bày một chuỗi nhỏ gồm nhiều bài báo kỹ thuật xoay quanh chủ đề biến đổi tọa độ, nhằm sắp xếp các tài liệu liên quan lại và cố gắng diễn đạt bằng ngôn ngữ dễ hiểu nhất. Tôi hy vọng điều này sẽ giúp những ai đang tìm hiểu về OpenGL và xử lý hình ảnh vượt qua các rào cản lý thuyết. Tôi cũng muốn nhấn mạnh rằng việc hiểu rõ biến đổi tọa độ là một bước quan trọng để nắm bắt sâu hơn về cách hoạt động của các chương trình đồ họa. Điều này không chỉ hữu ích cho việc học OpenGL mà còn có thể mở ra cánh cửa cho nhiều lĩnh vực khác trong công nghệ đồ họa. Vì vậy, đừng ngại dành thời gian để làm quen và luyện tập với các khái niệm cơ bản trong phần này. Tôi tin rằng với sự kiên nhẫn và niềm đam mê học hỏi, bạn sẽ sớm cảm thấy tự tin hơn trong việc vận dụng kiến thức này vào thực tế.

Dựa trên nguyên tắc kết nối lý thuyết với thực tiễntỷ số bóng đá hôm nay, chúng ta sẽ trình bày các khái niệm lý thuyết thông qua các API trong hệ điều hà Chúng tôi chọn môi trường Android vì nó dễ tiếp cận, hầu hết các lập trình viên đều có thể nhanh chóng khởi động một ứng dụng Android và môi trường lập trình liên quan đến OpenGL đã được tích hợp sẵn, không cần nhiều cấu hình phức tạp. Trên Android, OpenGL ES 2.0 là phiên bản được sử dụng phổ biến nhất, có thể coi đây như một tập con của phiên bản OpenGL tương ứng. Trong phần thảo luận tiếp theo, chúng tôi sẽ tập trung vào OpenGL ES 2.0. Bên cạnh đó, việc lựa chọn OpenGL ES 2.0 còn xuất phát từ sự linh hoạt và hiệu quả mà nó mang lại. Với các tính năng tối ưu hóa cho thiết bị di động, OpenGL ES 2.0 cho phép tạo ra đồ họa chất lượng cao mà vẫn đảm bảo hiệu suất tốt trên các nền tả Hơn nữa, nhờ vào sự hỗ trợ mạnh mẽ từ các công cụ phát triển hiện đại, lập trình viên có thể dễ dàng xây dựng các ứng dụng phức tạp mà không gặp quá nhiều khó khăn trong việc thiết lập môi trường làm việc. Một điểm đặc biệt thú vị của OpenGL ES 2.0 so với các phiên bản trước đó là khả năng tận dụng sức mạnh của GPU để xử lý các tác vụ đồ họa phức tạp một cách hiệu quả hơn. Điều này không chỉ giúp cải thiện tốc độ hiển thị mà còn giảm thiểu đáng kể gánh nặ Vì vậy, nếu bạn đang tìm kiếm một giải pháp lập trình đồ họa nhẹ nhàng nhưng hiệu quả, OpenGL ES 2.0 trên Android chính là lựa chọn hoàn hảo dành cho bạn.

Ngoài raboi tu vi, nhiều nhiệm vụ phát triển thực tế chỉ liên quan đến xử lý hình ảnh 2D mà không cần đến xử lý hình ảnh 3D. Sử dụng OpenGL ES để xử lý hình ảnh 2D thực sự có thể làm quy trình đơn giản hơn một chút, nhưng theo quan điểm cá nhân của tôi, việc hiểu rõ cơ chế render của đồ họa 3D đóng vai trò rất quan trọng trong việc nắm bắt toàn bộ vấn đề. Khi đã hiểu được 3D, bạn sẽ dễ dàng hiểu được 2D, nhưng ngược lại thì không phải lúc nào cũng đúng. Hơn nữa, chỉ khi ở ngữ cảnh 3D, khái niệm về biến đổi tọa độ mới có thể được hiểu đầy đủ và logic nhất. Do đó, chúng ta sẽ bắt đầu từ 3D ngay từ đầu, và sau khi giới thiệu xong các biến đổi tọa độ trong không gian 3D, chúng ta sẽ trở lại với trường hợp đặc biệt của 2D để phân tích thêm. Tuy nhiên, điều này không có nghĩa là việc học 2D là không quan trọng. Thực tế, khi nói đến các ứng dụng cụ thể như thiết kế đồ họa hoặc tạo hiệu ứng trong phần mềm biên tập video, việc sử dụng hình ảnh 2D vẫn là chủ đạo. Tuy nhiên, nếu bạn muốn hiểu sâu hơn về bản chất của các công nghệ này, việc học 3D trước sẽ giúp bạn có cái nhìn tổng quan hơn và dễ dàng áp dụng kiến thức vào nhiều lĩnh vực khác nhau. Hãy tưởng tượng rằng 2D giống như nền móng của một tòa nhà, còn 3D chính là cấu trúc hoàn chỉnh của nó. Bạn có thể xây dựng nền móng mà không cần lo lắng về cấu trúc bên trên, nhưng để tạo nên một công trình hoàn chỉnh, bạn cần hiểu rõ cách mọi phần kết nối với nhau. Điều này cũng tương tự như trong lập trình đồ họa: nếu bạn hiểu được cách hoạt động của 3D, bạn sẽ có cái nhìn sâu sắc hơn về cách hoạt động của 2D, từ đó có thể áp dụng linh hoạt trong nhiều tình huống khác nhau.

Một chương trình ví dụ

Rất nhiều bài viết hướng dẫn OpenGL bắt đầu bằng cách vẽ một tam giác. Tuy nhiêntỷ số bóng đá hôm nay, đối với việc thảo luận về biến đổi tọa độ, ví dụ về tam giác không thực sự phù hợp, vì hình tam giác là một hình phẳng và khi áp dụng toàn bộ phép biến đổi tọa độ lên nó, kết quả thu được có vẻ kỳ lạ, khiến người mới học dễ bị nhầm lẫn. Do đó, ví dụ trong bài này sử dụng lập trình để vẽ một hình lập phương (cube). Bạn có thể tải chương trình tại địa chỉ sau:

Dưới đây là hình chụp màn hình đầu ra của chương trình:

Hình chụp màn hình đầu ra của chương trình ví dụ

Chắc chắn rồiboi tu vi, chương trình đã vẽ ba chiếc hộp hình lập phương với các vị trí, kích thước và góc nhìn hoàn toàn khác nhau. Tuy nhiên, thực tế là chiếc hộp lớn phía trên và chiếc hộp nhỏ phía dưới đều được tạo ra từ chiếc hộp ở giữa thông qua một số thay đổi tọa độ (bao gồm thu nhỏ, xoay và dịch chuyển). Còn chiếc hộp ở giữa đang nằm tại vị trí gốc ban đầu, tức là điểm gốc của hệ tọa độ thế giới (chúng ta sẽ tìm hiểu về khái niệm này ngay sau đây).

Trong bài viết nàytỷ số bóng đá hôm nay, chúng ta sẽ không vội vàng đi sâu vào các chi tiết mã nguồn ngay từ bây giờ, mà sẽ dành để thảo luận trong các bài viết sau. Thay vào đó, chúng ta hãy cùng nhau xem qua toàn bộ quy trình biến đổi tọa độ trước nhé.

Hệ tọa độ và biến đổi tọa độ

Chúng ta đã đề cập trước đó rằngkeo banh, mục tiêu của việc biến đổi tọa độ (coordinate transformation) là để đưa một đối tượng trong không gian 3 chiều (3D) cuối cùng lên màn hình 2 chiều (2D). Dù rằng trong thực tế, OpenGL ES hỗ trợ render ra màn hình ngoài khung nhìn (off-screen rendering), nhưng trong bài viết này chúng ta sẽ bỏ qua chi tiết này. Đây cũng chính là một trong những vấn đề cơ bản mà đồ họa máy tính (computer graphics) cần giải quyết. Khi chúng ta quan sát thế giới 3D, thực chất là thông qua một màn hình 2D. Những gì chúng ta nhìn thấy trên màn hình thực chất là sự phản chiếu của thế giới 3D lên bề mặt màn hình. Biến đổi tọa độ giúp xác định vị trí cụ thể của mỗi điểm trong không gian 3D khi được chiếu xuống màn hình 2D. Đối với các đối tượng 3D, thay vì xử lý toàn bộ đối tượng, trong thực tế, chúng ta thường áp dụng các phép biến đổi tương tự cho từng đỉnh (vertex) của nó. Sau khi mỗi đỉnh được chuyển đổi sang màn hình 2D, quá trình rasterization tiếp theo sẽ xác định chính xác cách các điểm ảnh (pixel) trên màn hình sẽ hiển thị đối tượng 3D đó. Kết quả cuối cùng là chúng ta có cảm giác như đang nhìn trực tiếp vào một đối tượng 3D thông qua màn hình 2D.

Hình dưới đây minh họa toàn bộ quá trình biến đổi tọa độ:

Biểu đồ tổng quan về biến đổi tọa độ

Chúng ta hãy tìm hiểu sơ lược về các quy trình trong hình trước:

  1. Ban đầutỷ số bóng đá hôm nay, khi một mô hình đối tượng 3D được tạo ra bằng cách sử dụng phần mềm dựng hình (modelling software), nó sẽ được biểu diễn dưới dạng tọa độ cục bộ (local coordinates). Trong hệ tọa độ này, điểm gốc (0, 0, 0) thường nằm ở tâm của đối tượng 3D. Mỗi đối tượng 3D khác nhau sẽ có hệ tọa độ cục bộ (local space) riêng biệt, phản ánh đặc điểm và vị trí cụ thể của chính nó trong không gian ảo. Điều này giúp các nhà thiết kế dễ dàng kiểm soát và chỉnh sửa từng chi tiết nhỏ nhất của mô hình mà không làm ảnh hưởng đến các đối tượ
  2. Khi một đối tượng 3D được áp dụng phép biến đổi model (model transformation)keo banh, tọa độ trong không gian cục bộ (local coordinates) của nó sẽ được chuyển đổi sang hệ tọa độ toàn cầu (world coordinates). Sau khi các đối tượng khác nhau thực hiện phép biến đổi model riêng biệt, chúng đều sẽ nằm trong cùng một hệ tọa độ toàn cầu (world space), và từ đó, vị trí tương đối giữa các đối tượng có thể được xác định thông qua tọa độ thế giới này. Về cơ bản, phép biến đổi model bao gồm ba loại biến đổi tiềm năng: tỷ lệ (scaling), xoay (rotation) và dịch chuyển (translation). Trong đồ họa máy tính, phép biến đổi thường được tính toán bằng cách sử dụng phép nhân ma trận, vì vậy phép biến đổi model có nghĩa là nhân trái (trái nghĩa là ở bên trái) tọa độ cục bộ với một ma trận model để thu được tọa độ thế giới. Các phép biến đổi tiếp theo mà ta sẽ trình bày - biến đổi quan sát (view transformation) và biến đổi chiếu (projection transformation) - cũng đều liên quan đến việc thực hiện phép nhân ma trận.
  3. Trong cùng một hệ tọa độ thế giớikeo banh, các đối tượng 3D khác nhau kết hợp tạo nên một cảnh (scene). Đối với cảnh này, chúng ta có thể quan sát từ nhiều góc nhìn khác nhau. Khi góc quan sát thay đổi, những gì mắt chúng ta nhìn thấy cũng sẽ khác biệt. Để biểu thị góc quan sát này, chúng ta sẽ thiết lập thêm một hệ tọa độ camera, tiếng Anh gọi là camera space, hoặc eye space, hoặ Việc chuyển đổi từ hệ tọa độ thế giới sang hệ tọa độ camera được gọi là phép biến đổi view. Khi nhắc đến từ "máy ảnh" (camera), nó giống như đôi mắt của chúng ta. Thực hiện một phép biến đổi view có nghĩa là chúng ta đang điều chỉnh "đôi mắt" để đặt nó ở góc quan sát mà mình mong muốn. Mỗi khi thay đổi góc nhìn, hệ tọa độ camera sẽ tái cấu trúc lại không gian theo cách mà mắt nhìn thấy mọi thứ trong cảnh. Điều này giúp tạo ra sự linh hoạt trong việc mô phỏng thế giới ảo, cho phép người dùng cảm nhận không gian từ nhiều hướng và vị trí khác nhau. Qua đó, hệ thống có thể tái hiện chính xác cách ánh sáng và vật thể tương tác trong từng góc nhìn cụ thể. Nhờ đó, hình ảnh cuối cùng được hiển thị trở nên sống động và chân thực hơn bao giờ hết.
  4. Khi thực hiện phép biến đổi chiếu (projection) lên tọa độ của máy ảnhkeo banh, nó sẽ chuyển đổi thành tọa độ cắt (clip coordinates). Trong không gian cắt (clip space), các trục x, y, z sẽ xác định một phạm vi có thể nhìn thấy được. Những đỉnh (vertex) có tọa độ vượt ra ngoài phạm vi này sẽ bị loại bỏ, nhờ đó, phần nào nằm ngoài phạm vi chỉ định trong cảnh 3D cuối cùng sẽ không được vẽ lên và chúng ta cũng không thể nhìn thấy chúng. Đây là bước quan trọng để chuyển đổi từ không gian 3D sang không gian 2D. Có lý do cho bước này vì chúng ta luôn quan sát cảnh 3D qua một màn hình, giống như nhìn qua một cửa sổ để ngắm cảnh bên ngoài. Màn hình (cửa sổ) không phải vô tận, do đó, có những góc nhìn nhất định mà chúng ta không thể nhìn thấy toàn bộ cảnh. Phần không nhìn thấy này chính là những gì bị loại bỏ ở bước này, và từ đó thuật ngữ "loại bỏ" (cắt) xuất phát; mặt khác, việc chiếu cảnh 3D lên màn hình 2D chủ yếu cũng được thực hiện thông qua bước này. Một điều đáng chú ý là sau khi thực hiện biến đổi cắt, số lượng đỉnh của đối tượng 3D không nhất thiết giảm đi; có thể sau khi bị cắt, số lượng đỉnh lại tăng lên. Chi tiết này chúng ta sẽ thảo luận thêm sau. Tôi đã thay thế tất cả các từ tiếng Anh bằng tiếng Việt và giữ nguyên ý nghĩa của đoạn văn gốc.
  5. Tọa độ sau khi cắt (clip coordinates) sẽ được chuyển đổi thành tọa độ NDC (Normalized Device Coordinates) thông qua một quá trình đặc biệt gọi là chia tỷ lệ perspective (perspective division). Quá trình này liên quan đến các tọa độ thuần nhất (homogeneous coordinates)tỷ số bóng đá hôm nay, và chúng ta sẽ thảo luận chi tiết về nó ở phần sau. Trong OpenGL ES, quá trình này diễn ra tự động, vì vậy chúng ta không cần phải viết mã để thực hiện nó. Thay vào đó, nó thường được hiểu cùng với phép biến đổi chiếu (projection transformation). Có thể nói một cách không quá chính xác rằng, sau khi tọa độ máy ảnh (camera coordinates) trải qua phép biến đổi chiếu, chúng sẽ trực tiếp trở thành tọa độ NDC. Vậy NDC là gì? Đây thực sự là hệ tọa độ được định nghĩa bở Trong hệ NDC, các tọa độ x, y, z đều nằm trong khoảng từ -1 đến 1. Điều này có nghĩa là NDC định nghĩa một khối lập phương có cạnh dài 2, mỗi cạnh chạy từ -1 đến 1, và tất cả các điểm NDC đều nằm trong khối lập phương này (các đỉnh nằm ngoài khối lập phương đã bị loại bỏ trong bước cắt trước đó). Cần lưu ý rằng, mặc dù NDC bao gồm ba trục tọa độ x, y, z, nhưng nó chủ yếu thể hiện vị trí của đỉnh trong mặt phẳng xOy. Các tọa độ x và y cuối cùng sẽ tương ứng với vị trí của các pixel trên màn hình. Trong khi đó, tọa độ z chỉ dùng để biểu thị mối quan hệ về chiều sâu giữa các đối tượng, tức là cái nào ở phía trước và cái nào ở phía sau (các đối tượng ở phía trước sẽ che khuất những đối tượng phía sau). Do đó, giá trị tuyệt đối của tọa độ z không quan trọng; điều quan trọng là thứ tự so sánh giữa các giá trị z, giúp xác định thứ tự hiển thị của các đối tượng.
  6. Trong hệ tọa độ chuẩn hóa (Normalized Device Coordinates - NDC)keo banh, mỗi chiều có phạm vi giá trị từ -1 đến 1. Tuy nhiên, tọa độ màn hình không giống vậy; chúng có kích thước khác nhau tùy thuộc vào độ phân giải của màn hình. Ví dụ như với một màn hình có độ phân giải 720x1280, phạm vi giá trị của trục x sẽ là [0, 720], còn trục y sẽ là [0, 1280]. Do đó, cần có một phép biến đổi để chuyển đổi tọa độ NDC sang tọa độ màn hình (screen coordinates). Quá trình này được gọi là phép biến đổi khung nhìn (viewport transform). Trong OpenGL ES, quá trình biến đổi này cũng tự động thực hiện, nhưng chúng ta phải chỉ định kích thước của vùng vẽ (viewport) thông qua giao diệ Một điều quan trọng cần lưu ý là tọa độ màn hình và tọa độ pixel (pixel) không hoàn toàn giống nhau. Tọa độ màn hình là vị trí chính xác của một điểm trên màn hình, có thể bao gồm cả số thập phân. Trong khi đó, các pixel chỉ có thể nằm ở các vị trí nguyên (integer). Quá trình biến đổi từ tọa độ NDC sang tọa độ màn hình chưa kết thúc ở đây, mà nó chỉ là bước đầu tiên trước khi đi sâu hơn vào việc xác định vị trí pixel cuối cùng, điều này sẽ được thực hiện trong giai đoạn rasterization (mà chi tiết cụ thể sẽ không được đề cập trong bài viết này).

Để hiểu rõ hơn về từng bước trêntỷ số bóng đá hôm nay, dưới đây chúng ta cùng xem một số hình ảnh.

Hình minh họa tọa độ cục bộ

Hình ảnh phía trên cho thấy hệ tọa độ cục bộ. Đối tượng 3D ở đây là một hình lập phươngkeo banh, và điểm gốc (0, 0, 0) của hệ tọa độ cục bộ được đặt ngay tại tâm của hình lập phương. Trục x được biểu thị bằng màu đỏ, trục y bằng màu xanh lá cây, còn trục z được đánh dấu bằng màu xanh dương. Những màu sắc này giúp người quan sát dễ dàng phân biệt giữa các hướng trong không gian ba chiều. Hơn nữa, việc đặt gốc tại tâm của hình lập phương giúp định vị và điều chỉnh đối tượng một cách chính xác hơn trong không gian làm việc.

Hình minh họa tọa độ thế giới

Hình ảnh phía trên minh họa hệ tọa độ thế giới. Có thể hiểu rằng ban đầukeo banh, hệ tọa độ thế giới và hệ tọa độ cục bộ của khối lập phương hoàn toàn trùng khớp với nhau. Tuy nhiên, sau khi khối lập phương trải qua một số thay đổi như thu nhỏ, xoay và dịch chuyển, hai hệ tọa độ này đã không còn trùng khớp nữa. Trong hình, các trục tọa độ được biểu thị bằng đường đứt nét chính là hệ tọa độ cục bộ ban đầu của khối lập phương.

Hình minh họa tọa độ máy ảnh

Hình ảnh phía trên minh họa hệ tọa độ của máy ảnh. Trục tọa độ được biểu thị bởi đường thẳng liền ở góc dưới bên trái chính là hệ tọa độ máy ảnhtỷ số bóng đá hôm nay, trong khi các trục tọa độ được biểu thị bằng đường nét đứt ở bên phải là hệ tọa độ thế giới. Hệ tọa độ máy ảnh có thể được xem như góc nhìn mà máy ảnh (hoặc mắt) tạo ra khi quan sát một điểm nào đó trong không gian 3 chiều. Ví dụ trong hình trên, hướng quan sát của máy ảnh đang đối diện với điểm (0, 2, 0) trong hệ tọa độ thế giới. Điểm gốc (origine) của hệ tọa độ máy ảnh chính là vị trí của máy ảnh (hoặc mắt). Một điều cần lưu ý là theo thói quen định nghĩa của OpenGL ES, hướng của trục z trong hệ tọa độ máy ảnh hoàn toàn ngược lại so với hướng mà máy ảnh đang nhìn. Điều này có nghĩa là máy ảnh (hoặc mắt) nhìn về phía ngược với trục z, cụ thể là hướng về phía trục z âm. Thêm vào đó, sự khác biệt này giữa hướng của máy ảnh và hướng của trục tọa độ z là một yếu tố quan trọng trong việc lập trình và mô phỏng, đặc biệt khi sử dụng các công cụ như OpenGL ES để xử lý đồ họa 3D. Việc hiểu rõ mối liên hệ giữa hai hệ tọa độ này giúp nhà phát triển có thể kiểm soát chính xác cách máy ảnh di chuyển và quan sát trong không gian ảo.

Những gì chúng ta đã đề cập trước đó về phép biến đổi view (cận cảnh) chính là việc các đỉnh (vertex) trong hệ tọa độ thế giới sẽ được chuyển đổi qua một quá trình này. Kết quả làboi tu vi, các đỉnh sẽ nằm trong hệ tọa độ của máy ảnh (camera coordinate system). Điều này có nghĩa là tọa độ của các đỉnh giờ đây sẽ được biểu diễn theo giá trị từ góc nhìn của máy ảnh, thay vì ở hệ tọa độ thế giới như ban đầu. Quá trình này giúp tái định hình không gian ba chiều theo cách mà máy ảnh "thấy" được, tạo ra một khung nhìn mới mẻ và trực quan hơn.

Khi quan sát kỹ lưỡngkeo banh, chúng ta sẽ nhận ra rằng hệ tọa độ máy ảnh thực chất có thể được xem như là kết quả từ việc áp dụng các phép xoay và dịch chuyển lên hệ tọa độ thế giới. Điều này sẽ được chúng ta phân tích sâu hơn trong phần sau. Bên cạnh đó, việc hiểu rõ mối liên hệ giữa hai hệ tọa độ này không chỉ giúp giải quyết các vấn đề về hình ảnh mà còn mở ra nhiều cơ hội ứng dụng trong lĩnh vực trí tuệ nhân tạo và xử lý video. Chính vì vậy, việc làm rõ các phép biến đổi này là vô cùng quan trọng trong việc xây dựng những thuật toán chính xác và hiệu quả.

Đến đâyboi tu vi, chúng ta đã chuyển sang hệ tọa độ của máy ảnh. Tiếp theo là bước biến đổi quan trọng, trong đó chúng ta sẽ chiếu các tọa độ 3 chiều (được biểu diễn theo hệ tọa độ máy ảnh) lên màn hình 2 chiều. Như đã đề cập trước đó, quá trình này được thực hiện thông qua phép biến đổi chiếu (projection). Để đảm bảo rằng hình ảnh được chiếu lên màn hình 2 chiều có vẻ như đang ở không gian 3 chiều, chúng ta cần đảm bảo rằng phép biến đổi này tuân theo một số trực giác về thị giác con người. Theo kinh nghiệm thực tế, những gì chúng ta nhìn thấy càng xa thì sẽ trông càng nhỏ; ngược lại, những gì gần hơn sẽ lớn hơn. Điều này giống như khi bạn nhìn một đường ray tàu hỏa hoặc một hành lang dài, các đối tượng ở xa dần sẽ thu hẹp lại và hội tụ về một điểm, như hình minh họa dưới đây:

Hình ảnh ray sắt

Hình ảnh hành lang

Vì vậyboi tu vi, phép biến đổi chiếu (projection transformation) cũng cần duy trì hiệu ứng này. Sau khi thực hiện phép biến đổi chiếu, chúng ta sẽ thu được tọa độ cắt (clipping coordinates). Tiếp theo, thêm một bước chia perspective (perspective division), và như vậy chúng ta đã chuyển đổi sang hệ tọa độ chuẩn chuẩn hóa (NDC - Normalized Device Coordinates). Giống như những gì đã trình bày trước đó, chúng ta sẽ không đi sâu vào chi tiết của phép chia perspective ở thời điểm này; tạm thời, chúng ta có thể xem đó là quá trình mà từ tọa độ máy ảnh (camera coordinates) đến tọa độ NDC sau khi áp dụng phép biến đổi chiếu. Quá trình này được thực hiện bằng cách xây dựng một hình nón quan sát (frustum) từ vị trí của máy ảnh, như hình dưới đây: ![Hình minh họa](https://via. com/150) Hình nón quan sát này xác định vùng không gian mà máy ảnh có thể nhìn thấy, giúp chúng ta hiểu rõ hơn về cách các đối tượng trong không gian 3D được biến đổi và hiển thị trên màn hình hai chiều.

Hình minh họa biến đổi chiếu

Trong hình ảnh trênboi tu vi, nếu bạn nhìn từ vị trí của máy ảnh (tức là gốc tọa độ hệ tọa độ của máy ảnh) theo hướng ngược với trục z của hệ tọa độ máy ảnh, bạn sẽ thấy một không gian được giới hạn bởi hai mặt phẳng: mặt phẳng gần (N) và mặt phẳng xa (F). Khu vực nằm giữa hai mặt phẳng này tạo thành một hình nón cụt, được gọi là hình nón quan sát. Hình nón này có sáu mặt, trong đó hai mặt trước và sau chính là mặt phẳng gần (N) và mặt phẳng xa (F), và nó còn có thêm bốn mặt bên (trên, dưới, trái, phải). Mặt phẳng gần (N) đóng vai trò như màn hình 2D cuối cùng mà các điểm sẽ được chiếu lên. Các đỉnh nằm trong vùng hình nón sẽ được chiếu xuống màn hình 2D; trong khi đó, những đỉnh nằm ngoài hình nón sẽ bị loại bỏ khỏi khung hình. Ngoài ra, đối tượng 3D nằm trong hình nón quan sát sẽ có kích thước hình chiếu trên mặt phẳng gần tỷ lệ thuận với khoảng cách của nó đến mặt phẳng gần. Cụ thể, càng gần mặt phẳng gần, hình chiếu của đối tượng sẽ lớn hơn; ngược lại, càng xa mặt phẳng gần, hình chiếu sẽ nhỏ lại.

Nếu lấy một điểm trong hình nón quan sát làm gốc tọa độ và xây dựng hệ tọa độtỷ số bóng đá hôm nay, ta sẽ thu được tọa độ NDC, biểu thị bởi các trục tọa độ đỏ, xanh lá cây và xanh dương có sẵn ở góc trên bên phải của hình minh họa. Sáu mặt của hình nón quan sát chính xác tương ứng với các giá trị cực đại của mỗi chiều trong hệ tọa độ NDC (tức là -1 và 1).

Có hai chi tiết cần lưu ý:

  • Trong hệ tọa độ NDCkeo banh, gốc tọa độ không nằm ở tâm của hình nón quan sát. Điều này xuất phát từ việc khi thực hiện chuyển đổi từ hệ tọa độ máy ảnh sang hệ NDC, mối tương quan trên trục z không phải là tuyến tính. Chúng ta sẽ tìm hiểu chi tiết hơn về điều này trong phần thảo luận sau về phép biến đổi chiếu, khi đi sâu vào các công thức toán học liên quan.
  • Hệ tọa độ mà chúng ta vừa đề cập trước đâytỷ số bóng đá hôm nay, bao gồm hệ tọa độ địa phương, hệ tọa độ thế giới và hệ tọa độ máy ảnh, đều thuộc loại hệ tọa độ phải (right-handed coordinate system). Tuy nhiên, hệ tọa độ chuẩn chuẩn hóa (NDC - Normalized Device Coordinate) lại là một hệ tọa độ trái (left-handed coordinate system). Sự khác biệt này tạo ra những đặc điểm riêng trong cách nó xử lý không gian và vị trí trong các phép biến đổi đồ họa.

Hình minh họa hệ tọa độ trái tay và phải tay

Trên hình là hệ tọa độ tráitỷ số bóng đá hôm nay, còn bên phải là hệ tọa độ phải. Việc nên sử dụng hệ tọa độ trái hay phải thường phụ thuộc vào thói quen được chấp nhận chung trong ngành. Mỗi hệ thống đồ họa hoặc chuẩn có thể chọn một loại hệ tọa độ khác nhau tùy theo yêu cầu riêng. Tuy nhiên, nếu tuân theo cách làm quen thuộc của OpenGL, chúng ta nên sử dụng loại hệ tọa độ đã được đề cập trước đó. Hệ thống OpenGL, với lịch sử và đặc điểm kỹ thuật riêng biệt, thường ưu tiên sử dụng hệ tọa độ phải, điều này giúp thống nhất trong các dự án và mã nguồn liên quan. Điều này cũng phù hợp với nhiều ứng dụng mô phỏng không gian ba chiều, nơi sự chính xác và tính nhất quán đóng vai trò rất quan trọng trong việc tái tạo các tình huống thực tế. Vì vậy, khi làm việc với OpenGL, bạn nên luôn ghi nhớ quy tắc này để tránh những lỗi không đáng có trong quá trình phát triển phần mềm đồ họa.


Quá trình biến đổi tọa độ chính trong OpenGL ES mà chúng ta đã nắm được phần lớn nội dung tổng quan. Trong các bài viết tiếp theo của loạt bài nàykeo banh, chúng ta sẽ lần lượt đi sâu vào từng bước biến đổi cụ thể, bao gồm cả lý thuyết đằng sau và cách thực hiện bằng mã trên nền tả Ngoài ra, chúng ta cũng sẽ tìm hiểu thêm về cách tối ưu hóa hiệu suất trong các thao tác biến đổi này, giúp bạn có cái nhìn toàn diện hơn khi phát triển ứng dụng đồ họa di động.

(Kết thúc)

Các bài viết được chọn lọc khác


Bài viết gốckeo banh, vui lòng ghi rõ nguồn và bao gồm mã QR bên dưới! Nếu không, từ chối tái bản!
Liên kết bài viết này: /0qd5l5hz.html
Hãy theo dõi tài khoản Weibo cá nhân của tôi: Tìm kiếm tên tôi "Trương Thiết Lệ" trên Weibo.
Tài khoản WeChat của tôi: tielei-blog (Trương Thiết Lệ)
Bài trước: Nguyên tắc "năm so với một" trong công nghệ
Bài sau: Tại sao một số sách kỹ thuật lại khó đọc?

Bài viết mới nhất