@ -3,7 +3,6 @@ package visualiser.layout;
import javafx.animation.AnimationTimer ;
import javafx.beans.property.ObjectProperty ;
import javafx.beans.property.SimpleObjectProperty ;
import javafx.beans.value.ChangeListener ;
import javafx.collections.ListChangeListener ;
import javafx.collections.ObservableList ;
import javafx.scene.* ;
@ -78,11 +77,17 @@ public class View3D extends Pane {
/ * *
* Distance to switch from third person to bird ' s eye
* /
private final double THIRD_PERSON_LIMIT = 1 00;
private final double THIRD_PERSON_LIMIT = 5 00;
/ * *
* Distance to stop zoom
* /
private final double FIRST_PERSON_LIMIT = 2 ;
private final double ZOOM_IN_LIMIT = 30 ;
private final double ZOOM_OUT_LIMIT = 700 ;
private final double MAX_ZOOM_LIMIT = 1500 ;
private final double MAX_PITCH = 60 ; // birds eye view
private final double MIN_PITCH = 5 ; // third person view
private final double ZOOM_PER_KEYPRESS = 5 ; // distance changed per zoom
private double itemScale = 1 ;
/ * *
* Default constructor for View3D . Sets up Scene and PerspectiveCamera .
@ -183,12 +188,9 @@ public class View3D extends Pane {
* 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 ) ;
}
this . setDistance ( ZOOM_IN_LIMIT * 2 ) ;
adjustPitchForZoom ( ) ;
adjustScaleForZoom ( ) ;
}
/ * *
@ -196,17 +198,14 @@ public class View3D extends Pane {
* /
public void setBirdsEye ( ) {
this . setYaw ( 0 ) ;
this . setPitch ( 60 ) ;
for ( Subject3D item : items ) {
item . setScale ( 1 ) ;
}
this . setPitch ( MAX_PITCH ) ;
adjustScaleForZoom ( ) ;
}
/ * *
* Stop camera from following the last selected subject
* /
p rivate void untrackSubject ( ) {
p ublic void untrackSubject ( ) {
if ( target . get ( ) ! = null ) {
trackBoat . stop ( ) ;
target . setValue ( null ) ;
@ -217,7 +216,7 @@ public class View3D extends Pane {
* Set camera to follow the selected subject
* @param subject to track
* /
p rivate void trackSubject ( Subject3D subject ) {
p ublic void trackSubject ( Subject3D subject ) {
target . set ( subject ) ;
this . trackBoat = new AnimationTimer ( ) {
@ -267,19 +266,81 @@ public class View3D extends Pane {
* @param delta amount to change distance by
* /
public void updateDistance ( double delta ) {
double distance = - this . distance . getZ ( ) + delta ;
if ( distance < = FIRST_PERSON_LIMIT ) {
this . setDistance ( FIRST_PERSON_LIMIT ) ;
} else if ( distance > THIRD_PERSON_LIMIT ) {
this . setDistance ( distance ) ;
double newDistance = - this . distance . getZ ( ) + delta ;
if ( target . get ( ) = = null ) {
if ( newDistance > MAX_ZOOM_LIMIT ) {
setDistance ( MAX_ZOOM_LIMIT ) ;
} else {
setDistance ( newDistance ) ;
}
} else if ( newDistance < = ZOOM_IN_LIMIT ) {
setDistance ( ZOOM_IN_LIMIT ) ;
} else if ( newDistance > ZOOM_OUT_LIMIT ) {
untrackSubject ( ) ;
setBirdsEye ( ) ;
setDistance ( 1050 ) ;
updatePivot ( new Translate ( 250 , 0 , 210 ) ) ;
setYaw ( 0 ) ;
} else {
this . setDistance ( distance ) ;
setDistance ( newDistance ) ;
}
adjustPitchForZoom ( ) ;
adjustScaleForZoom ( ) ;
}
/ * *
* Adjusts the scale size of boats and markers as a user zooms in or out ,
* to smooth the change between third person to birds eye view .
* /
private void adjustScaleForZoom ( ) {
double itemScale = ( ( ( - distance . getZ ( ) - ( ZOOM_IN_LIMIT * 2 ) ) /
( ( THIRD_PERSON_LIMIT - ( ZOOM_IN_LIMIT * 2 ) ) /
( 1 - 0.1 ) ) ) + 0.1 ) ;
// if zoomed right in
if ( itemScale < 0.1 ) {
itemScale = 0.1 ;
// if zoomed right out
} else if ( itemScale > 1 ) {
itemScale = 1 ;
}
// update scale
for ( Subject3D item : items ) {
item . setScale ( itemScale ) ;
}
}
/ * *
* Adjusts the pitch as a user zooms in or out , to smooth the change
* between third person to birds eye view .
* /
private void adjustPitchForZoom ( ) {
double pitch = ( ( ( - distance . getZ ( ) - ( ZOOM_IN_LIMIT * 2 ) ) /
( ( THIRD_PERSON_LIMIT - ( ZOOM_IN_LIMIT * 2 ) ) / ( MAX_PITCH -
MIN_PITCH ) ) ) + MIN_PITCH ) ;
// if pitch is out of bounds, set it to the min/max
if ( pitch < MIN_PITCH ) {
pitch = MIN_PITCH ;
} else if ( pitch > MAX_PITCH ) {
pitch = MAX_PITCH ;
}
setPitch ( pitch ) ;
}
/ * *
* Method to be called when the zoom in key is pressed .
* /
public void zoomIn ( ) {
updateDistance ( - ZOOM_PER_KEYPRESS ) ;
}
/ * *
* Method to be called when the zoom out key is pressed .
* /
public void zoomOut ( ) {
updateDistance ( ZOOM_PER_KEYPRESS ) ;
}
/ * *
* Set angle of camera from z - axis along ground
* @param yaw in degrees