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?
Asked
Active
Viewed 285 times
4
-
Why don't you use a screen recording program? – Szabolcs Apr 07 '13 at 03:46
-
1@Szabolcs: I just hope to do as many things as possible from within Mathematica :) – saturasl Apr 07 '13 at 03:57
1 Answers
8
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@
MapThread[
Show[g, ViewPoint -> #1, ViewVertical -> #2] &, {vpplay, vvplay}]

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).
Szabolcs
- 234,956
- 30
- 623
- 1,263
-
-
Adopting Szabolcs's code, we can also write something like: vprec = {}; vvrec{}; then change the Dynamic[vp, (vp = #; vprec = list[vprec, #]) &] to Dynamic[vp, (vp = #; AppendTo[vprec, #]&]. This makes the code easier to read, but may decrease performance in complex situation. – saturasl Apr 07 '13 at 04:38
-
@saturasl To be precise, the time taken by
AppendTo[list, ...]is proportional to the length oflist. 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 09 '13 at 21:34