flight improvements - now using set_velocity instead acceleration

master
Alexsandro Percy 2021-10-16 14:53:28 -03:00
parent 059ce8c946
commit e57b377b2d
5 changed files with 50 additions and 29 deletions

View File

@ -19,7 +19,7 @@ end
function hidroplane.powerAdjust(self,dtime,factor,dir,max_power)
local max = max_power or 100
local add_factor = factor
local add_factor = factor/2
add_factor = add_factor * (dtime/hidroplane.ideal_step) --adjusting the command speed by dtime
local power_index = self._power_lever
@ -97,11 +97,13 @@ function hidroplane.control(self, dtime, hull_direction, longit_speed, longit_dr
hidroplane.powerAdjust(self, dtime, factor, -1)
if self._power_lever <= 0 and is_flying == false then
--break
if longit_speed >= 0.1 then
if longit_speed > 0 then
engineacc = -1
if (longit_speed + engineacc) < 0 then engineacc = longit_speed * -1 end
end
if longit_speed <= -0.1 then
if longit_speed < 0 then
engineacc = 1
if (longit_speed + engineacc) > 0 then engineacc = longit_speed * -1 end
end
if abs(longit_speed) < 0.1 then
stop = true
@ -172,11 +174,11 @@ function hidroplane.set_pitch(self, dir, dtime)
end
function hidroplane.set_yaw(self, dir, dtime)
local yaw_factor = 30
local yaw_factor = 25
if dir == 1 then
self._rudder_angle = math.max(self._rudder_angle-yaw_factor*dtime,-hidroplane.rudder_limit)
self._rudder_angle = math.max(self._rudder_angle-(yaw_factor*dtime),-hidroplane.rudder_limit)
elseif dir == -1 then
self._rudder_angle = math.min(self._rudder_angle+yaw_factor*dtime,hidroplane.rudder_limit)
self._rudder_angle = math.min(self._rudder_angle+(yaw_factor*dtime),hidroplane.rudder_limit)
end
end
@ -216,6 +218,7 @@ function hidroplane.engineSoundPlay(self)
loop = true,})
end
--obsolete, will be removed
function getAdjustFactor(curr_y, desired_y)
local max_difference = 0.1
local adjust_factor = 0.5
@ -231,19 +234,27 @@ function hidroplane.autopilot(self, dtime, hull_direction, longit_speed, accel,
local max_autopilot_power = 85
local max_attack_angle = 1.8
--climb
local velocity = self.object:get_velocity()
local climb_rate = velocity.y * 1.5
if climb_rate > 5 then climb_rate = 5 end
if climb_rate < -5 then
climb_rate = -5
end
self._acceleration = 0
if self._engine_running then
--engine acceleration calc
local engineacc = (self._power_lever * hidroplane.max_engine_acc) / 100;
self.engine:set_animation_frame_speed(60 + self._power_lever)
local factor = getAdjustFactor(curr_pos.y, self._auto_pilot_altitude)
local factor = math.abs(climb_rate * 0.5) --getAdjustFactor(curr_pos.y, self._auto_pilot_altitude)
--increase power lever
if self._auto_pilot_altitude < curr_pos.y then
if climb_rate > 0.2 then
hidroplane.powerAdjust(self, dtime, factor, -1)
end
--decrease power lever
if self._auto_pilot_altitude > curr_pos.y then
if climb_rate < 0 then
hidroplane.powerAdjust(self, dtime, factor, 1, max_autopilot_power)
end
--do not exceed

View File

@ -52,19 +52,31 @@ function hidroplane.physics(self)
snodepos.y = snodepos.y+1
surfnode = mobkit.nodeatpos(snodepos)
end
local new_velocity = nil
self.isinliquid = surfnodename
if surface then -- standing in liquid
self.isinliquid = true
local submergence = min(surface-spos.y,self.height)/self.height
local height = self.height
local submergence = min(surface-spos.y,height)/height
-- local balance = self.buoyancy*self.height
local buoyacc = mobkit.gravity*(self.buoyancy-submergence)
mobkit.set_acceleration(self.object,
{x=-vel.x*self.water_drag,y=buoyacc-vel.y*abs(vel.y)*0.4,z=-vel.z*self.water_drag})
--[[mobkit.set_acceleration(self.object,
{x=-vel.x*self.water_drag,y=buoyacc-vel.y*abs(vel.y)*0.4,z=-vel.z*self.water_drag})]]--
local accell = {x=-vel.x*self.water_drag,y=buoyacc-vel.y*abs(vel.y)*0.4,z=-vel.z*self.water_drag}
local v_accell = {x=-0,y=buoyacc-vel.y*abs(vel.y)*0.4,z=0}
mobkit.set_acceleration(self.object,v_accell)
new_velocity = vector.add(vel, vector.multiply(accell, self.dtime/8))
--self.object:set_velocity(new_velocity)
else
mobkit.set_acceleration(self.object,{x=0,y=0,z=0})
self.isinliquid = false
self.object:set_acceleration({x=0,y=mobkit.gravity,z=0})
new_velocity = vector.add(vel, {x=0,y=mobkit.gravity * self.dtime,z=0})
--self.object:set_velocity(new_velocity)
end
--self.object:set_acceleration({x=0,y=mobkit.gravity,z=0})
new_velocity = vector.add(new_velocity, vector.multiply(self._last_accell, self.dtime))
self.object:set_velocity(new_velocity)
end

View File

@ -290,6 +290,7 @@ minetest.register_entity("hidroplane:hidro", {
stored_color = self._color,
stored_power_lever = self._power_lever,
stored_driver_name = self.driver_name,
stored_last_accell = self._last_accell,
})
end,
@ -303,6 +304,7 @@ minetest.register_entity("hidroplane:hidro", {
self._color = data.stored_color
self._power_lever = data.stored_power_lever
self.driver_name = data.stored_driver_name
self._last_accell = data.stored_last_accell
--minetest.debug("loaded: ", self._energy)
end
hidroplane.setText(self)

View File

@ -291,7 +291,8 @@ function hidroplane.testImpact(self, velocity, position)
collision = true
else
self.object:set_velocity(self._last_vel)
self.object:set_acceleration(self._last_accell)
--self.object:set_acceleration(self._last_accell)
self.object:set_velocity(vector.add(velocity, vector.multiply(self._last_accell, self.dtime/8)))
end
end
local impact = abs(hidroplane.get_hipotenuse_value(velocity, self._last_vel))
@ -425,11 +426,7 @@ end
function hidroplane.flightstep(self)
local velocity = self.object:get_velocity()
--hack to avoid glitches
self.object:set_velocity(velocity)
local curr_pos = self.object:get_pos()
self.object:set_pos(curr_pos)
hidroplane.last_time_command = hidroplane.last_time_command + self.dtime
local player = nil
@ -542,7 +539,7 @@ function hidroplane.flightstep(self)
-- adjust pitch at ground
if is_flying == false then --isn't flying?
if math.abs(longit_speed) < hidroplane.min_speed - 2 then
if math.abs(longit_speed) < hidroplane.min_speed then
percentage = ((longit_speed * 100)/hidroplane.min_speed)/100
if newpitch ~= 0 then
newpitch = newpitch * percentage
@ -580,7 +577,7 @@ function hidroplane.flightstep(self)
local snormal = {x=sdir.z,y=0,z=-sdir.x} -- rightside, dot is negative
local prsr = hidroplane.dot(snormal,nhdir)
local rollfactor = -90
local roll_rate = math.rad(25)
local roll_rate = math.rad(10)
newroll = (prsr*math.rad(rollfactor)) * (later_speed * roll_rate) * hidroplane.sign(longit_speed)
--minetest.chat_send_all('newroll: '.. newroll)
else
@ -648,8 +645,8 @@ function hidroplane.flightstep(self)
if stop ~= true then
self._last_accell = new_accel
self.object:set_acceleration(new_accel)
elseif stop == false then
self.object:set_acceleration({x=0,y=0,z=0})
self.object:set_velocity({x=0,y=0,z=0})
end
------------------------------------------------------
@ -659,7 +656,7 @@ function hidroplane.flightstep(self)
--self.object:get_luaentity() --hack way to fix jitter on climb
--adjust climb indicator
local climb_rate = velocity.y * 1.5
local climb_rate = velocity.y
if climb_rate > 5 then climb_rate = 5 end
if climb_rate < -5 then
climb_rate = -5
@ -694,9 +691,8 @@ function hidroplane.flightstep(self)
self.power_gauge:set_attach(self.object,'',HIDROPLANE_GAUGE_POWER_POSITION,{x=0,y=0,z=power_indicator_angle})
--apply rotations
if newyaw~=yaw or newpitch~=pitch or newroll~=roll then
self.object:set_rotation({x=newpitch,y=newyaw,z=newroll})
end
self.object:set_rotation({x=newpitch,y=newyaw,z=newroll})
--end
--adjust elevator pitch (3d model)
self.elevator:set_attach(self.object,'',{x=0,y=4,z=-35.5},{x=-self._elevator_angle*2,y=0,z=0})

View File

@ -3,9 +3,9 @@ hidroplane.fuel = {['biofuel:biofuel'] = 1,['biofuel:bottle_fuel'] = 1,
['biofuel:phial_fuel'] = 0.25, ['biofuel:fuel_can'] = 10}
hidroplane.gravity = tonumber(minetest.settings:get("movement_gravity")) or 9.8
hidroplane.wing_angle_of_attack = 3
hidroplane.min_speed = 5
hidroplane.max_engine_acc = 4.5 --5
hidroplane.lift = 13 --12
hidroplane.min_speed = 6
hidroplane.max_engine_acc = 7 --4.5
hidroplane.lift = 10 --12
hidroplane.colors ={
black='#2b2b2b',