Skip to content

Commit fabfc5a

Browse files
committed
Change the camera rotation origin - the math is still wrong
1 parent 228f0f0 commit fabfc5a

File tree

3 files changed

+42
-45
lines changed

3 files changed

+42
-45
lines changed

Source/Contrib/TrackViewer/SceneViewer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public class SceneViewer
5656
internal StaticShape SelectedObject;
5757
internal Orts.Formats.Msts.WorldObject SelectedWorldObject;
5858
Viewer Viewer;
59-
ViewerCamera Camera;
59+
OrbitingCamera Camera;
6060

6161
/// <summary>The command-line arguments</summary>
6262
private string[] CommandLineArgs;
@@ -138,7 +138,7 @@ public void Update(GameTime gameTime)
138138
Viewer = Viewer ?? TrackViewer.RenderProcess?.Viewer;
139139
if (Viewer == null)
140140
return;
141-
Camera = Camera ?? Viewer.ViewerCamera;
141+
Camera = Camera ?? Viewer.OrbitingCamera;
142142

143143
Viewer.EditorShapes.MouseCrosshairEnabled = true;
144144

@@ -216,7 +216,7 @@ public async Task SetCameraLocation()
216216
break;
217217
}
218218
mouseLocation.Location.Y = elevatedLocation + 15;
219-
TrackViewer.RenderProcess.Viewer.ViewerCamera.SetLocation(mouseLocation);
219+
TrackViewer.RenderProcess.Viewer.OrbitingCamera.SetLocation(mouseLocation);
220220
}
221221

222222
void SelectedObjectChanged()

Source/RunActivity/Viewer3D/Cameras.cs

Lines changed: 36 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -778,16 +778,17 @@ protected override void ZoomIn(float speed)
778778
}
779779
}
780780

781-
public class ViewerCamera : FreeRoamCamera
781+
public class OrbitingCamera : FreeRoamCamera
782782
{
783-
Vector3 RotationOrigin;
784-
Vector3 RotationDirection;
785-
WorldLocation RotationLocation;
786-
float RotationRadius;
787-
float RotationReferenceAngleX;
788-
float RotationReferenceAngleY;
789-
790-
public ViewerCamera(Viewer viewer)
783+
Vector3 StoredOrigin;
784+
Vector3 StoredDirection = Vector3.UnitZ;
785+
Vector3 StoredForward = Vector3.UnitZ;
786+
WorldLocation StoredLocation;
787+
float StoredRadius;
788+
float StoredAngleX;
789+
float StoredAngleY;
790+
791+
public OrbitingCamera(Viewer viewer)
791792
: base(viewer)
792793
{
793794
}
@@ -827,44 +828,40 @@ public override void RotateByMouse()
827828
RotationXRadians = MathHelper.WrapAngle(RotationXRadians + GetMouseDelta(UserInput.MouseMoveY));
828829
RotationYRadians = MathHelper.WrapAngle(RotationYRadians + GetMouseDelta(UserInput.MouseMoveX));
829830

830-
// Method 1
831-
//var deltaAngleX = MathHelper.WrapAngle(GetMouseDelta(UserInput.MouseMoveY));
832-
//var deltaAngleY = MathHelper.WrapAngle(GetMouseDelta(UserInput.MouseMoveX));
833-
//var direction = Vector3.Normalize(XnaLocation(CameraWorldLocation) - RotationOrigin);
834-
//var transform = Matrix.CreateFromYawPitchRoll(-deltaAngleY, -deltaAngleX, 0);
835-
//var newLocation = RotationOrigin + RotationRadius * Vector3.Transform(direction, transform);
836-
//newLocation.Z *= -1;
837-
//var newWorldLocation = CameraWorldLocation;
838-
//newWorldLocation.Location = newLocation;
831+
var deltaAngleX = MathHelper.WrapAngle(RotationXRadians - StoredAngleX);
832+
var deltaAngleY = MathHelper.WrapAngle(RotationYRadians - StoredAngleY);
839833

840-
// Method 2
841-
//var deltaAngleX = MathHelper.WrapAngle(RotationXRadians - RotationReferenceAngleX);
842-
//var deltaAngleY = MathHelper.WrapAngle(RotationYRadians - RotationReferenceAngleY);
843-
//var transform = Matrix.CreateFromYawPitchRoll(-deltaAngleY, -deltaAngleX, 0);
844-
//var newLocation = RotationOrigin + RotationRadius * Vector3.Transform(RotationDirection, transform);
834+
var dax = StoredForward.Z * deltaAngleX;
835+
var daz = StoredForward.X * deltaAngleX;
836+
var transform = Matrix.CreateRotationX(dax);
837+
transform *= Matrix.CreateRotationZ(daz);
838+
transform *= Matrix.CreateRotationY(-deltaAngleY);
845839

846-
// Method 3
847-
//var deltaAngleX = MathHelper.WrapAngle(RotationXRadians);
848-
//var deltaAngleY = MathHelper.WrapAngle(RotationYRadians);
849-
//var transform = Matrix.CreateFromYawPitchRoll(-deltaAngleY, -deltaAngleX, 0);
850-
//var newLocation = RotationOrigin + RotationRadius * Vector3.Transform(Vector3.UnitZ, transform);
840+
// FIXME: The math is still wrong here somewhere...
851841

852-
//newLocation.Z *= -1;
853-
//var newWorldLocation = RotationLocation;
854-
//newWorldLocation.Location = newLocation;
842+
var newWorldLocation = StoredLocation;
843+
newWorldLocation.Location = StoredOrigin + StoredRadius * Vector3.Transform(StoredDirection, transform);
844+
newWorldLocation.Location.Z *= -1;
855845

856-
//SetLocation(newWorldLocation);
846+
cameraLocation = newWorldLocation;
857847
}
858848

859849
public void StoreRotationOrigin(Vector3 rotationOrigin)
860850
{
861-
RotationOrigin = Viewer.TerrainPoint;
862-
RotationLocation = CameraWorldLocation;
863-
RotationDirection = XnaLocation(CameraWorldLocation) - RotationOrigin;
864-
RotationRadius = RotationDirection.Length();
865-
RotationDirection = Vector3.Normalize(RotationDirection);
866-
RotationReferenceAngleX = MathHelper.WrapAngle(RotationXRadians);
867-
RotationReferenceAngleY = MathHelper.WrapAngle(RotationYRadians);
851+
StoredOrigin = Viewer.TerrainPoint;
852+
StoredLocation = CameraWorldLocation;
853+
StoredDirection = XnaLocation(CameraWorldLocation) - StoredOrigin;
854+
StoredRadius = StoredDirection.Length();
855+
StoredDirection = Vector3.Normalize(StoredDirection);
856+
StoredAngleX = MathHelper.WrapAngle(RotationXRadians);
857+
StoredAngleY = MathHelper.WrapAngle(RotationYRadians);
858+
StoredForward = xnaView.Forward;
859+
}
860+
861+
public void SetOrientation(float rotationXRadians, float rotationYRadians)
862+
{
863+
RotationXRadians = rotationXRadians;
864+
RotationYRadians = rotationYRadians;
868865
}
869866

870867
public void PanByMouse()

Source/RunActivity/Viewer3D/Viewer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public class Viewer
135135
public BrakemanCamera BrakemanCamera { get; private set; } // Camera 6
136136
public List<FreeRoamCamera> FreeRoamCameraList = new List<FreeRoamCamera>();
137137
public FreeRoamCamera FreeRoamCamera { get { return FreeRoamCameraList[0]; } } // Camera 8
138-
public ViewerCamera ViewerCamera { get; private set; }
138+
public OrbitingCamera OrbitingCamera { get; private set; }
139139

140140
/// <summary>
141141
/// Activate the 2D or 3D cab camera depending on the current player preference.
@@ -176,7 +176,7 @@ void CameraActivate()
176176
if (PlayerLocomotive != null)
177177
FrontCamera.Activate();
178178
else
179-
ViewerCamera.Activate();
179+
OrbitingCamera.Activate();
180180
}
181181
else
182182
Camera.Activate();
@@ -324,7 +324,7 @@ public Viewer(Simulator simulator, Orts.Viewer3D.Processes.Game game)
324324
WellKnownCameras.Add(SpecialTracksideCamera = new SpecialTracksideCamera(this));
325325
FreeRoamCameraList.Add(new FreeRoamCamera(this, FrontCamera)); // Any existing camera will suffice to satisfy .Save() and .Restore()
326326
WellKnownCameras.Add(FreeRoamCamera);
327-
WellKnownCameras.Add(ViewerCamera = new ViewerCamera(this));
327+
WellKnownCameras.Add(OrbitingCamera = new OrbitingCamera(this));
328328
WellKnownCameras.Add(ThreeDimCabCamera = new ThreeDimCabCamera(this));
329329

330330
string ORfilepath = System.IO.Path.Combine(Simulator.RoutePath, "OpenRails");

0 commit comments

Comments
 (0)