|
|
|
@ -178,35 +178,39 @@ public class RaceController extends Controller {
|
|
|
|
private void initialiseView3D(VisualiserRaceEvent race) {
|
|
|
|
private void initialiseView3D(VisualiserRaceEvent race) {
|
|
|
|
viewSubjects = FXCollections.observableArrayList();
|
|
|
|
viewSubjects = FXCollections.observableArrayList();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Import boat mesh
|
|
|
|
URL asset = HostController.class.getClassLoader().getResource("assets/V1.2 Complete Boat.stl");
|
|
|
|
URL asset = HostController.class.getClassLoader().getResource("assets/V1.2 Complete Boat.stl");
|
|
|
|
StlMeshImporter importer = new StlMeshImporter();
|
|
|
|
StlMeshImporter importer = new StlMeshImporter();
|
|
|
|
importer.read(asset);
|
|
|
|
importer.read(asset);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Configure camera angles and control
|
|
|
|
view3D = new View3D();
|
|
|
|
view3D = new View3D();
|
|
|
|
view3D.setDistance(1050);
|
|
|
|
view3D.setDistance(1050);
|
|
|
|
view3D.setYaw(0);
|
|
|
|
view3D.setYaw(0);
|
|
|
|
view3D.setPitch(60);
|
|
|
|
view3D.setPitch(60);
|
|
|
|
|
|
|
|
view3D.enableTracking();
|
|
|
|
|
|
|
|
canvasBase.add(view3D, 0, 0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Set up projection from GPS to view
|
|
|
|
RaceDataSource raceData = visualiserRace.getVisualiserRaceState().getRaceDataSource();
|
|
|
|
RaceDataSource raceData = visualiserRace.getVisualiserRaceState().getRaceDataSource();
|
|
|
|
final GPSConverter gpsConverter = new GPSConverter(raceData, 450, 450);
|
|
|
|
final GPSConverter gpsConverter = new GPSConverter(raceData, 450, 450);
|
|
|
|
|
|
|
|
|
|
|
|
view3D.setItems(viewSubjects);
|
|
|
|
view3D.setItems(viewSubjects);
|
|
|
|
view3D.enableTracking();
|
|
|
|
// Position and add each mark to view
|
|
|
|
canvasBase.add(view3D, 0, 0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for(Mark mark: race.getVisualiserRaceState().getMarks()) {
|
|
|
|
for(Mark mark: race.getVisualiserRaceState().getMarks()) {
|
|
|
|
Subject3D subject = new Subject3D(new Sphere(5));
|
|
|
|
Subject3D subject = new Subject3D(new Sphere(2));
|
|
|
|
subject.setX(gpsConverter.convertGPS(mark.getPosition()).getX());
|
|
|
|
subject.setX(gpsConverter.convertGPS(mark.getPosition()).getX());
|
|
|
|
subject.setZ(gpsConverter.convertGPS(mark.getPosition()).getY());
|
|
|
|
subject.setZ(gpsConverter.convertGPS(mark.getPosition()).getY());
|
|
|
|
|
|
|
|
|
|
|
|
viewSubjects.add(subject);
|
|
|
|
viewSubjects.add(subject);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Position and add each boat to view
|
|
|
|
for(VisualiserBoat boat: race.getVisualiserRaceState().getBoats()) {
|
|
|
|
for(VisualiserBoat boat: race.getVisualiserRaceState().getBoats()) {
|
|
|
|
MeshView mesh = new MeshView(importer.getImport());
|
|
|
|
MeshView mesh = new MeshView(importer.getImport());
|
|
|
|
Subject3D subject = new Subject3D(mesh);
|
|
|
|
Subject3D subject = new Subject3D(mesh);
|
|
|
|
viewSubjects.add(subject);
|
|
|
|
viewSubjects.add(subject);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Track this boat's movement with the new subject
|
|
|
|
AnimationTimer trackBoat = new AnimationTimer() {
|
|
|
|
AnimationTimer trackBoat = new AnimationTimer() {
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public void handle(long now) {
|
|
|
|
public void handle(long now) {
|
|
|
|
@ -217,12 +221,15 @@ public class RaceController extends Controller {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
trackBoat.start();
|
|
|
|
trackBoat.start();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Fix initial bird's-eye position
|
|
|
|
view3D.updatePivot(new Translate(250, 0, 210));
|
|
|
|
view3D.updatePivot(new Translate(250, 0, 210));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Bind zooming to scrolling
|
|
|
|
view3D.setOnScroll(e -> {
|
|
|
|
view3D.setOnScroll(e -> {
|
|
|
|
view3D.updateDistance(e.getDeltaY());
|
|
|
|
view3D.updateDistance(e.getDeltaY());
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Bind zooming to keypress (Z/X default)
|
|
|
|
racePane.addEventFilter(KeyEvent.KEY_PRESSED, e -> {
|
|
|
|
racePane.addEventFilter(KeyEvent.KEY_PRESSED, e -> {
|
|
|
|
ControlKey key = keyFactory.getKey(e.getCode().toString());
|
|
|
|
ControlKey key = keyFactory.getKey(e.getCode().toString());
|
|
|
|
if(key != null) {
|
|
|
|
if(key != null) {
|
|
|
|
|