Skip to main content

animation - Export Animate command to MOV video


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.



Answer




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]

Comments

Popular posts from this blog

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Mathematica: 3D plot based on combined 2D graphs

I have several sigmoidal fits to 3 different datasets, with mean fit predictions plus the 95% confidence limits (not symmetrical around the mean) and the actual data. I would now like to show these different 2D plots projected in 3D as in but then using proper perspective. In the link here they give some solutions to combine the plots using isometric perspective, but I would like to use proper 3 point perspective. Any thoughts? Also any way to show the mean points per time point for each series plus or minus the standard error on the mean would be cool too, either using points+vertical bars, or using spheres plus tubes. Below are some test data and the fit function I am using. Note that I am working on a logit(proportion) scale and that the final vertical scale is Log10(percentage). (* some test data *) data = Table[Null, {i, 4}]; data[[1]] = {{1, -5.8}, {2, -5.4}, {3, -0.8}, {4, -0.2}, {5, 4.6}, {1, -6.4}, {2, -5.6}, {3, -0.7}, {4, 0.04}, {5, 1.0}, {1, -6.8}, {2, -4.7}, {3, -1....