# Automatically tracing and keeping ViewPoints in a list while manually rotating 3D graphics

I will need to make a video from the manual rotation of a 3D graphics. In order to do this, I will need to record the set of all view points that I made during rotation. There is method that we can use to get a single viewpoint, like discussed here, but can we find a way to use AppendTo or Sow and Reap to automatically store all the view points in a list?

-
Why don't you use a screen recording program? – Szabolcs Apr 7 '13 at 3:46
@Szabolcs: I just hope to do as many things as possible from within Mathematica :) – saturasl Apr 7 '13 at 3:57

Here's a start:

(* Recording *)

vp = OptionValue[Graphics3D, ViewPoint];
vv = OptionValue[Graphics3D, ViewVertical];

vprec = list[];
vvrec = list[];
g = Graphics3D[Cuboid[],
ViewPoint -> Dynamic[vp, (vp = #; vprec = list[vprec, #]) &],
ViewVertical -> Dynamic[vv, (vv = #; vvrec = list[vvrec, #]) &]
]


I used a linked list for O(1) appending.

Now rotate the graphic slowly using the mouse. The view points will be recorded.

(* Playback *)

vpplay = List @@ Flatten[vprec, Infinity, list];
vvplay = List @@ Flatten[vvrec, Infinity, list];

ListAnimate@

For a better result you also need to record the precise time of each step (AbsoluteTime[]), compute the correct frame durations and reproduce them using a custom ListAnimate. (When you export to GIF you can specify frame durations---check the docs on GIF exporting).
@saturasl To be precise, the time taken by AppendTo[list, ...] is proportional to the length of list. It'll slow down as the list gets big, but I haven't tried if it makes a difference in this application. It might not. – Szabolcs Apr 9 '13 at 21:34