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 - How to draw lines between specified dots on ListPlot?

I would like to create a plot where I have unconnected dots and some connected. So far, I have figured out how to draw the dots. My code is the following: ListPlot[{{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4,13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full] I have thought using ListLinePlot command, but I don't know how to specify to the command to draw only selected lines between the dots. Do have any suggestions/hints on how to do that? Thank you. Answer One possibility would be to use Epilog with Line : ListPlot[ {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4, 13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full, Epilog -> { Line[ ...

equation solving - Invert and fit implicitly defined curve

I need to fit an implicitly defined curve. I thought I could get some data out of Solve , and then using FindFit . Therefore, I would like to find the relation the parametric curve defined by $F(x,y)=0$: Solve[-(1/2) + 1/2 (0.41202 BesselK[0, 0.1 Sqrt[x^2 + y^2]] + (0.101483 x BesselK[1, 0.1 Sqrt[x^2 + y^2]])/Sqrt[x^2 + y^2]) == 0, y] But I can't get an output: Solve was unable to solve the system with inexact coefficients or the system obtained by direct rationalization of inexact numbers present in the system. Since many of the methods used by Solve require exact input, providing Solve with an exact version of the system may help. >> Edit: In particular, I would like to fit the data coming from the curve with the expression of another curve, and not with a function $f(x)$. In particular, since this clearly looks like a cardioid , I would like it to fit to something like it. What other strategies could I try?

dynamic - How can I make a clickable ArrayPlot that returns input?

I would like to create a dynamic ArrayPlot so that the rectangles, when clicked, provide the input. Can I use ArrayPlot for this? Or is there something else I should have to use? Answer ArrayPlot is much more than just a simple array like Grid : it represents a ranged 2D dataset, and its visualization can be finetuned by options like DataReversed and DataRange . These features make it quite complicated to reproduce the same layout and order with Grid . Here I offer AnnotatedArrayPlot which comes in handy when your dataset is more than just a flat 2D array. The dynamic interface allows highlighting individual cells and possibly interacting with them. AnnotatedArrayPlot works the same way as ArrayPlot and accepts the same options plus Enabled , HighlightCoordinates , HighlightStyle and HighlightElementFunction . data = {{Missing["HasSomeMoreData"], GrayLevel[ 1], {RGBColor[0, 1, 1], RGBColor[0, 0, 1], GrayLevel[1]}, RGBColor[0, 1, 0]}, {GrayLevel[0], GrayLevel...