1
0
Fork 0

Syd's MIBS:

A camera tool for making fgfs videos (heavily used by Michelle) and for
tracking MP and AI aircraft. It's planned to include this into the regular
ufo, but for now it's better to keep them separated. Comes with its own
panel, which (hopefully) is self-explaining.

Shouldn't be announced on the fgfs page as separate aircraft (if that's
possible). Work in progress ...
This commit is contained in:
mfranz 2007-07-08 18:15:02 +00:00
parent a3fdbf8456
commit 1fefa1c206
5 changed files with 631 additions and 0 deletions

View file

@ -0,0 +1,165 @@
<?xml version="1.0"?>
<PropertyList>
<name>cam-keys</name>
<layout>vbox</layout>
<x>0</x>
<y>24</y>
<pref-width>1024</pref-width>
<pref-height>24</pref-height>
<modal>false</modal>
<color>
<red>0.5</red>
<green>0.5</green>
<blue>0.5</blue>
<alpha>0.5</alpha>
</color>
<group>
<layout>hbox</layout>
<halign>left</halign>
<default-padding>2</default-padding>
<checkbox>
<label>AI</label>
<property>/sim/cam/target-ai</property>
<binding>
<command>dialog-apply</command>
</binding>
</checkbox>
<checkbox>
<label>MP</label>
<property>/sim/cam/target-mp</property>
<binding>
<command>dialog-apply</command>
</binding>
</checkbox>
<text>
<label>000000</label>
<format>No# %d</format>
<property>/sim/cam/target-number</property>
<live>true</live>
</text>
<text>
<label>000000000000000000</label>
<format>Name: %s</format>
<property>/sim/cam/target-name</property>
<live>true</live>
</text>
<button>
<color>
<red>0.5</red>
<green>0.5</green>
<blue>0.5</blue>
</color>
<pref-width>35</pref-width>
<pref-height>20</pref-height>
<legend>&lt;&lt;</legend>
<binding>
<command>property-adjust</command>
<property>/sim/cam/target-number</property>
<step>-1</step>
</binding>
</button>
<button>
<halign>left</halign>
<color>
<red>0.5</red>
<green>0.5</green>
<blue>0.5</blue>
</color>
<pref-width>35</pref-width>
<pref-height>20</pref-height>
<legend>&gt;&gt;</legend>
<binding>
<command>property-adjust</command>
<property>/sim/cam/target-number</property>
<step>1</step>
</binding>
</button>
<empty><pref-width>4</pref-width></empty>
<button>
<color>
<red>0.5</red>
<green>0.5</green>
<blue>0.5</blue>
</color>
<pref-width>45</pref-width>
<pref-height>20</pref-height>
<legend>Goto</legend>
<binding>
<command>nasal</command>
<script>cam.goto_target()</script>
</binding>
</button>
<empty><pref-width>4</pref-width></empty>
<checkbox>
<width>20</width>
<height>24</height>
<label>CHASE</label>
<live>true</live>
<property>/sim/cam/chase</property>
<binding>
<command>dialog-apply</command>
</binding>
</checkbox>
<checkbox>
<width>20</width>
<height>24</height>
<label>FOCUS</label>
<live>true</live>
<property>/sim/cam/focus</property>
<binding>
<command>dialog-apply</command>
</binding>
</checkbox>
<checkbox>
<width>20</width>
<height>24</height>
<label>ALT</label>
<live>true</live>
<property>/sim/cam/alt</property>
<binding>
<command>dialog-apply</command>
</binding>
</checkbox>
<checkbox>
<width>20</width>
<height>24</height>
<label>SPEED</label>
<live>true</live>
<property>/sim/cam/speed</property>
<binding>
<command>dialog-apply</command>
</binding>
</checkbox>
<!--checkbox>
<width>20</width>
<height>24</height>
<label>LOCK</label>
<live>true</live>
<property>/sim/cam/lock</property>
<binding>
<command>dialog-apply</command>
</binding>
</checkbox-->
</group>
<nasal>
<open>cmdarg().getNode("pref-width").setValue(getprop("/sim/startup/xsize"))</open>
</nasal>
</PropertyList>

View file

@ -0,0 +1,113 @@
AC3Db
MATERIAL "DefaultWhite" rgb 1 1 1 amb 1 1 1 emis 0 0 0 spec 0.5 0.5 0.5 shi 64 trans 0
MATERIAL "Material" rgb 0 0 0 amb 0.5 0.5 0.5 emis 0 0 0 spec 1 1 1 shi 32 trans 0
OBJECT world
kids 1
OBJECT poly
name "Cube"
data 8
Cube.005
crease 30.000000
numvert 16
-0.027 0.02 -0.01
-0.027 -0.02 -0.01
-0.027 -0.02 0.01
-0.027 0.02 0.01
0.027 0.02 -0.01
0.027 -0.02 -0.01
0.027 -0.02 0.01
0.027 0.02 0.01
-0.047 0.01 -0.01
-0.047 -0.01 -0.01
-0.047 -0.01 0.01
-0.047 0.01 0.01
-0.027 0.005 -0.005
-0.027 -0.005 -0.005
-0.027 -0.005 0.005
-0.027 0.005 0.005
numsurf 12
SURF 0x20
mat 1
refs 4
0 0 0
1 0 0
2 0 0
3 0 0
SURF 0x20
mat 1
refs 4
4 0 0
7 0 0
6 0 0
5 0 0
SURF 0x20
mat 1
refs 4
0 0 0
4 0 0
5 0 0
1 0 0
SURF 0x20
mat 1
refs 4
1 0 0
5 0 0
6 0 0
2 0 0
SURF 0x20
mat 1
refs 4
2 0 0
6 0 0
7 0 0
3 0 0
SURF 0x20
mat 1
refs 4
4 0 0
0 0 0
3 0 0
7 0 0
SURF 0x20
mat 1
refs 4
10 0 0
11 0 0
8 0 0
9 0 0
SURF 0x20
mat 1
refs 4
12 0 0
15 0 0
14 0 0
13 0 0
SURF 0x20
mat 1
refs 4
8 0 0
12 0 0
13 0 0
9 0 0
SURF 0x20
mat 1
refs 4
9 0 0
13 0 0
14 0 0
10 0 0
SURF 0x20
mat 1
refs 4
10 0 0
14 0 0
15 0 0
11 0 0
SURF 0x20
mat 1
refs 4
11 0 0
15 0 0
12 0 0
8 0 0
kids 0

View file

@ -0,0 +1,13 @@
<?xml version="1.0"?>
<PropertyList>
<path>camera.ac</path>
<animation>
<type>select</type>
<object-name>Cube</object-name>
<condition>
<property>sim/model/always-show-in-MP</property>
</condition>
</animation>
</PropertyList>

229
Aircraft/ufo/cam.nas Normal file
View file

@ -0,0 +1,229 @@
#### Aerotro's Flightgear Cam ####
var CAM = props.globals.getNode("/sim/cam");
var MPS = 0.514444444;
var D2R = math.pi / 180;
var R2D = 180 / math.pi;
var sin = func(v) math.sin(v * D2R);
var cos = func(v) math.cos(v * D2R);
var atan2 = func(v, w) math.atan2(v, w) * R2D;
var ViewNum = 0;
var Grd_Offset = 5.0;
var panel = gui.Dialog.new("/sim/gui/dialogs/cam/dialog", "Aircraft/ufo/Dialogs/campanel.xml");
var maxspeedN = props.globals.getNode("engines/engine/speed-max-mps");
var speed = [10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000];
var current = 7;
var maxspeed = speed[current];
var cam_view = nil;
var targetN = nil;
var target = geo.Coord.new();
var self = nil;
controls.flapsDown = func(x) {
if (!x)
return;
elsif (x < 0 and current > 0)
current -= 1;
elsif (x > 0 and current < size(speed) - 1)
current += 1;
maxspeed = speed[current];
}
var throttle = 0;
controls.throttleAxis = func {
val = cmdarg().getNode("setting").getValue();
if (size(arg) > 0)
val = -val;
throttle = (1 - val) * 0.5;
}
# directly called from the dialog
var goto_target = func {
targetN != nil or return;
var lat = targetN.getNode("position/latitude-deg").getValue();
var lon = targetN.getNode("position/longitude-deg").getValue();
var alt = targetN.getNode("position/altitude-ft").getValue() * geo.FT2M;
var speed = targetN.getNode("velocities/true-airspeed-kt").getValue() * MPS * 2;
var course = targetN.getNode("orientation/true-heading-deg").getValue();
self.set_latlon(lat, lon, alt).apply_course_distance(course + 180, 100);
setprop("/position/latitude-deg", self.lat());
setprop("/position/longitude-deg", self.lon());
altL.set(self.alt());
speedL.set(speed);
mode.chase.setValue(1);
mode.focus.setValue(1);
mode.alt.setValue(1);
mode.speed.setValue(1);
maxspeed = speed * 2;
throttleL.set(0.5);
}
var set_aircraft = func {
var list = [];
if (getprop("/sim/cam/target-ai"))
list ~= props.globals.getNode("/ai/models").getChildren("aircraft");
if (getprop("/sim/cam/target-mp"))
list ~= props.globals.getNode("/ai/models").getChildren("multiplayer");
var name = "";
var index = getprop("/sim/cam/target-number");
targetN = nil;
if (size(list)) {
if (index < 0)
index = size(list) - 1;
elsif (index >= size(list))
index = 0;
targetN = list[index];
name = targetN.getNode("callsign").getValue();
printlog("info", "cam: new aircraft: ", targetN.getPath(), "\t", name);
}
setprop("/sim/cam/target-number", index);
setprop("/sim/cam/target-name", name);
}
var viewhdgL = aircraft.angular_lowpass.new(0.2);
var viewpitchL = aircraft.lowpass.new(0.1);
var viewrollL = aircraft.lowpass.new(0.1);
var hdgL = aircraft.angular_lowpass.new(0.6);
var altL = aircraft.lowpass.new(3);
var speedL = aircraft.lowpass.new(2);
var throttleL = aircraft.lowpass.new(0.3);
var goal_headingN = props.globals.getNode("sim/current-view/goal-heading-offset-deg");
var goal_pitchN = props.globals.getNode("sim/current-view/goal-pitch-offset-deg");
var goal_rollN = props.globals.getNode("sim/current-view/goal-roll-offset-deg");
var mode = {
chase : props.globals.getNode("/sim/cam/chase"),
focus : props.globals.getNode("/sim/cam/focus"),
speed : props.globals.getNode("/sim/cam/speed"),
alt : props.globals.getNode("/sim/cam/alt"),
lock : props.globals.getNode("/sim/cam/lock"),
};
var update = func {
target.set_latlon(
targetN.getNode("position/latitude-deg").getValue(),
targetN.getNode("position/longitude-deg").getValue(),
targetN.getNode("position/altitude-ft").getValue() * geo.FT2M);
self = geo.aircraft_position();
if (0) {
if (mode.lock.getValue()) {
self.set(target);
self.apply_course_distance(rel.course, rel.distance);
self.set_alt(target.alt() + rel.alt);
setprop("/position/latitude-deg", self.lat());
setprop("/position/longitude-deg", self.lon());
setprop("/position/altitude-ft", self.alt() * geo.M2FT);
}
}
var self_heading = getprop("/orientation/heading-deg");
var self_pitch = getprop("/orientation/pitch-deg");
var self_roll = getprop("/orientation/roll-deg");
if (abs(self_pitch) > 2)
mode.alt.setValue(0);
if (abs(self_roll) > 2)
mode.chase.setValue(0);
if (mode.alt.getValue())
setprop("/position/altitude-ft", altL.filter(target.alt()) * geo.M2FT);
else
altL.filter(self.alt());
var distance = self.direct_distance_to(target);
if (distance < 1) {
var course = targetN.getNode("orientation/true-heading-deg").getValue();
mode.focus.setValue(0);
mode.chase.setValue(0);
} else {
var course = self.course_to(target);
}
var elevation = atan2(target.alt() - altL.get(), distance);
if (mode.chase.getValue())
setprop("/orientation/heading-deg", self_heading = hdgL.filter(course));
if (mode.focus.getValue()) {
var h = viewhdgL.filter(self_heading - course);
var p = elevation - self_pitch * cos(h);
var r = -self_roll * sin(h);
goal_headingN.setValue(h);
goal_pitchN.setValue(viewpitchL.filter(p));
goal_rollN.setValue(viewrollL.filter(r));
}
if (mode.speed.getValue())
maxspeed = targetN.getNode("velocities/true-airspeed-kt").getValue() * MPS * 2;
else
maxspeed = speed[current];
maxspeedN.setDoubleValue(speedL.filter(maxspeed));
var AGL = getprop("/position/altitude-agl-ft");
if (AGL < Grd_Offset)
setprop("/position/altitude-ft", getprop("/position/altitude-ft") + Grd_Offset - AGL);
props.setAll("/controls/engines/engine", "throttle", throttleL.filter(throttle));
}
var loop = func {
if (ViewNum == cam_view and targetN != nil)
update();
settimer(loop, 0);
}
setlistener("/sim/cam/target-number", set_aircraft);
setlistener("/sim/cam/target-ai", set_aircraft);
setlistener("/sim/cam/target-mp", set_aircraft);
setlistener("/sim/current-view/view-number", func {
ViewNum = cmdarg().getValue();
if (ViewNum == 7)
panel.open();
else
panel.dialog.close();
});
if (0) {
var rel = { course: 0, distance: 0, alt: 0 };
setlistener("/sim/cam/lock", func {
if (cmdarg().getValue()) {
rel.course = target.course_to(self);
rel.distance = target.distance_to(self);
rel.alt = self.alt() - target.alt();
}
});
}
setlistener("/sim/signals/fdm-initialized", func {
var views = props.globals.getNode("/sim").getChildren("view");
forindex (var i; views)
if (views[i].getNode("name").getValue() == "Cam View")
cam_view = i;
setprop("/sim/current-view/view-number", cam_view);
setprop("/engines/engine/speed-max-mps", 500);
settimer(set_aircraft, 1);
loop();
});

111
Aircraft/ufo/mibs-set.xml Normal file
View file

@ -0,0 +1,111 @@
<?xml version="1.0"?>
<PropertyList>
<sim>
<description>FG video assistant</description>
<author>Syd Adams, Melchior Franz</author>
<flight-model>ufo</flight-model>
<sound>
<path>Aircraft/ufo/ufo-sound.xml</path>
</sound>
<panel>
<visibility>false</visibility>
</panel>
<model>
<path>Aircraft/ufo/Models/camera.xml</path>
<always-show-in-MP type="bool">false</always-show-in-MP>
</model>
<view n="100">
<name>Cam View</name>
<type>lookfrom</type>
<internal type="bool">false</internal>
<config>
<from-model type="bool">true</from-model>
<from-model-idx type="int">0</from-model-idx>
<ground-level-nearplane-m type="double">0.5f</ground-level-nearplane-m>
<default-field-of-view-deg type="double">55.0</default-field-of-view-deg>
<default-pitch-deg type="double">0</default-pitch-deg>
<default-heading-deg type="double">0</default-heading-deg>
<front-direction-deg type="double">0</front-direction-deg>
<front-left-direction-deg type="double">45</front-left-direction-deg>
<left-direction-deg type="double">90</left-direction-deg>
<back-left-direction-deg type="double">135</back-left-direction-deg>
<back-direction-deg type="double">180</back-direction-deg>
<back-right-direction-deg type="double">225</back-right-direction-deg>
<right-direction-deg type="double">270</right-direction-deg>
<front-right-direction-deg type="double">315</front-right-direction-deg>
</config>
</view>
<current-view>
<view-number>7</view-number>
</current-view>
<help>
<title>FG videocam menu help</title>
<line>SPACE: toggle cam menu</line>
<line>AI: select AI targets</line>
<line>MP: select multiplayer targets</line>
<line>GOTO: move to target location</line>
<line>CHASE: follow target</line>
<line>FOCUS: direct view at target</line>
<line>ALT: match target altitude</line>
<line>SPEED: half throttle matches target speed</line>
</help>
<cam>
<target-number type="int">0</target-number>
<target-name type="string"></target-name>
<target-ai type="bool">1</target-ai>
<target-mp type="bool">1</target-mp>
<chase type="bool">0</chase>
<alt type="bool">0</alt>
<speed type="bool">0</speed>
<focus type="bool">0</focus>
<goto type="bool">0</goto>
<lock type="bool">0</lock>
</cam>
</sim>
<nasal>
<cam>
<file>Aircraft/ufo/cam.nas</file>
</cam>
</nasal>
<input>
<keyboard>
<key n="32">
<name>SPACE</name>
<desc>Show dialog</desc>
<binding>
<command>nasal</command>
<script>cam.panel_dialog.toggle()</script>
</binding>
</key>
</keyboard>
</input>
<instrumentation>
<radar>
<range>100</range>
</radar>
</instrumentation>
<gear>
<gear>
<!-- hint for the route manager -->
<wow type="bool">false</wow>
</gear>
</gear>
<autopilot>
<route-manager>
<min-lock-altitude-agl-ft type="double">-10000</min-lock-altitude-agl-ft>
</route-manager>
</autopilot>
</PropertyList>