diff --git a/addons/nlaw/functions/fnc_navigation.sqf b/addons/nlaw/functions/fnc_navigation.sqf index 835c3cdcf1..869fc1ad00 100644 --- a/addons/nlaw/functions/fnc_navigation.sqf +++ b/addons/nlaw/functions/fnc_navigation.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" /* * Author: Brandon (TCVM) - * Holds angle as fed to by seeker + * Attempts to hold angle as fed to by seeker. Does so with a simple proportional controller * * Arguments: * Guidance Arg Array @@ -14,13 +14,54 @@ * * Public: No */ +// arbitrary constant +#define PROPORTIONALITY_CONSTANT 3 params ["_args", "_timestep", "_seekerTargetPos", "_profileAdjustedTargetPos", "_targetData", "_navigationParams"]; _args params ["_firedEH"]; _firedEH params ["","","","","","","_projectile"]; -_args params ["", "", "_flightParams"]; -_flightParams params ["_pitchRate", "_yawRate"]; -_navigationParams params ["_yawChange", "_pitchChange", "_startTime"]; +_navigationParams params ["_yawChange", "_pitchChange", "_lastPitch", "_lastYaw"]; -_projectile vectorModelToWorldVisual [2 * _yawChange, 0, 2 * _pitchChange] +// for some reason we need to double this. I don't know why, but it just works +_pitchChange = _pitchChange * 2; +_yawChange = _yawChange * 2; + +((velocity _projectile) call CBA_fnc_vect2polar) params ["", "_currentYaw", "_currentPitch"]; + +private _pitchRate = if (_timestep == 0) then { + 0 +} else { + (_currentPitch - _lastPitch) / _timestep +}; +_navigationParams set [2, _currentPitch]; + +private _pitchModifier = if (_pitchChange == 0) then { + 1 +} else { + abs (_pitchRate / _pitchChange); +}; +private _desiredPitchChange = (_pitchChange - _pitchRate) * PROPORTIONALITY_CONSTANT * _pitchModifier; + +private _yawRate = if (_timestep == 0) then { + 0 +} else { + (_currentYaw - _lastYaw) / _timestep +}; +_navigationParams set [3, _currentYaw]; + +private _yawModifier = if (_yawChange == 0) then { + 1 +} else { + abs (_yawRate / _yawChange); +}; +private _desiredYawChange = (_yawChange - _yawRate) * PROPORTIONALITY_CONSTANT * _yawModifier; + +#ifdef DRAW_NLAW_INFO +drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,1,1], ASLtoAGL getPosASLVisual _projectile, 0.75, 0.75, 0, format ["dP [%1] dY: [%2]", _desiredPitchChange, _desiredYawChange], 1, 0.025, "TahomaB"]; +drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,1,1], [0, 0, 1] vectorAdd ASLtoAGL getPosASLVisual _projectile, 0.75, 0.75, 0, format ["pitch proportional [%1] yaw proportional [%2]", _pitchModifier, _yawModifier], 1, 0.025, "TahomaB"]; +#endif + +TRACE_6("nlaw navigation",_yawChange,_desiredYawChange,_pitchChange,_desiredPitchChange,_yawRate,_pitchRate); + +_projectile vectorModelToWorldVisual [_yawChange + _desiredYawChange, 0, _pitchChange + _desiredPitchChange] diff --git a/addons/nlaw/functions/fnc_navigation_onFired.sqf b/addons/nlaw/functions/fnc_navigation_onFired.sqf index 63d1f0ef02..4e4e277697 100644 --- a/addons/nlaw/functions/fnc_navigation_onFired.sqf +++ b/addons/nlaw/functions/fnc_navigation_onFired.sqf @@ -7,7 +7,7 @@ * Guidance Arg Array * * Return Value: - * None + * Navigation Parameters * * Example: * [] call ace_nlaw_fnc_onFired @@ -55,8 +55,12 @@ if (_shooter == ACE_player) then { _yawChange = -10 max _yawChange min 10; _pitchChange = -10 max _pitchChange min 10; +((velocity _projectile) call CBA_fnc_vect2polar) params ["", "_currentYaw", "_currentPitch"]; + TRACE_3("attackProfileStateParams",_firedLOS,_yawChange,_pitchChange); _navigationParams set [0, _yawChange]; _navigationParams set [1, _pitchChange]; -_navigationParams set [2, CBA_missionTime]; +_navigationParams set [3, _currentPitch]; // last pitch +_navigationParams set [4, _currentYaw]; // last yaw +_navigationParams