mirror of
https://github.com/APercy/airutils.git
synced 2025-03-21 18:41:21 +00:00
ground effect added
This commit is contained in:
parent
e63ba8409b
commit
d0b8ba9ea8
1 changed files with 84 additions and 1 deletions
85
init.lua
85
init.lua
|
@ -115,6 +115,35 @@ function airutils.detect_player_api(player)
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function get_nodedef_field(nodename, fieldname)
|
||||||
|
if not minetest.registered_nodes[nodename] then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
return minetest.registered_nodes[nodename][fieldname]
|
||||||
|
end
|
||||||
|
|
||||||
|
--for
|
||||||
|
function airutils.eval_vertical_interception(initial_pos, end_pos)
|
||||||
|
local ret_y = nil
|
||||||
|
local cast = minetest.raycast(initial_pos, end_pos, true, true)
|
||||||
|
local thing = cast:next()
|
||||||
|
while thing do
|
||||||
|
if thing.type == "node" then
|
||||||
|
local pos = thing.intersection_point
|
||||||
|
if pos then
|
||||||
|
local nodename = minetest.get_node(thing.under).name
|
||||||
|
local drawtype = get_nodedef_field(nodename, "drawtype")
|
||||||
|
if drawtype ~= "plantlike" then
|
||||||
|
ret_y = pos.y
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
thing = cast:next()
|
||||||
|
end
|
||||||
|
return ret_y
|
||||||
|
end
|
||||||
|
|
||||||
--lift
|
--lift
|
||||||
local function pitchroll2pitchyaw(aoa,roll)
|
local function pitchroll2pitchyaw(aoa,roll)
|
||||||
if roll == 0.0 then return aoa,0 end
|
if roll == 0.0 then return aoa,0 end
|
||||||
|
@ -127,7 +156,61 @@ local function pitchroll2pitchyaw(aoa,roll)
|
||||||
return pitch,yaw
|
return pitch,yaw
|
||||||
end
|
end
|
||||||
|
|
||||||
function airutils.getLiftAccel(self, velocity, accel, longit_speed, roll, curr_pos, lift, max_height)
|
function lerp(a, b, c)
|
||||||
|
return a + (b - a) * c
|
||||||
|
end
|
||||||
|
|
||||||
|
function quadBezier(t, p0, p1, p2)
|
||||||
|
local l1 = lerp(p0, p1, t)
|
||||||
|
local l2 = lerp(p1, p2, t)
|
||||||
|
local quad = lerp(l1, l2, t)
|
||||||
|
return quad
|
||||||
|
end
|
||||||
|
|
||||||
|
function airutils.get_ground_effect_lift(self, curr_pos, lift, wingspan)
|
||||||
|
local half_wingspan = wingspan/2
|
||||||
|
local initial_pos = {x=curr_pos.x, y=curr_pos.y, z=curr_pos.z} --lets make my own table to avoid interferences
|
||||||
|
if self._last_ground_effect_eval == nil then self._last_ground_effect_eval = 0 end
|
||||||
|
self._last_ground_effect_eval = self._last_ground_effect_eval + self.dtime --dtime cames from mobkit
|
||||||
|
local ground_distance = wingspan
|
||||||
|
if self._last_ground_effect_eval >= 0.4 then
|
||||||
|
--self._last_ground_effect_eval = 0
|
||||||
|
local ground_y = airutils.eval_vertical_interception(initial_pos, {x=initial_pos.x, y=initial_pos.y - half_wingspan, z=initial_pos.z})
|
||||||
|
if ground_y then
|
||||||
|
ground_distance = curr_pos.y - ground_y
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--smooth the curve
|
||||||
|
local distance_factor = ((ground_distance) * 1) / (wingspan)
|
||||||
|
local effect_factor = quadBezier(distance_factor, 0, wingspan, 0)
|
||||||
|
if effect_factor < 0 then effect_factor = 0 end
|
||||||
|
if effect_factor > 0 then
|
||||||
|
effect_factor = math.abs( half_wingspan - effect_factor )
|
||||||
|
end
|
||||||
|
|
||||||
|
local lift_factor = ((effect_factor) * 1) / (half_wingspan) --agora isso é um percentual
|
||||||
|
local max_extra_lift_percent = 0.5 * lift --e aqui o maximo extra de sustentação
|
||||||
|
local extra_lift = max_extra_lift_percent * lift_factor
|
||||||
|
|
||||||
|
return extra_lift
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- velocity: velocity table
|
||||||
|
-- accel: current acceleration
|
||||||
|
-- longit_speed: the vehicle speed
|
||||||
|
-- roll: roll angle
|
||||||
|
-- curr_pos: current position
|
||||||
|
-- lift: lift factor (very simplified)
|
||||||
|
-- max_height: the max ceilling for the airplane
|
||||||
|
-- wingspan: for ground effect calculation
|
||||||
|
function airutils.getLiftAccel(self, velocity, accel, longit_speed, roll, curr_pos, lift, max_height, wingspan)
|
||||||
|
wingspan = wingspan or 10
|
||||||
|
local ground_effect_extra_lift = airutils.get_ground_effect_lift(self, curr_pos, lift, wingspan)
|
||||||
|
--minetest.chat_send_all('lift: '.. lift ..' - extra lift: '.. ground_effect_extra_lift)
|
||||||
|
lift = lift + ground_effect_extra_lift
|
||||||
|
|
||||||
--lift calculations
|
--lift calculations
|
||||||
-----------------------------------------------------------
|
-----------------------------------------------------------
|
||||||
max_height = max_height or 20000
|
max_height = max_height or 20000
|
||||||
|
|
Loading…
Add table
Reference in a new issue