@@ -779,7 +779,7 @@ protected override void ZoomIn(float speed)
779779
780780 public class ViewerCamera : FreeRoamCamera
781781 {
782- Vector3 CursorPoint ;
782+ public Vector3 CursorPoint { get ; private set ; }
783783 bool CursorPointDirtyFlag = true ;
784784
785785 public ViewerCamera ( Viewer viewer )
@@ -795,6 +795,9 @@ public override void HandleUserInput(ElapsedTime elapsedTime)
795795 //var pick = UserInput.IsMouseLeftButtonPressed && UserInput.ModifiersMaskShiftCtrlAlt(false, false, false);
796796 var rotate = UserInput . IsMouseMiddleButtonDown && UserInput . ModifiersMaskShiftCtrlAlt ( false , false , false ) ;
797797
798+ if ( UserInput . IsMouseMiddleButtonPressed && UserInput . ModifiersMaskShiftCtrlAlt ( false , false , false ) )
799+ RotationOrigin = GetCursorTerrainIntersection ( ) ;
800+
798801 if ( pan ) PanByMouse ( ) ;
799802 else if ( rotate ) RotateByMouse ( ) ;
800803 else ZoomByMouseWheel ( GetSpeed ( elapsedTime ) ) ;
@@ -805,8 +808,19 @@ protected override void ZoomByMouseWheel(float speed)
805808 ZoomIn ( speed * UserInput . MouseWheelChange * ZoomFactor ) ;
806809 }
807810
811+ Vector3 RotationOrigin ;
808812 protected override void RotateByMouse ( )
809813 {
814+ //var cl = cameraLocation.Location;
815+ //cl.Z *= -1;
816+ //var l = cl;
817+ //l = Vector3.Transform(l, Matrix.CreateTranslation(RotationOrigin - cl));
818+ //l = Vector3.Transform(l, Matrix.CreateRotationX(GetMouseDelta(UserInput.MouseMoveY)));
819+ //l = Vector3.Transform(l, Matrix.CreateRotationY(GetMouseDelta(UserInput.MouseMoveX)));
820+ //l = Vector3.Transform(l, Matrix.CreateTranslation(cl - RotationOrigin));
821+ //l.Z *= -1;
822+ //cameraLocation.Location = l;
823+
810824 // Mouse movement doesn't use 'var speed' because the MouseMove
811825 // parameters are already scaled down with increasing frame rates,
812826 RotationXRadians += GetMouseDelta ( UserInput . MouseMoveY ) ;
@@ -837,13 +851,12 @@ public Vector3 GetCursorTerrainIntersection()
837851 return CursorPoint ;
838852
839853 var threshold = 0.1f ;
840- float interpolation ;
841854 var nearPoint = Viewer . NearPoint ;
842855 var farPoint = Viewer . FarPoint ;
843856 var midPoint = farPoint ;
844- for ( var i = 0 ; i < 8 ; i ++ )
857+ for ( var i = 0 ; i < 16 ; i ++ )
845858 {
846- var terrainLevel = Viewer . Tiles . GetElevation ( TileX , TileZ , midPoint . X , midPoint . Z ) ;
859+ var terrainLevel = Viewer . Tiles . GetElevation ( TileX , TileZ , midPoint . X , - midPoint . Z ) ;
847860 var delta = Math . Abs ( midPoint . Y - terrainLevel ) ;
848861 if ( delta < threshold )
849862 {
@@ -853,18 +866,13 @@ public Vector3 GetCursorTerrainIntersection()
853866 if ( ( midPoint . Y > terrainLevel ) ^ ( nearPoint . Y < farPoint . Y ) )
854867 {
855868 nearPoint = midPoint ;
856- interpolation = farPoint . Y == midPoint . Y ? 1 : MathHelper . Clamp ( delta / Math . Abs ( farPoint . Y - midPoint . Y ) , 0 , 1 ) ;
857- midPoint += ( farPoint - midPoint ) * interpolation ;
869+ midPoint += ( farPoint - midPoint ) * 0.5f ;
858870 }
859871 else
860872 {
861873 farPoint = midPoint ;
862- interpolation = nearPoint . Y == midPoint . Y ? 1 : MathHelper . Clamp ( delta / Math . Abs ( nearPoint . Y - midPoint . Y ) , 0 , 1 ) ;
863-
864-
865- midPoint += ( nearPoint - midPoint ) * interpolation ;
874+ midPoint += ( nearPoint - midPoint ) * 0.5f ;
866875 }
867- if ( interpolation == 1 ) break ; // bail off, no intersection
868876 }
869877 CursorPoint = midPoint ;
870878 CursorPointDirtyFlag = false ;
0 commit comments