# Changing center-of-rotation of sphere

I'm hoping to be able to change the "center-of-rotation" (CoR) about a 3D globe which is given by the code below. Currently the CoR is about the center of the sphere itself, however, I'd love to be able to, for example, change the CoR to be about New York city, or any surface location for that matter. That is, I'd like to be able to move the CoR, which is by default set to (x,y,z)=(0,0,0), to a point on the surface of the sphere, a radial distance R from the sphere's center. Is such an option possible?

EarthTexture =
Import["http://naturalearth.springercarto.com/ne3_data/8192/\
textures/2_no_clouds_8k.jpg"];
EarthSphere =
ParametricPlot3D[{Cos[u] Sin[v], Sin[u] Sin[v], Cos[v]}, {u, 0,
2 Pi}, {v, 0, Pi}, Mesh -> None, PlotPoints -> 100,
TextureCoordinateFunction -> ({#4, 1 - #5} &), Boxed -> False,
PlotStyle -> Texture[Show[EarthTexture]], Lighting -> "Neutral",
Axes -> False, RotationAction -> "Clip",
ViewPoint -> {-2.026774, 2.07922, 1.73753418}, ImageSize -> 800];
Show[EarthSphere, PlotRange -> Automatic]

• Have you seen ViewCenter? Aug 6, 2016 at 2:07
• ViewCenter looks to work nicely, but I'm struggling to figure out how to change the center-of-rotation to a specific point on Earth. Would it be possible, given latitude, longitude and the radius of Earth, to accurately set ViewCenter? Aug 6, 2016 at 20:14

The documentation says that

The setting for ViewCenter is given in scaled coordinates, which run from 0 to 1 across each dimension of the bounding box.

so it should just be case of converting from lat/long to graphics coordinates and then to scaled coordinates.

E.g.

earth = ParametricPlot3D[{Cos[u] Sin[v], Sin[u] Sin[v], Cos[v]}, {u, 0, 2 Pi}, {v, 0, Pi},
Mesh -> None, PlotPoints -> 30, Boxed -> False, Axes -> False,
TextureCoordinateFunction -> ({#4, 1 - #5} &),
PlotStyle -> Texture[EarthTexture],
Lighting -> "Neutral"];

pt[city_] := Module[{v, u},
{v, u} = LatitudeLongitude@GeoPosition@city;
{-Cos[u] Cos[v], -Sin[u] Cos[v], Sin[v]}]

cities={
Entity["City", {"London", "GreaterLondon", "UnitedKingdom"}],
Entity["City", {"NewYork", "NewYork", "UnitedStates"}],
Entity["City", {"Tokyo", "Tokyo", "Japan"}]};

Manipulate[
Show[earth, Graphics3D[{Red, Arrow@Tube[{1.3 pt[c], pt[c]}]}],
ViewCenter -> Dynamic[0.5 + 0.5 pt[c]]], {c, cities}]


• Hi Simon, thanks very much for the reply, but I seem to be getting errors when I run your code regarding lists not being of the same shape. The errors are of the form "Lists {v$1518, u$1518} and {51.5, -0.116667} Degree are not the same shape." Aug 7, 2016 at 10:24
• @AlexR that's odd, what do you get from FullForm[LatitudeLongitude@GeoPosition@cities[[1]]] ? Aug 7, 2016 at 10:59