3
$\begingroup$

I'm trying to export a rather complex Animate command into a full-HD resolution video, but having no success so far. The animation has around 520 frames (the number of elements in the trajectory array). What I should be seeing is a tube object moving with a sphere object, and whilst I can see the animation is working with the Animate command, I cannot see the same results when I export the animation. I have tried different things but this just doesn't seem to work, I'm probably not using the export command in the right way. Instead of the 500~ frames trajectory of the tube and the sphere, I just see the animator moving from one side to other.

I'm using the Export function, in the following way:

Export["my_output.mov",animationObject,"QuickTime",ImageSize->{1920,1080}]

My animation object follows this pattern:

(*theta and phi work as a function of s (the only animated variable) to change the view point*)
theta = N[Table[q, {q, 0.1, 2 \[Pi], (2 \[Pi] - 0.1)/Length[trajectory]}]];
phi = N[Table[q, {q, 0.5 \[Pi], 2.5 \[Pi], 2 \[Pi]/Length[trajectory]}]];

Animate[
 Show[
  (*data is a static array of around 5000 points*)
  ListPointPlot3D[(*my list plot options and data*)],

  (*A tube *)
  Graphics3D[{White, Thickness [0.01], Opacity[0.4],Tube[trajectory[[1 ;; s]]]}],

  (*A sphere*)
  Graphics3D[{Yellow, Sphere[{trajectory[[s]]}, {0.02, 0.02}]}],

  (*Just showing some grids with 10 grid lines*)
  FaceGrids -> {(*Specific options for the face grids to show more lines, etc*)},

  (*ViewPoint changed according to the corresponding value of s in the theta and phi arrays*)
  ViewPoint -> Dynamic[{Sin[theta[[s]]] Cos[phi[[s]]],Sin[theta[[s]]] Sin[phi[[s]]], Cos[theta[[s]]]}],
  ViewAngle -> 50 Degree],

 (*Animate Parameters*)
 {s, 1, Length[trajectory], 1}, DisplayAllSteps -> True,AnimationRepetitions -> 1, AnimationRunning -> False]

I'm using Mathematica 8 student version.

$\endgroup$
9
  • 1
    $\begingroup$ What if you try replacing the Animate[] with a Table[]? $\endgroup$ Jun 17, 2012 at 0:26
  • $\begingroup$ Please always post the shortest code snippet that shows your problem. Nobody wants to scan 30 lines of Mma code to find out it was irrelevant to the problem. $\endgroup$ Jun 17, 2012 at 0:26
  • 1
    $\begingroup$ Please include sample data for trajectory and anything else needed to run this code. $\endgroup$
    – Mr.Wizard
    Jun 17, 2012 at 0:42
  • 1
    $\begingroup$ Changing Animate for Table solved my problem, thanks so much @J.M. $\endgroup$ Jun 17, 2012 at 1:02
  • 1
    $\begingroup$ Sorry, I had my answer half way done, when I saw your comment. The thing that bothers me always in questions where the code is not running is, that you cannot try quickly your solution. Then you end up to write a short comment as tip/guess which is, if you are a bit experienced, very often the right answer. Then we are stuck with 2 things: (1) the correct answer is in a comment. Very hard for new users or visitors to find. (2) someone else creates his own test data to make the code valid and posts an answer. Then you get no score for it. $\endgroup$
    – halirutan
    Jun 17, 2012 at 1:49

1 Answer 1

13
$\begingroup$

Since your code is not running due to the lack of trajectory and data it's not possible to give a verified solution, but the tips should help too. What you have to keep in mind is

  • you don't need Animate because to export a movie, you can just give Export a list of images or graphics. Use Table in exact the same way where you have Animate and remove the Dynamic from your ViewPoint
  • your static ListPointPlot3D does never change but you call it for every new frame. Store this (e.g. with a With block) into a variable and use this
  • speaking of this: maybe it is better to create a list of images because they are usually faster to render than Graphics3D objects. This can be done by converting the Graphics3D you create with Rasterize[gr, "Image",...]. There you can specify your image size. If you only want to export it as movie, than it make in my opinion no difference, where you rasterize it.
  • on the other hand 500 images of HD-size use a bit of memory, so maybe you have to try different things here if you run out of mem.

Finally, if you really want to create a movie of high quality, where you don't care about movie-size, than it's maybe worth to antialias the images before putting them into the movie. If you use a high-compression in your movie, then you can skip this since it maybe will not be visible any more. If you create your list of graphics with

With[{lp = 
    ListPointPlot3D[data, 
     PlotStyle -> Directive[PointSize[0.009], Opacity[0.6]], 
     PlotRange -> {{-0.6, 0.4}, {-0.4, 0.6}, {-0.5, 0.5}}, 
     SphericalRegion -> True, RotationAction -> "Clip"]},
  imgs = Table[
    Show[Graphics3D[{White, Thickness[0.01], Opacity[0.4], 
       Tube[trajectory[[1 ;; s]]]}],
     Graphics3D[{Yellow, 
       Sphere[{trajectory[[s]]}, {0.02, 
         0.02}]}], Background -> Automatic, 
     Boxed -> False, 
     BoxRatios -> 
      Automatic,
     FaceGrids -> {{{0, -1, 0}, {Table[l, {l, -1, 1, 0.1}], 
         Table[l, {l, -1, 1, 0.1}]}}, {{0, 
         0, -1}, {Table[l, {l, -1, 1, 0.1}], 
         Table[l, {l, -1, 1, 0.1}]}}, {{1, 0, 
         0}, {Table[l, {l, -1, 1, 0.1}], 
         Table[l, {l, -1, 1, 
           0.1}]}}},
     ViewPoint -> {Sin[theta[[s]]] Cos[phi[[s]]], 
       Sin[theta[[s]]] Sin[phi[[s]]], Cos[theta[[s]]]}, 
     ViewAngle -> 50 Degree, ImageSize -> {1920, 1080}],
    {s, 1, Length[trajectory], 1}]
  ];

You can do in the export

Antialias[g_Graphics3D] := Module[{
   resolution = 72, factor = 2},
  ImageResize[
   Rasterize[g, "Image", ImageResolution -> factor*resolution], 
   Scaled[1/factor]]
  ]

Export["tmp/my_output.mov", Antialias /@ imgs]
$\endgroup$
1
  • $\begingroup$ Excelent answer Sir! $\endgroup$ Jun 17, 2012 at 22:49

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.