Tôi đang viết một trò chơi 2D trong đó thế giới trò chơi của tôi có trục x chạy từ trái sang phải, trục y chạy từ trên xuống dưới và trục z ra khỏi màn hình:
Trong khi thế giới trò chơi của tôi từ trên xuống, trò chơi được hiển thị ở độ nghiêng nhẹ:
Tôi đang làm việc để chiếu từ không gian thế giới sang không gian màn hình và ngược lại. Tôi có trước đây làm việc như sau:
var viewport = new Viewport(0, 0, this.ScreenWidth, this.ScreenHeight);
var screenPoint = viewport.Project(worldPoint.NegateY(), this.ProjectionMatrix, this.ViewMatrix, this.WorldMatrix);
Các NegateY()
phương pháp khuyến nông thực hiện chính xác những gì nó giống như âm thanh, vì XNA của y trục chạy dưới lên trên thay vì trên xuống dưới. Ảnh chụp màn hình ở trên cho thấy tất cả điều này làm việc. Về cơ bản, tôi có một loạt các điểm trong không gian 3D mà sau đó tôi kết xuất trong không gian màn hình. Tôi có thể sửa đổi các thuộc tính máy ảnh trong thời gian thực và thấy nó hoạt hình sang vị trí mới. Rõ ràng trò chơi thực tế của tôi sẽ sử dụng các họa tiết thay vì điểm và vị trí camera sẽ được cố định, nhưng tôi chỉ cố gắng để có được tất cả các phép toán tại chỗ trước khi đến đó.
Bây giờ, tôi đang cố gắng chuyển đổi ngược lại theo cách khác. Nghĩa là, cho một điểm x và y trong không gian màn hình ở trên, xác định điểm tương ứng trong không gian thế giới. Vì vậy, nếu tôi chỉ con trỏ vào, giả sử, phía dưới bên trái của hình thang màu xanh lá cây, tôi muốn có được một không gian đọc thế giới của (0, 480). Các tọa độ z là không liên quan. Hoặc, đúng hơn, tọa độ z sẽ luôn bằng 0 khi ánh xạ trở lại không gian thế giới. Về cơ bản, tôi muốn thực hiện chữ ký phương thức này:
public Vector2 ScreenPointToWorld(Vector2 point)
Tôi đã thử một vài thứ để làm việc này nhưng không gặp may. Suy nghĩ mới nhất của tôi là tôi cần gọi Viewport.Unproject
hai lần với các giá trị z gần / xa khác nhau , tính toán kết quả Ray
, bình thường hóa nó, sau đó tính toán giao điểm của Ray
một Plane
điểm cơ bản đại diện cho thế giới của tôi. Tuy nhiên, tôi đã bị kẹt ở bước cuối cùng và không chắc liệu tôi có quá phức tạp không.
Bất cứ ai có thể chỉ cho tôi đi đúng hướng về cách để đạt được điều này?