2012-01-15 26 views
9

Tôi đang tạo trò chơi mà người chơi kéo thuyền xung quanh bằng ngón tay. Tôi đang sử dụng Box2D cho các khía cạnh vật lý của trò chơi. Đặc biệt, tôi đang sử dụng b2MouseJoint để đính kèm sự kiện chạm vào thuyền để cho sự kiện chạm kéo thuyền.Mô phỏng khả năng chống nước trong Box2D

Nhưng có một vấn đề, đó là cách con thuyền di chuyển trong khi nó đang bị kéo là không thực tế; nó chỉ đơn giản có thể được kéo ở bất kỳ hướng nào, nơi mà trong thế giới thực, một chiếc thuyền chỉ có thể di chuyển dọc theo chiều dài của nó và sẽ có khả năng chống nước khiến khó thay đổi hướng di chuyển của thuyền. Vì vậy, tôi cần một cách để mô phỏng khả năng chống nước để làm cho phong trào thuyền thực tế.

Có thể mô phỏng nó trong Box2D không? Giảm xóc tuyến tính và giảm xóc góc chỉ đơn giản là làm cho chiếc thuyền khó di chuyển, nhưng tôi chỉ muốn chiếc thuyền dễ di chuyển theo một hướng và nó chỉ nên chống lại sự thay đổi hướng.

P.S. Tôi không nghĩ rằng mình cần đăng mã cho câu hỏi này, nhưng hãy cho tôi biết nếu bạn muốn xem đoạn mã.

+2

Bạn đã thử sử dụng [phương trình kéo] (http://en.wikipedia.org/wiki/Drag_equation) chưa? Thuật ngữ diện tích mặt cắt * A * sẽ thay đổi tùy thuộc vào hướng của thuyền tương ứng với vận tốc của nó, mà nên làm những gì bạn muốn. Và bạn luôn có thể ước tính * A * với một số heuristic rẻ tiền. – Rahul

+0

@Rahul, cảm ơn gợi ý. Tôi đã thêm phương trình kéo vào mã với một số kỹ thuật xấp xỉ (như sử dụng tốc độ so với góc thuyền để đưa ra khu vực tham chiếu), tôi có thể thấy một số khả năng chống nước được mô phỏng trong mã mới nhất nhưng dường như có một số chuyển động điên rồ khi thuyền va chạm với biên giới thế giới. Tôi đang cố gắng hiểu được những gì sai trước khi yêu cầu trợ giúp thêm ở đây. Một lần nữa, cảm ơn cho gợi ý. – Lukman

+0

Một cách giải quyết táo bạo có thể là tạo ra rất nhiều thân tròn rất nhỏ với khối lượng nhỏ để lấp đầy không gian xung quanh thuyền. Tôi đã không kiểm tra khả năng tồn tại của điều này về vật lý hoặc sức mạnh xử lý (chưa) đó là lý do tại sao tôi không gửi nó như là một câu trả lời đúng. – Andrey

Trả lời

1

Tôi có một đề xuất có thể tầm thường nhưng đòi hỏi nhiều hạt và có thể có thêm một số sức mạnh xử lý. Bạn có thể có thể tạo ra nhiều vòng tròn nhỏ với va chạm nhưng có chúng không được rút ra. Vì vậy, bạn sẽ nhận được hiệu ứng mô phỏng của nước, nhưng không phải là nước. Kích thước của các vòng tròn sẽ xác định có bao nhiêu người trong số họ, bạn cần phải điền vào màn hình và do đó cũng có hiệu suất của bạn. Tôi biết một chút của nó về một giải pháp hack nhưng nó có thể có giá trị một shot. Bạn sẽ tìm thấy một phương tiện hạnh phúc cho kích thước của các vòng tròn mà cả hai cho phép cho hiệu suất tốt và chất lỏng như động lực học.

Rất tiếc, có vẻ như ai đó đã đề xuất điều này ... Rất tiếc.

+0

Thật không may, IMO, những hạt đó sẽ can thiệp vào các vật thể vật lý khác tồn tại trong thế giới nên tôi không muốn sử dụng kỹ thuật tấn công này. Nhờ đề nghị mặc dù. – Lukman

+0

@Fred Tôi đã kết thúc chơi với nó, và nó là một vấn đề lớn nhận được sự cân bằng đúng - hoặc các vòng tròn quá lớn và cản trở * tất cả * chuyển động, hoặc toàn bộ điều quá thuế trên bộ vi xử lý của tôi. Tâm trí bạn, tôi đã thử nó trên cổng JS, mà tôi nghĩ là bình thường một chút chậm hơn. – Andrey

2

Điều này thực sự không phải là điều nhỏ nhặt, vì vậy câu trả lời 'hoàn chỉnh' là một chút để hy vọng. Here là liên kết đến ví dụ về ô tô trong ô2d. Xem phần demoreel của người đàn ông đó (bản demo thứ ba trong cuộn có liên quan nhất), và hãy ngó ngàng với mã nguồn của anh ta. Mô phỏng của anh ấy tiên tiến hơn một chút so với những gì bạn cần để hoàn thành, vì vậy nếu bạn có thể hiểu nó hoạt động như thế nào bạn sẽ không gặp vấn đề gì khi tạo một phiên bản đơn giản hơn.

Có rất nhiều mã (dễ hiểu) trong phần mở rộng box2d của dougk16, vì vậy có thể khó xác định chính xác cách hoạt động của xe. Vì vậy, đây là một điểm khởi đầu đơn giản: Bạn muốn mô phỏng một cơ thể có thể di chuyển về phía trước và phía sau, và cũng quay. Vì vậy, đó là một lực kéo dài về phía trước hoặc phía sau từ mặt hiện tại của thân thuyền, và một mô-men xoắn sẽ biến cơ thể sang trái hoặc sang phải. Đây sẽ là tất cả những gì bạn cần để có được một thứ khá hay. Dưới đây là một số giả đó sẽ là một nơi hợp lý để bắt đầu:

if(needs_to_turn) 
{ 
    // turn_direction will either be -1 (left) or 1 (right), boat_torque can be a constant to start with, but should probably be controlled by the user 
    body.ApplyTorque(turn_direction * boat_torque); 
} 

if(needs_to_move) 
{ 
    // facing_vector should be a vector pointing in the direction the boat is facing, the boat_force could be a constant, but again should be controlled by the user 
    body.ApplyForce(facing_vector * boat_force); 
} 

Tôi sẽ kết thúc câu trả lời của tôi với link khác, lần này đến một hướng dẫn có liên quan. Nó không phải là mát mẻ như các công cụ kịch bản hành động của dougk16, nhưng nó có thể hữu ích hơn cho bạn, vì nó ở định dạng hướng dẫn.

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