Chuyển động cong giữa hai điểm


15

Một kỹ thuật tốt để cho phép một đối tượng di chuyển giữa các điểm trong một chuyển động cong đẹp là gì?

Vị trí cuối cũng có thể là trong chuyển động, chẳng hạn như quỹ đạo của một tên lửa dẫn đường.

Câu trả lời:


11

Giả sử bạn muốn đây là một thứ theo từng khung hình (nơi mục tiêu thậm chí có thể di chuyển), và không phải là một quỹ đạo được tính toán trước, điều này thực sự rất đơn giản:

Mỗi khung, so sánh vectơ vận tốc của tên lửa với vectơ ( mục tiêu vị trí - tên lửa vị trí ) ; đó là vectơ chỉ từ tên lửa đến mục tiêu. Mỗi khung hình, nếu hai vectơ không có cùng hướng, sau đó xoay vectơ-vectơ một chút về phía vectơ khác, vì vậy mọi khung hình tên lửa sẽ tiến gần hơn một chút để nhìn vào mục tiêu của nó.

Bạn có thể xác định nên xoay theo chiều kim đồng hồ hay ngược chiều kim đồng hồ bằng cách nhìn vào dấu hiệu của sản phẩm chéo giữa hai vectơ.


[Chỉnh sửa] Mã XNA-ish (Tôi không có XNA để kiểm tra điều này):

//Once a frame:

//Get vector spanning from missile to target
Vector2 vectorToTarget = target.Position - missile.Position;

//Convert to Vector3 to do cross-product
Vector3 vectorToTarget3 = new Vector3(vectorToTarget, 0);
Vector3 missileVelocity3 = new Vector3(missile.Velocity, 0);

//Rotate clockwise/counter-clockwise is determined by sign of cross-product
int crossProductSign = Vector3.Cross(missileVelocity3, vectorToTarget3).Z;

//Positive cross-product means rotate counter-clockwise, negative is clockwise
double rotationAngle = 0;
if(crossProductSign > 0)
    rotationAngle = -0.05;
else if(crossProductSign < 0)
    rotationAngle = 0.05;

//I'm not sure how to do rotation in XNA, but the internets tell me it's something like this:
missile.velocity = Vector2.Transform(missile.velocity, Matrix.CreateRotationZ(rotationAngle))

Lưu ý rằng, vì rotationAnglechỉ có ba giá trị có thể, tất cả các giá trị Matrix.CreateRotationZ(rotationAngle)có thể có thể được lưu trong bộ nhớ cache để bạn không phải gọi nó là mọi khung.


Bạn có thể cung cấp một số mã giả vì tôi là người mới đối với tất cả điều này. Tôi hiện chỉ làm việc ở chiều thứ 2 để loại bỏ một số biến chứng.
ẩn danh

@anonymousouse: chắc chắn, hãy thử điều này
BlueRaja - Danny Pflughoeft

15

Có hai kỹ thuật có thể:

Kỹ thuật đầu tiên là thực hiện mô phỏng dựa trên khung . Điều này là tốt nếu bạn đang làm một cái gì đó giống như một tên lửa heap trong trò chơi, mà không phải bắn chính xác mục tiêu của bạn.

Trong trường hợp này, bạn muốn theo dõi vị trí và vận tốc của đối tượng. Mỗi khung nhìn vào hướng đến mục tiêu và hướng chuyển động hiện tại, và điều chỉnh vận tốc phù hợp.

Nếu bạn chụp vận tốc ngay lập tức, tên lửa của bạn sẽ luôn bắn trúng mục tiêu. Nhưng nếu bạn điều chỉnh vận tốc với một lượng nhỏ mỗi khung hình, tên lửa của bạn sẽ cong về phía mục tiêu - và nếu nó cong đủ chậm, mục tiêu có thể tránh được nó.

Kỹ thuật thứ hai là sử dụng một phương pháp tham số . Điều này rất hữu ích để tạo hiệu ứng cho những thứ mà bạn muốn bắn trúng mục tiêu của mình một cách chính xác và có thể dự đoán được. Trong trường hợp này, bạn thường lấy "thời gian" làm tham số của mình và đặt nó vào một chức năng nào đó.

Một tập hợp các hàm đặc biệt hữu ích là các phương trình chuyển động mà bạn đã học trong vật lý trung học. Bằng cách áp dụng những điều này cho cả hai trục, bạn có thể có được quỹ đạo đạn đạo. Với một chút toán học, bạn có thể xác định các tham số ban đầu để bắn trúng mục tiêu - thậm chí là di chuyển, nếu nó di chuyển có thể dự đoán được.

XNA cũng cung cấp một số hàm nội suy và chuyển động cong. Hãy xem các tài liệu cho Vector2 và choMathHelper . Chúng cung cấp một số hàm nội suy mà bạn có thể sử dụng và thậm chí kết hợp để làm những điều thú vị. Ví dụ: bắn tên lửa: Lerp(nội suy tuyến tính) vị trí tên lửa của bạn từ điểm bắt đầu đến vị trí mục tiêu và cũng lerp vị trí mục tiêu đó từ một số mục tiêu ban đầu đến vị trí thực sự (thay đổi) của đối tượng mục tiêu. Điều này sẽ cung cấp cho bạn một hiệu ứng "khóa trên" tốt đẹp.

(Ngoài ra còn có một số chức năng để tạo đường cong, ví dụ: CatmulRom, Hermite. Có lẽ chúng khó sử dụng thành công hơn với mục tiêu di động.)

Nếu bạn xem xét "nới lỏng" (trong ngữ cảnh của hình ảnh động), bạn có thể nhận được một số hàm nội suy thú vị hơn có thể cung cấp cho bạn các hiệu ứng thú vị như tăng tốc.

Bây giờ - bạn có thể nói rằng kỹ thuật này cho một số kết quả kỳ lạ khi mục tiêu của bạn di chuyển xung quanh. Tuy nhiên, trên thực tế, miễn là đạn của bạn di chuyển nhanh hơn mục tiêu của bạn, nó thường trông ổn. Nếu đó là một vấn đề, có lẽ bạn vẫn nên sử dụng một kỹ thuật dựa trên khung.


3

Bạn có thể muốn tìm kiếm sóng hình sin hoặc có thể là Bezier Curves . Tôi không biết liệu phương pháp sóng hình sin có bình thường hay không, nhưng tôi không thể hiểu tại sao nó lại nghèo đến thế.


Sử dụng các đường cong Bezier với B-Splines cho phép thể hiện khá chính xác bất kỳ đường cong nào. Nếu bạn cần độ chính xác, các spline của Herm Hermit chính xác hơn một chút. Hãy nhớ rằng, đôi khi sự không chính xác cung cấp một liên lạc chào đón của hữu cơ.
doppelgreener

+1 cho các đường cong Bezier. Đối với việc sử dụng được mô tả, nó có lẽ là dễ nhất và dễ kiểm soát nhất.
ggambett

1

Bạn có thể xem Hành vi chỉ đạo, như được định nghĩa bởi Craig Reynold: http://red3d.com/cwr/steer/

Điều này thường được sử dụng trong AI để NPC di chuyển về phía mục tiêu của chúng.

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.