From 963c8a43ada1f130b40f16eff6bbd1bd948d5292 Mon Sep 17 00:00:00 2001 From: Connor Taylor-Brown Date: Wed, 13 Sep 2017 12:25:52 +1200 Subject: [PATCH] Boats and marks are sized realistically in 3rd person - Changed SeaSurface to Subject3D to suppress scaling - Cameras can now be selected through View3D interface #story[1190] --- .../Controllers/RaceController.java | 47 +++++-------------- .../java/visualiser/layout/BoatArrow.java | 17 ------- .../java/visualiser/layout/MarkRadius.java | 17 ------- .../java/visualiser/layout/SeaSurface.java | 37 +++++---------- .../main/java/visualiser/layout/SkyBox.java | 7 ++- .../main/java/visualiser/layout/View3D.java | 45 ++++++++++++++---- 6 files changed, 64 insertions(+), 106 deletions(-) delete mode 100644 racevisionGame/src/main/java/visualiser/layout/BoatArrow.java delete mode 100644 racevisionGame/src/main/java/visualiser/layout/MarkRadius.java diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java index 43ca391f..ba35e08d 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceController.java @@ -202,11 +202,10 @@ public class RaceController extends Controller { StlMeshImporter importerBurgerBoat = new StlMeshImporter(); importerBurgerBoat.read(alternateBoatAsset); - view3D = new View3D(false); + view3D.setItems(viewSubjects); view3D.setDistance(1050); - view3D.setYaw(0); - view3D.setPitch(60); + view3D.setBirdsEye(); view3D.enableTracking(); view3D.addAmbientLight(ambientLight); view3D.addPointLight(pointLight); @@ -216,14 +215,13 @@ public class RaceController extends Controller { RaceDataSource raceData = visualiserRace.getVisualiserRaceState().getRaceDataSource(); final GPSConverter gpsConverter = new GPSConverter(raceData, 450, 450); - view3D.setItems(viewSubjects); - - //viewSubjects.add(new Subject3D(new MeshView(new Plane3D(50, 50, 1, 1)))); - + // Set up sea surface + SeaSurface sea = new SeaSurface(750, 200); + sea.setX(250); + sea.setZ(210); + viewSubjects.add(sea); - SeaSurface sea = new SeaSurface(750, 200, 250, 0, 210); SkyBox skyBox = new SkyBox(750, 200, 250, 0, 210); - viewSubjects.add(sea.getSurface()); viewSubjects.addAll(skyBox.getSkyBoxPlanes()); Boundary3D boundary3D = new Boundary3D(visualiserRace.getVisualiserRaceState().getRaceDataSource().getBoundary(), gpsConverter); @@ -234,20 +232,11 @@ public class RaceController extends Controller { for(Mark mark: race.getVisualiserRaceState().getMarks()) { MeshView mesh = new MeshView(importerMark.getImport()); Subject3D markModel = new Subject3D(mesh); -// Subject3D markRadius = new MarkRadius(3); - double x = gpsConverter.convertGPS(mark.getPosition()).getX(); - double z = gpsConverter.convertGPS(mark.getPosition()).getY(); - - markModel.setX(x); - markModel.setZ(z); - markModel.setScale(3.5); - -// markRadius.setX(x); -// markRadius.setZ(z); + markModel.setX(gpsConverter.convertGPS(mark.getPosition()).getX()); + markModel.setZ(gpsConverter.convertGPS(mark.getPosition()).getY()); viewSubjects.add(markModel); -// viewSubjects.add(markRadius); } // Position and add each boat to view for(VisualiserBoat boat: race.getVisualiserRaceState().getBoats()) { @@ -258,28 +247,16 @@ public class RaceController extends Controller { mesh = new MeshView(importerBurgerBoat.getImport()); } Subject3D boatModel = new Subject3D(mesh); - //Subject3D boatArrow = new BoatArrow(12); - - boatModel.setScale(1.5); viewSubjects.add(boatModel); - //viewSubjects.add(boatArrow); // Track this boat's movement with the new subject AnimationTimer trackBoat = new AnimationTimer() { @Override public void handle(long now) { - double heading = boat.getBearing().degrees(); - double x = gpsConverter.convertGPS(boat.getPosition()).getX(); - double z = gpsConverter.convertGPS(boat.getPosition()).getY(); - - boatModel.setHeading(heading); - boatModel.setX(x); - boatModel.setZ(z); - -// boatArrow.setHeading(heading); -// boatArrow.setX(x); -// boatArrow.setZ(z); + boatModel.setHeading(boat.getBearing().degrees()); + boatModel.setX(gpsConverter.convertGPS(boat.getPosition()).getX()); + boatModel.setZ(gpsConverter.convertGPS(boat.getPosition()).getY()); } }; trackBoat.start(); diff --git a/racevisionGame/src/main/java/visualiser/layout/BoatArrow.java b/racevisionGame/src/main/java/visualiser/layout/BoatArrow.java deleted file mode 100644 index e682f6bd..00000000 --- a/racevisionGame/src/main/java/visualiser/layout/BoatArrow.java +++ /dev/null @@ -1,17 +0,0 @@ -package visualiser.layout; - -import javafx.scene.paint.Color; -import javafx.scene.paint.PhongMaterial; -import javafx.scene.shape.Box; -import javafx.scene.transform.Rotate; - -/** - * Created by cbt24 on 9/09/17. - */ -public class BoatArrow extends Subject3D { - public BoatArrow(double length) { - super(new Box(length/3, 0, length)); - this.getMesh().getTransforms().add(new Rotate(-90, Rotate.X_AXIS)); - this.getMesh().setMaterial(new PhongMaterial(new Color(1, 0, 0, 0.5))); - } -} diff --git a/racevisionGame/src/main/java/visualiser/layout/MarkRadius.java b/racevisionGame/src/main/java/visualiser/layout/MarkRadius.java deleted file mode 100644 index 1a7f3634..00000000 --- a/racevisionGame/src/main/java/visualiser/layout/MarkRadius.java +++ /dev/null @@ -1,17 +0,0 @@ -package visualiser.layout; - -import javafx.scene.paint.Color; -import javafx.scene.paint.PhongMaterial; -import javafx.scene.shape.Cylinder; -import javafx.scene.transform.Rotate; - -/** - * Created by cbt24 on 9/09/17. - */ -public class MarkRadius extends Subject3D { - public MarkRadius(double radius) { - super(new Cylinder(radius, 0)); - this.getMesh().getTransforms().add(new Rotate(-90, Rotate.X_AXIS)); - this.getMesh().setMaterial(new PhongMaterial(new Color(1, 0, 0, 0.5))); - } -} diff --git a/racevisionGame/src/main/java/visualiser/layout/SeaSurface.java b/racevisionGame/src/main/java/visualiser/layout/SeaSurface.java index f1399b82..57056556 100644 --- a/racevisionGame/src/main/java/visualiser/layout/SeaSurface.java +++ b/racevisionGame/src/main/java/visualiser/layout/SeaSurface.java @@ -9,51 +9,40 @@ import javafx.scene.paint.Color; import javafx.scene.paint.PhongMaterial; import javafx.scene.shape.Box; import javafx.scene.shape.MeshView; +import javafx.scene.shape.Shape3D; import javafx.scene.shape.TriangleMesh; import visualiser.utils.PerlinNoiseGenerator; /** * Creates a SeaSurface */ -public class SeaSurface { - private float[][] noiseArray; - private Subject3D surface; - +public class SeaSurface extends Subject3D { /** * Sea Surface Constructor * @param size size of the sea surface (has to be square for simplicity's sake) * @param freq frequency the perlin noise is to be generated at - * @param x offset that the sea should be set at position-wise - * @param z offset that the sea should be set at position-wise */ - public SeaSurface(int size, double freq, double x, double y, double z){ - noiseArray = PerlinNoiseGenerator.createNoise(size, freq); - createSurface(); - surface.setZ(z); - surface.setY(y); - surface.setX(x); + public SeaSurface(int size, double freq){ + super(createSurface(size, freq)); } /** * Creates the sea surface */ - private void createSurface(){ + private static Shape3D createSurface(int size, double freq){ + float[][] noiseArray = PerlinNoiseGenerator.createNoise(size, freq); Image diffuseMap = createImage(noiseArray.length, noiseArray); PhongMaterial material = new PhongMaterial(); material.setDiffuseMap(diffuseMap); - //material.setSpecularColor(Color.WHITE); Plane3D seaPlane = new Plane3D(noiseArray.length, noiseArray.length, 10, 10); MeshView seaSurface = new MeshView(seaPlane); -// Box seaSurface = new Box(noiseArray.length, 0.1, noiseArray.length); seaSurface.setMaterial(material); seaSurface.setMouseTransparent(true); seaSurface.toFront(); - //seaSurface.setRotationAxis(new Point3D(1, 0, 0)); - //seaSurface.setRotate(90); - surface = new Subject3D(seaSurface); + return seaSurface; } /** @@ -62,7 +51,7 @@ public class SeaSurface { * @param noise array of noise * @return image that is created */ - private Image createImage(double size, float[][] noise) { + private static Image createImage(double size, float[][] noise) { int width = (int) size; int height = (int) size; @@ -129,11 +118,9 @@ public class SeaSurface { } /** - * Get surface - * @return the surface so it can be drawn + * Prevent rescaling of sea surface + * @param scale ignored */ - public Subject3D getSurface(){ - return surface; - } - + @Override + public void setScale(double scale) {} } diff --git a/racevisionGame/src/main/java/visualiser/layout/SkyBox.java b/racevisionGame/src/main/java/visualiser/layout/SkyBox.java index 4ca205ee..2f40aa86 100644 --- a/racevisionGame/src/main/java/visualiser/layout/SkyBox.java +++ b/racevisionGame/src/main/java/visualiser/layout/SkyBox.java @@ -149,8 +149,11 @@ public class SkyBox { } private void addSeaOverlay() { - SeaSurface seaSurface = new SeaSurface(size * 3, 200, x, y - size/4 + 1, z); - skyBoxPlanes.add(seaSurface.getSurface()); + SeaSurface seaSurface = new SeaSurface(size * 3, 200); + seaSurface.setX(x); + seaSurface.setY(y - size/4 + 1); + seaSurface.setZ(z); + skyBoxPlanes.add(seaSurface); } public List getSkyBoxPlanes() { diff --git a/racevisionGame/src/main/java/visualiser/layout/View3D.java b/racevisionGame/src/main/java/visualiser/layout/View3D.java index b82457cb..bf4ee555 100644 --- a/racevisionGame/src/main/java/visualiser/layout/View3D.java +++ b/racevisionGame/src/main/java/visualiser/layout/View3D.java @@ -83,7 +83,11 @@ public class View3D extends Pane { /** * Distance to switch from third person to bird's eye */ - private double THIRD_PERSON_LIMIT = 100; + private final double THIRD_PERSON_LIMIT = 100; + /** + * Distance to stop zoom + */ + private final double FIRST_PERSON_LIMIT = 2; /** * Default constructor for View3D. Sets up Scene and PerspectiveCamera. @@ -162,11 +166,37 @@ public class View3D extends Pane { scene.setOnMousePressed(e -> { PickResult result = e.getPickResult(); if(result != null && result.getIntersectedNode() != null && result.getIntersectedNode() instanceof Shape3D) { + untrackSubject(); trackSubject(selectionMap.get(result.getIntersectedNode())); + setThirdPerson(); } }); } + /** + * Configures camera to third person view + */ + public void setThirdPerson() { + this.setDistance(THIRD_PERSON_LIMIT / 2); + this.setPitch(10); + + for(Subject3D item: items) { + item.setScale(0.1); + } + } + + /** + * Configures camera to bird's eye view + */ + public void setBirdsEye() { + this.setYaw(0); + this.setPitch(60); + + for(Subject3D item: items) { + item.setScale(1); + } + } + /** * Stop camera from following the last selected subject */ @@ -184,7 +214,6 @@ public class View3D extends Pane { * @param subject to track */ private void trackSubject(Subject3D subject) { - untrackSubject(); target = subject; updatePivot(target.getPosition()); @@ -194,9 +223,6 @@ public class View3D extends Pane { target.getPosition().yProperty().addListener(pivotY); target.getPosition().zProperty().addListener(pivotZ); target.getHeading().angleProperty().addListener(pivotHeading); - - this.setDistance(THIRD_PERSON_LIMIT); - this.setPitch(20); } public void setNearClip(double nearClip) { @@ -234,13 +260,12 @@ public class View3D extends Pane { public void updateDistance(double delta) { double distance = -this.distance.getZ() + delta; - if(distance <= 0) { - this.setDistance(0); + if(distance <= FIRST_PERSON_LIMIT) { + this.setDistance(FIRST_PERSON_LIMIT); } else if(distance > THIRD_PERSON_LIMIT) { - untrackSubject(); - this.setYaw(0); - this.setPitch(60); this.setDistance(distance); + untrackSubject(); + setBirdsEye(); } else { this.setDistance(distance); }