flight improvements - now using set_velocity instead acceleration
parent
059ce8c946
commit
e57b377b2d
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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})
|
||||
|
|
6
init.lua
6
init.lua
|
@ -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',
|
||||
|
|
Loading…
Reference in New Issue