X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Frasterize;a=blobdiff_plain;f=animate.lua;h=616c717f4eb51ff396a343b5a2759ef90faf35d8;hp=ad16db9363d29c9a93cd56b95457c83c16bbfe6c;hb=07083c8dfbbd4fe48e84d86ce8d7e44e0719b84a;hpb=a0e6abd72f045a741fb1ecdd1c2d11281f2840b9 diff --git a/animate.lua b/animate.lua index ad16db9..616c717 100755 --- a/animate.lua +++ b/animate.lua @@ -10,6 +10,7 @@ -- The rasters are saved in the `frames' directory, and if ffmpeg is -- installed, the frames will also be combined into a video file. This script -- must be called from the same directory where the rasterize program is. +-- The CACHE_GEOMETRY option is also recommended to improve performance. -- Set the number of frames to be rendered for the animation. local frames = 360 @@ -17,8 +18,8 @@ local frames = 360 -- Define the code to calculate where the camera is, in world coordinates. local eye = function(frame) -- just rotate around the center of the scene on the XZ plane - local center = vec_new(0, 1, 0) - local distance = 4 + local center = vec_new(0, 0.4, 0) + local distance = 0.7 local start = math.pi local t = start + 2 * math.pi * frame / frames local v = vec_new(math.cos(t), 0, math.sin(t)) @@ -27,39 +28,30 @@ end -- Define the code to calculate where the focal point of the scene is. local look = function(frame) - -- keep the camera focused on the buddha - return vec_new(2, 1, 2) + -- keep the camera focused at the center + return vec_new(0, 0, 0) end -- Define the actual objects of the scene that will be rendered, in the -- extended u3d format. local scene = [[ -L 0 1000000 0 1 1 1 1 1 1 -L 0 0 1000000 1 1 1 1 1 1 -g ak47.obj -c 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 -M 0.9 0.9 0.9 128 -g dragon.raw -M 0.3 0.3 0.3 5 -c 0.7 0.3 0.2 0.8 0.2 0.1 0.9 0.2 0.2 -t -2 -1 -2 -s 2 2 2 -g budda.raw -c 0.1 0.2 0.7 0.1 0.3 0.9 0.2 0.1 0.8 -t 2 -1.5 2 -s 10 10 10 -g bunny.raw -M 0.2 0.2 0.2 1 -c 0.9 0.8 0.9 0.8 0.7 0.9 0.9 0.8 0.7 -t -2 -1 2 -s 10 10 10 +l -14687.0 7986.0 8976.0 1.0 1.0 1.0 +g checker.obj +c 1.0 0.6 0.6 0.6 +m checker.ppm +r -1.57 1.0 0.0 0.0 +p 1.0 1.0 1.0 100.0 +g teapot.raw +c 0.9 0.7 0.1 0.2 +p 1.0 1.0 1.0 60.0 +t 0.0 0.1 0.0 +s 0.004 0.004 0.004 ]] --- Set the number of samples for supersampling. If this is set to a value of --- two or greater, each frame will be rendered larger by the factor specified. --- ImageMagick is used to scale the frames back down to size; if ImageMagick --- is not installed, the resulting frames will end up bigger than they should --- be and the aliasing problem will not be fixed. +-- Set the number of samples for supersampling. If this is set to a value +-- of two or greater, each frame will be rendered larger by the factor +-- specified. ImageMagick is used to scale the frames back down to size; +-- if ImageMagick is not installed, this script will exit with error 1. local supersample = 2 -- Set the width and height of the viewport. @@ -104,19 +96,22 @@ function render(i) local l = look(i) write("\27[80D\27[2Kframe\t %4d / %d", i, frames) out:write(fmt([[ -U3 +U4 %d %d %f %f %f %f %f %f 0 1 0 1.57 %f 0.1 1000 +1.0 1.0 1.0 %s X ]], w, h, e.x, e.y, e.z, l.x, l.y, l.z, size.w/size.h, scene)) i = coroutine.yield() out:close() - if 1 < supersample then - run("convert %s -scale %dx%d %s", filename, size.w, size.h, filename) + if 1 < supersample and + run("convert %s -scale %dx%d %s", filename, size.w, size.h, filename) ~= 0 then + print() + os.exit(1) end end end @@ -147,5 +142,8 @@ print() if run("ffmpeg -i frames/anim%%04d.bmp %s -y -an scene.avi", ffmpeg_opts) == 0 then print("Animation written to scene.avi.") +else + print("The animation could not be created. Is ffmpeg installed?") + os.exit(2) end