2015-11-14 19 views
12

Trong vài tuần qua, tôi đã cố gắng tìm hiểu thư viện libGDX. Tôi đang tìm thấy nó khó khăn, đặc biệt là cho nỗ lực đầu tiên của tôi đối với phát triển game, để hiểu hệ thống Camera/quan hệ viewport. Một dòng mã mà tôi đã được cho biết để sử dụng, và API đề cập đến, đó là:Hiểu ma trận chiếu libGDX

batch.setProjectionMatrix(camera.combined); 

Mặc dù một tốt 4 giờ nghiên cứu, tôi vẫn thiếu một sự hiểu biết đầy đủ về các chức năng của mã này. Đó là sự hiểu biết cơ bản của tôi rằng nó "nói" lô mà máy ảnh đang tìm kiếm. Sự thiếu hiểu biết của tôi là buồn và tức giận, và tôi sẽ đánh giá cao nếu có ai có thể giúp tôi. Một vấn đề khác với đoạn mã là tôi không chắc chắn khi cần thiết để thực hiện (trong phương thức render, tạo phương thức, v.v.).

Trả lời

14

Cân nhắc chụp ảnh bằng máy ảnh. Ví dụ. sử dụng camera điện thoại thông minh của bạn chụp ảnh một chiếc ghế dài trong công viên. Khi bạn làm điều đó, bạn sẽ thấy băng ghế trong công viên trên màn hình điện thoại thông minh của bạn. Điều này có vẻ rất rõ ràng, nhưng hãy nhìn vào những gì liên quan đến điều này.

Vị trí của băng ghế dự bị trên ảnh có liên quan đến vị trí bạn đang đứng khi chụp ảnh. Nói cách khác, nó liên quan đến camera. Trong một trò chơi điển hình, bạn không đặt đối tượng liên quan đến đối tượng. Thay vào đó bạn đặt chúng trong thế giới trò chơi của bạn. Dịch giữa thế giới trò chơi và máy ảnh của bạn, được thực hiện bằng cách sử dụng ma trận (chỉ đơn giản là một cách toán học để biến đổi tọa độ). Ví dụ. khi bạn di chuyển máy ảnh sang phải, sau đó băng ghế di chuyển sang trái trên ảnh. Đây được gọi là ma trận Xem.

Vị trí chính xác của băng ghế dự bị trên ảnh cũng phụ thuộc vào khoảng cách giữa băng ghế và máy ảnh. Ít nhất, nó làm bằng 3D (2D rất giống nhau, vì vậy hãy tiếp tục đọc). Khi nó ở xa thì nó nhỏ hơn, khi nó ở gần camera thì nó lớn hơn. Điều này được gọi là phép chiếu phối cảnh. Bạn cũng có thể có phép chiếu chính xác, trong trường hợp đó kích thước của vật thể không thay đổi theo khoảng cách đến máy ảnh. Dù bằng cách nào, vị trí và kích thước của băng ghế dự bị trong công viên được dịch sang vị trí và kích thước bằng pixel trên màn hình. Ví dụ. băng ghế dự bị rộng hai mét trong công viên, trong khi đó là 380 pixel trên ảnh. Đây được gọi là ma trận chiếu.

camera.combined đại diện cho chế độ xem kết hợp và ma trận chiếu. Nói cách khác: nó mô tả nơi những thứ trong thế giới trò chơi của bạn sẽ được hiển thị trên màn hình.

Gọi batch.setProjectionMatrix(cam.combined); hướng dẫn lô sử dụng ma trận kết hợp đó. Bạn nên gọi nó bất cứ khi nào giá trị thay đổi. Điều này thường là khi resize được gọi và cũng bất cứ khi nào bạn di chuyển hoặc làm thay đổi máy ảnh.

Nếu bạn không chắc chắn thì bạn có thể gọi nó ở đầu phương thức render của mình.

+0

Giải thích tuyệt vời. –

7

Câu trả lời khác là tuyệt vời, nhưng tôi hình một cách khác để mô tả nó có thể giúp nó nhấp chuột.

Bạn thường giải quyết trò chơi của mình trong "không gian thế giới", một hệ tọa độ tương tự với thế giới thực. Trong đại số tuyến tính, bạn có thể chuyển đổi các điểm trong không gian từ một hệ tọa độ này sang hệ tọa độ khác bằng cách nhân các tọa độ của điểm với ma trận đại diện cho mối quan hệ giữa hai hệ tọa độ.

Ma trận chế độ xem được nhân với một điểm để chuyển đổi ma trận từ không gian thế giới sang không gian máy ảnh (quan điểm của máy ảnh). Ma trận chiếu được sử dụng để chuyển đổi một điểm từ không gian camera sang không gian màn hình (hình chữ nhật 2D phẳng của màn hình thiết bị của bạn). Khi bạn gọi update() trên máy ảnh trong Libgdx, nó sẽ áp dụng các thay đổi mới nhất của bạn cho vị trí, hướng, kích thước khung nhìn, trường xem, v.v.để xem và ma trận chiếu để chúng có thể được sử dụng trong trình đổ bóng.

Bạn hiếm khi cần xử lý nội dung trong không gian máy ảnh ở chế độ 2D, vì vậy SpriteBatch không cần chế độ xem và ma trận chiếu riêng biệt. Chúng có thể được kết hợp thành một ma trận đơn lẻ chuyển đổi trực tiếp từ không gian thế giới sang không gian màn hình, mà đã được thực hiện tự động trong Camera, do đó ma trận camera.combined.

SpriteBatch có trình tạo bóng được tích hợp mặc định nhân nhiều ma trận chiếu này với tất cả các đỉnh của hình sprites của bạn để chúng được ánh xạ chính xác tới màn hình phẳng.

Bạn nên gọi setProjectionMatrix bất cứ khi nào bạn đã di chuyển máy ảnh hoặc đổi kích thước màn hình.

Có loại ma trận thứ ba được gọi là ma trận mô hình được sử dụng cho công cụ 3D. Ma trận mô hình mô tả định hướng, quy mô và vị trí của mô hình trong không gian thế giới. Vì vậy, nó được nhân với các tọa độ trong mô hình để di chuyển chúng từ không gian địa phương sang không gian thế giới.

4

Ví dụ như một trò chơi sidescrolling cơ bản. Khi người chơi di chuyển sang một bên, máy ảnh sẽ đi theo họ. Điều này có nghĩa là nơi các đối tượng trên thế giới không nhất thiết phải tương ứng với vị trí của chúng trên màn hình, vì màn hình và thế giới di chuyển tương đối với nhau.

Dưới đây là ví dụ: giả sử màn hình của bạn là 100px * 100px vuông (vì một số lý do). Bạn đặt một đối tượng tại vị trí (50, 0), do đó, nó bây giờ ở giữa và ở dưới cùng của màn hình. Bây giờ hãy nói rằng bạn di chuyển trình phát của bạn sang bên phải và toàn bộ màn hình sẽ quét theo trình phát. Điều này có nghĩa là đối tượng bạn đã đặt trước đó đã chuyển sang trái trên màn hình. Vì vậy, nó vẫn ở (50, 0) trên thế giới, vì nó không thực sự di chuyển tương đối so với phần còn lại của khung cảnh, nhưng nó bây giờ sẽ được rút ra tại, nói, (10, 0) trên màn hình, từ đó một phần của thế giới mà màn hình đang xem đã thay đổi. Đây là sự khác biệt giữa "worldspace" (nơi một đối tượng trên thế giới) và "không gian màn hình" (nơi đối tượng được vẽ trên màn hình thực tế).

Khi bạn cố gắng vẽ bằng SpriteBatch, theo mặc định sẽ giả định tọa độ không gian thế giới giống như tọa độ không gian màn hình: khi bạn nói "vẽ tại (50, 0)", nó sẽ vẽ đối tượng tại (50, 0) trên màn hình. Ngay cả khi máy ảnh di chuyển, nó luôn luôn sẽ vẽ ở (50, 0) trên màn hình, vì vậy khi máy ảnh chảo, đối tượng sẽ làm theo và ở lại bị mắc kẹt vào cùng một vị trí trên màn hình.

Vì bạn thường không muốn điều đó, bạn cung cấp cho SpriteBatch ma trận chiếu , là ma trận chuyển đổi cho biết cách chuyển đổi tọa độ không gian màn hình thành tọa độ không gian thế giới và ngược lại. Bằng cách này, khi bạn nói lô "vẽ tại (50, 0)", nó có thể nhìn vào ma trận nó nhận được từ máy ảnh và thấy rằng, vì máy ảnh đã di chuyển, (50, 0) trên thế giới thực sự có nghĩa là (10, 0) trên màn hình, và nó sẽ vẽ sprite của bạn ở đúng nơi.

Các vấn đề liên quan