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]
main
Connor Taylor-Brown 8 years ago
parent bcc827b554
commit 963c8a43ad

@ -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();

@ -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)));
}
}

@ -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)));
}
}

@ -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) {}
}

@ -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<Subject3D> getSkyBoxPlanes() {

@ -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);
}

Loading…
Cancel
Save