Improve air-to-air refueling by supporting multiple contact points
offset from the tanker center, and an offset probe/recepticle position on the receiving aircraft.
This commit is contained in:
parent
b64dd768d3
commit
e969dbc8f4
2 changed files with 60 additions and 5 deletions
|
@ -163,6 +163,12 @@ var Coord = {
|
||||||
me._pupdate();
|
me._pupdate();
|
||||||
course *= D2R;
|
course *= D2R;
|
||||||
dist /= ERAD;
|
dist /= ERAD;
|
||||||
|
|
||||||
|
if (dist < 0.0) {
|
||||||
|
dist = abs(dist);
|
||||||
|
course = course - math.pi;
|
||||||
|
}
|
||||||
|
|
||||||
me._lat = math.asin(math.sin(me._lat) * math.cos(dist)
|
me._lat = math.asin(math.sin(me._lat) * math.cos(dist)
|
||||||
+ math.cos(me._lat) * math.sin(dist) * math.cos(course));
|
+ math.cos(me._lat) * math.sin(dist) * math.cos(course));
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,7 @@ var identity = {
|
||||||
|
|
||||||
|
|
||||||
var Tanker = {
|
var Tanker = {
|
||||||
new: func(aiid, callsign, tacan, type, model, kias, maxfuel, pattern, heading, coord) {
|
new: func(aiid, callsign, tacan, type, model, kias, maxfuel, pattern, contacts, heading, coord) {
|
||||||
var m = { parents: [Tanker] };
|
var m = { parents: [Tanker] };
|
||||||
m.callsign = callsign;
|
m.callsign = callsign;
|
||||||
m.tacan = tacan;
|
m.tacan = tacan;
|
||||||
|
@ -79,6 +79,7 @@ var Tanker = {
|
||||||
m.out_of_range_time = 0;
|
m.out_of_range_time = 0;
|
||||||
m.interval = 10;
|
m.interval = 10;
|
||||||
m.length = pattern;
|
m.length = pattern;
|
||||||
|
m.contacts = contacts;
|
||||||
m.roll = 0;
|
m.roll = 0;
|
||||||
m.coord = geo.Coord.new(coord);
|
m.coord = geo.Coord.new(coord);
|
||||||
m.anchor = geo.Coord.new(coord).apply_course_distance(m.track_course, m.length); # ARCP
|
m.anchor = geo.Coord.new(coord).apply_course_distance(m.track_course, m.length); # ARCP
|
||||||
|
@ -218,9 +219,43 @@ var Tanker = {
|
||||||
me.brgN.setDoubleValue(me.bearing);
|
me.brgN.setDoubleValue(me.bearing);
|
||||||
me.elevN.setDoubleValue(elev);
|
me.elevN.setDoubleValue(elev);
|
||||||
|
|
||||||
me.contactN.setBoolValue(me.distance < ac_contact_dist and
|
# Determine if any of the contact points are in contact
|
||||||
dalt > 0 and
|
var offset_x = getprop("/systems/refuel/offset-x-m") or 0;
|
||||||
abs(view.normdeg(me.bearing - ac_hdg)) < 20);
|
var offset_y = getprop("/systems/refuel/offset-y-m") or 0;
|
||||||
|
var offset_z = getprop("/systems/refuel/offset-z-m") or 0;
|
||||||
|
var roll = getprop("/orientation/roll-deg") * globals.D2R;
|
||||||
|
|
||||||
|
# Determine contact position
|
||||||
|
var probe_pos = geo.Coord.new(me.ac);
|
||||||
|
|
||||||
|
probe_pos.apply_course_distance(ac_hdg, offset_x);
|
||||||
|
probe_pos.apply_course_distance(ac_hdg + 90, offset_y * math.cos(roll) + offset_z * math.sin(roll));
|
||||||
|
probe_pos.set_alt(me.ac.alt() + offset_z * math.cos(roll) - offset_y * math.sin(roll));
|
||||||
|
|
||||||
|
me.contactN.setBoolValue(0);
|
||||||
|
|
||||||
|
foreach (var c; me.contacts) {
|
||||||
|
var drogue_pos = geo.Coord.new(me.coord);
|
||||||
|
|
||||||
|
# Offset longitudonally
|
||||||
|
drogue_pos.apply_course_distance(me.course, c.x);
|
||||||
|
|
||||||
|
var r = me.roll * globals.D2R;
|
||||||
|
|
||||||
|
# Offset laterally, taking into account any roll
|
||||||
|
drogue_pos.apply_course_distance(me.course +90, c.y * math.cos(r) + c.z * math.sin(r));
|
||||||
|
|
||||||
|
# Offset vertically, again, taking into account any roll
|
||||||
|
drogue_pos.set_alt(drogue_pos.alt() + c.z * math.cos(r) - c.y * math.sin(r));
|
||||||
|
|
||||||
|
#print("Distance: " ~ probe_pos.distance_to(drogue_pos) ~ " vs. " ~ me.distance);
|
||||||
|
|
||||||
|
if (probe_pos.distance_to(drogue_pos) < ac_contact_dist and
|
||||||
|
abs(view.normdeg(me.course - ac_hdg)) < 20) {
|
||||||
|
# Contact!
|
||||||
|
me.contactN.setBoolValue(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
me.hOffsetN.setDoubleValue(me.bearing - ac_hdg);
|
me.hOffsetN.setDoubleValue(me.bearing - ac_hdg);
|
||||||
me.vOffsetN.setDoubleValue(elev - ac_pitch);
|
me.vOffsetN.setDoubleValue(elev - ac_pitch);
|
||||||
|
@ -279,12 +314,26 @@ var create_tanker = func(tanker_node, course) {
|
||||||
var pattern = (tanker_node.getNode("pattern-length-nm", 1).getValue() or 50) * NM2M;
|
var pattern = (tanker_node.getNode("pattern-length-nm", 1).getValue() or 50) * NM2M;
|
||||||
var maxfuel = tanker_node.getNode("max-fuel-transfer-lbs-min", 1).getValue() or 6000;
|
var maxfuel = tanker_node.getNode("max-fuel-transfer-lbs-min", 1).getValue() or 6000;
|
||||||
|
|
||||||
|
var contacts = [];
|
||||||
|
|
||||||
|
foreach (var contact; tanker_node.getChildren("contact")) {
|
||||||
|
var x = (contact.getNode("x-m") != nil) ? contact.getNode("x-m").getValue() : 0;
|
||||||
|
var y = (contact.getNode("y-m") != nil) ? contact.getNode("y-m").getValue() : 0;
|
||||||
|
var z = (contact.getNode("z-m") != nil) ? contact.getNode("z-m").getValue() : 0;
|
||||||
|
append(contacts, { "x" : x, "y" : y, "z" : z });
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (size(contacts) == 0) {
|
||||||
|
append(contacts, {x: 0, y:0, z:0});
|
||||||
|
}
|
||||||
|
|
||||||
var alt = int(10 + rand() * 15) * 1000; # FL100--FL250
|
var alt = int(10 + rand() * 15) * 1000; # FL100--FL250
|
||||||
alt = skip_cloud_layer(alt * FT2M);
|
alt = skip_cloud_layer(alt * FT2M);
|
||||||
var dist = 6000 + rand() * 4000;
|
var dist = 6000 + rand() * 4000;
|
||||||
var coord = geo.aircraft_position().apply_course_distance(course, dist).set_alt(alt);
|
var coord = geo.aircraft_position().apply_course_distance(course, dist).set_alt(alt);
|
||||||
|
|
||||||
Tanker.new(aiid, callsign, tacanid, type, model, spd, maxfuel, pattern, course, coord);
|
Tanker.new(aiid, callsign, tacanid, type, model, spd, maxfuel, pattern, contacts, course, coord);
|
||||||
}
|
}
|
||||||
|
|
||||||
# Request a new tanker
|
# Request a new tanker
|
||||||
|
|
Loading…
Reference in a new issue