Đây là vấn đề tôi gặp phải khi cố gắng triển khai trò chơi bằng cách sử dụng công cụ LÖVE, bao gồm box2d với Lua scripting.Lập trình trò chơi vật lý box2d - định hướng đối tượng giống như tháp pháo bằng cách sử dụng các mảnh
Mục tiêu rất đơn giản: Đối tượng giống như tháp pháo (nhìn từ trên cùng, trên môi trường 2D) cần định hướng chính nó để nó trỏ đến mục tiêu.
Tháp pháo nằm trên tọa độ x, y và mục tiêu là trên tx, ty. Chúng ta có thể xem xét rằng x, y được cố định, nhưng tx, ty có xu hướng thay đổi từ một thời điểm này sang một thời điểm khác (tức là chúng sẽ là con trỏ chuột).
Tháp pháo có rôto có thể áp dụng lực quay (mô-men xoắn) vào bất kỳ thời điểm nào, theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ. Độ lớn của lực đó có giới hạn trên gọi là maxTorque.
Tháp pháo cũng có quán tính quay nhất định, hoạt động cho chuyển động góc cũng giống như cách khối lượng hoạt động cho chuyển động tuyến tính. Không có ma sát nào, vì vậy tháp pháo sẽ tiếp tục quay nếu nó có vận tốc góc.
Tháp pháo có chức năng AI nhỏ đánh giá lại hướng của nó để xác minh rằng nó chỉ đúng hướng và kích hoạt bộ xoay. Điều này xảy ra mỗi dt (~ 60 lần mỗi giây). Có vẻ như sau:
function Turret:update(dt)
local x,y = self:getPositon()
local tx,ty = self:getTarget()
local maxTorque = self:getMaxTorque() -- max force of the turret rotor
local inertia = self:getInertia() -- the rotational inertia
local w = self:getAngularVelocity() -- current angular velocity of the turret
local angle = self:getAngle() -- the angle the turret is facing currently
-- the angle of the like that links the turret center with the target
local targetAngle = math.atan2(oy-y,ox-x)
local differenceAngle = _normalizeAngle(targetAngle - angle)
if(differenceAngle <= math.pi) then -- counter-clockwise is the shortest path
self:applyTorque(maxTorque)
else -- clockwise is the shortest path
self:applyTorque(-maxTorque)
end
end
... không thành công. Hãy để tôi giải thích với hai tình huống minh họa:
- Tháp pháo "dao động" xung quanh targetAngle.
- Nếu mục tiêu là "ngay phía sau tháp pháo, chỉ cần một chút đồng hồ", tháp pháo sẽ bắt đầu áp dụng mômen theo chiều kim đồng hồ và tiếp tục áp dụng chúng cho đến khi nó vượt qua góc mục tiêu. Tại thời điểm đó nó sẽ bắt đầu áp dụng mômen theo hướng ngược lại. Nhưng nó sẽ đạt được vận tốc góc quan trọng, vì vậy nó sẽ tiếp tục đi theo chiều kim đồng hồ trong một thời gian ... cho đến khi mục tiêu sẽ là "ngay phía sau, nhưng một chút ngược chiều kim đồng hồ". Và nó sẽ bắt đầu lại. Vì vậy, tháp pháo sẽ dao động hoặc thậm chí đi trong vòng tròn.
Tôi nghĩ tháp pháo của tôi nên bắt đầu áp dụng các mômen xoắn theo hướng ngược lại của đường đi ngắn nhất trước khi đạt đến góc đích (như phanh xe trước khi dừng).
Bằng trực giác, tôi nghĩ tháp pháo nên "bắt đầu áp dụng các mômen xoắn theo hướng ngược lại của đường đi ngắn nhất khi nó gần bằng nửa đường đến mục tiêu đích". Trực giác của tôi nói với tôi rằng nó có liên quan đến vận tốc góc. Và sau đó có một thực tế là các mục tiêu là điện thoại di động - Tôi không biết nếu tôi nên đưa vào tài khoản bằng cách nào đó hoặc chỉ cần bỏ qua nó.
Làm cách nào để tính toán khi nào tháp pháo phải "bắt đầu phanh"?
Vấn đề với phương pháp này là nó được thiết kế cho những thứ như hệ thống sưởi, nơi bạn kiểm soát đạo hàm đầu tiên của nhiệt độ; egarcia là mô-men xoắn kiểm soát, đó là mô-men xoắn thứ hai. P sẽ vượt qua wildly vì mục tiêu của nó cho một = 0, không w = 0, tôi không giúp với dao động, D có thể làm việc nhưng nó sẽ làm cho quá trình SLOW. – Beta
Bạn nói đúng, ví dụ tôi đưa ra không trực tiếp đối phó với mô-men xoắn. Tuy nhiên 'maxAngleMomentum' tỉ lệ với' maxTorque' khi ta xem xét ma sát trong cơ chế quay 'tháp pháo' - người ta có thể xem chúng có thể hoán đổi cho nhau khi sử dụng các đơn vị tùy ý. – Brendan
Việc triển khai có vẻ ổn. Ý tưởng "bảo tồn động lượng góc" là thú vị. Tuy nhiên đây không phải là những gì tôi đã yêu cầu- Tôi muốn áp dụng mô-men xoắn, trong khi ở cuối bạn đang thiết lập các góc chính mình. Nhưng 1 để làm cho một bản demo và mã sang trọng. – kikito