Cách tạo một mũi tên hạ cánh tại một vị trí cụ thể trong không gian thế giới 3D


8

Trong trò chơi của tôi khi tôi nhấp chuột trên địa hình ở đâu đó, tôi muốn người chơi bắn một mũi tên đến vị trí đó theo kiểu parabol.

Mũi tên có vị trí, gia tốc và vận tốc đều sử dụng vectơ 3D. Tôi đã xem Quỹ đạo của một bài báo phóng trên wikipedia, nhưng tôi không biết làm thế nào để áp dụng nó trong tình huống của mình vì nó giải thích toán học 2D. Tôi đã tự hỏi nếu có một giải pháp cho vectơ 3D? Bất kỳ tài nguyên tốt có lẽ liên quan đến tình huống 3D?


5
Tôi sẽ không viết đây là câu trả lời vì tôi hy vọng ai đó có thể trả lời kỹ lưỡng hơn, nhưng bạn có thể sử dụng giải pháp 2D trong 3D. Giải pháp 2D áp dụng cho mặt phẳng thẳng đứng chạy qua điểm bắt đầu và điểm kết thúc, vì vậy bạn lấy giải pháp 2D và xoay nó để khớp với mặt phẳng đó trong không gian 3D.
Kylotan

Câu trả lời:


12

Để mở rộng nhận xét của Kylotan, Bạn có thể sử dụng các công thức 2D ở chế độ 3D. Giả sử Y lên:

tính toán vị trí của mục tiêu trong không gian X'Y'Z ', trong đó trục X' song song với hướng bay của mũi tên, trục Y 'lên và Z' vuông góc với trục X 'và Y'.

biểu đồ

Khi bạn đã tính X 'và Y', bạn có thể chuyển đổi trở lại không gian XYZ thực

Thí dụ

Một cung thủ đang ở (1,0,1). Anh ta muốn bắn một mũi tên tới (4,0,5). Chúng tôi lấy X 'là vectơ đơn vị (0,6, 0, 0,8) vì nó trỏ trực tiếp từ nguồn đến điểm đích. Sau đó, chúng tôi lấy Z 'là (-0,8, 0, 0,6) vì nó là một hình vuông góc, nhưng vì mũi tên không di chuyển theo trục Z ,, nên chúng tôi sẽ bỏ qua nó. Vấn đề của bạn bây giờ là tìm ra cách bắn một mũi tên từ (0,0) đến (0,5) trong không gian X'Y '.

.. làm tính toán 2D ở đây. Lưu ý rằng có thể bạn sẽ muốn các hàm tham số của X 'và Y' về mặt t , biến thời gian.

Một cách để trừu tượng chuyển đổi giữa hai tọa độ là sử dụng ma trận biến đổi.

let archer = Vector3d(1.0,0.0,1.0)
let target = Vector3d(4.0,0.0,5.0)
let travel = target - archer
let transform = Matrix4d.CreateTranslation(-archer) *
                Matrix4d.CreateRotationY(Math.Atan2(travel.Z,travel.X)) 
Vector3d.Transform(archer, transform) // transforms archer to (0,0,0)
Vector3d.Transform(target, transform) // transforms target to (5,0,0)

khi chúng tôi chuyển đổi trở lại từ X'Y'Z ' sang XYZ , đây đơn giản là một phép biến đổi tuyến tính ngược.

let inverse = Matrix4d.Invert(transform)
Vector3d.Transform(Vector3d.Zero, transform) // transforms (0,0,0) to (1,0,1)

Cảm ơn, tôi quản lý để làm cho nó hoạt động! Vẫn đang tìm cách làm cho nó hoạt động với các độ cao khác nhau ... :)
Nick

Không! Ơ Điều này có thể được giải quyết bằng phương pháp phân tích theo bất kỳ chiều nào mà không cần dùng đến thay đổi tọa độ hoặc lượng giác. Xem Làm thế nào để tính toán khả năng tăng tốc khi nhắm đạn?playtechs.blogspot.com/2007/04/aiming-at-moving-target.html để biết ví dụ.
Electro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.