From e03265003096038a3990ef140f56a320dc9fad12 Mon Sep 17 00:00:00 2001 From: fnicon Date: Sat, 21 Mar 2026 23:38:34 +0900 Subject: [PATCH] add force sum --- game/love_src/src/system/racing_force.lua | 151 ++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 game/love_src/src/system/racing_force.lua diff --git a/game/love_src/src/system/racing_force.lua b/game/love_src/src/system/racing_force.lua new file mode 100644 index 0000000..959f244 --- /dev/null +++ b/game/love_src/src/system/racing_force.lua @@ -0,0 +1,151 @@ +local vm = require("lib.vornmath") + + +---calculate real desire forward after weight +---@param forward number gas_input +---@param weight number? magic weight constant +---@return number forward actual desire +local function add_forward(forward, weight) + return forward * (weight or 1.0) +end + +---calculate real desire lateral steer after weight +---@param steer number steer_input +---@param weight number? magic weight constant +---@return number lateral +local function add_lateral(steer, weight) + return steer * (weight or 1.0) +end + +---calculate friction impact based on grip +---@param friction number outside friction +---@param grip number car's grip +---@return number friction +local function grip_force(friction, grip) + return friction * grip +end + +---add friction +---@param f vec2 vec2 input +---@param grip number car's grip +---@param friction number floor's friction +---@param weight_tire number? magic weight tire +---@param weight_floor number? magic weight floor +---@return vec2 f vec2 output +local function add_friction(f, grip, friction, weight_tire, weight_floor) + local f_grip = grip_force(grip, friction) + -- tire - floor + return f + f_grip * ((weight_tire or 1.0) - (weight_floor or 0.0)) +end + +---calculate drag's impact based on streamline +---@param drag number|vec2 drag +---@param streamline number car's streamline +---@return number drag +local function drag_force(drag, streamline) + return streamline * drag +end + +---add drag into f +---@param f vec2 input +---@param drag number|vec2 drag +---@param streamline number car's streamline +---@param weight_drag_boost number? magic weight +---@param weight_drag_halt number? magic weight +---@return vec2 f +local function add_drag(v, drag, streamline, weight_drag_boost, weight_drag_halt) + local f_drag = drag_force(drag, streamline) + return v + f_drag * ((weight_drag_boost or 1.0) - (weight_drag_halt or 0.0)) +end + +---add inertia into f +---@param f vec2 input +---@param inertia_force vec2 inertia +---@param inertia_weight number? magic weight +---@return vec2 f +local function add_inertia(f, inertia_force, inertia_weight) + return f + inertia_force * (inertia_weight or 1.0) +end + +---centrifugal_force +---@param mass number car's mass +---@param angular_v number velocity on angular +---@param perpendicular number r +---@return number f +local function centrifugal_force(mass, angular_v, perpendicular) + return mass * angular_v ^ 2 * perpendicular +end + +---add centrifugal +---@param f vec2 +---@param mass number +---@param inertia_force vec2 +---@param weight_centrifugal number? +---@return vec2 f +local function add_centrifugal(v, mass, inertia_force, weight_centrifugal) + local centrifugal = centrifugal_force(mass, inertia_force[1], inertia_force[2]) + + local new_v + if (v[2] > 0) then + new_v = v - vm.vec2(0.0, 1.0) * centrifugal * (weight_centrifugal or 1.0) + elseif (v[2] < 0) then + new_v = v + vm.vec2(0.0, 1.0) * centrifugal * (weight_centrifugal or 1.0) + end + return new_v +end + +---create desire f +---@param desire_forward number forward +---@param desire_steer number lateral +---@param weight_forward number? weight forward +---@param weight_steer number? weight lateral +---@return vec2 desire f +local function add_desire(desire_forward, desire_steer, weight_forward, weight_steer) + local forward = add_forward(desire_forward) + local lateral = add_lateral(desire_steer) + local val = vm.vec2(forward, lateral) + return val +end + +---@param desire_forward number engine's force +---@param desire_steer number axle's steer +---@param grip number car's grip +---@param friction number outside's friction +---@param drag number|vec2 outside's drag +---@param streamline number car's streamline +---@param inertia_force vec2 last's force +---@param mass number car's mass +---@param weight_forward number? magic weight +---@param weight_steer number? magic weight +---@param weight_tire number? magic weight +---@param weight_floor number? magic weight +---@param weight_drag_boost number? magic weight +---@param weight_drag_halt number? magic weight +---@param weight_inertia number? magic weight +---@param weight_centrifugal number? magic weight +local function force_workflow( + desire_forward, desire_steer, + -- friction + grip, friction, + -- drag + drag, streamline, + -- inertia + inertia_force, + -- centrifugal + mass, + weight_forward, weight_steer, + weight_tire, weight_floor, + weight_drag_boost, weight_drag_halt, + weight_inertia, + weight_centrifugal +) + local val = add_desire(desire_forward, desire_steer, weight_forward, weight_steer) + val = add_friction(val, grip, friction, weight_tire, weight_floor) + val = add_drag(val, drag, streamline, weight_drag_boost, weight_drag_halt) + val = add_inertia(val, inertia_force, weight_inertia) + val = add_centrifugal(val, mass, inertia_force, weight_centrifugal) + + return val +end + +return force_workflow