gpt4 book ai didi

r - 如何制作高平滑、高分辨率的粒子运动动画

转载 作者:行者123 更新时间:2023-12-04 22:58:55 26 4
gpt4 key购买 nike

一段时间以来,我在制作分辨率足够高的短片/动画/GIF 时遇到了麻烦。我将使用 R 生成一些帧作为随机示例,但如果有其他地方我应该从其他地方创建帧以提供更好的结果,我也会对此感兴趣。

创建框架

我感兴趣的动画类型涉及在页面上移动的一些“粒子”云。通常有大量的粒子,我希望它们的运动尽可能平滑。作为一个随机示例,考虑 R 代码(使用基本图形而不是 ggplot2,因为它可以更快地保存大量帧)

N <- 500
nFrames <- 250
points <- pracma::randp(n=N, r=1)
rot <- function(p, a) { return(cbind(p[,1]*cos(a) - p[,2]*sin(a), p[,1]*sin(a) + p[,2]*cos(a))) }
cols <- colorRampPalette(c("red", "green", "blue"))(nFrames)
ang <- seq(0, pi, length=N)

# Save frames
png(filename="%d.png")
par(mar=c(0,0,0,0))
for (i in seq(1,N,length=nFrames))
plot(sqrt(i)*rot(points, ang[i]), xlim=sqrt(N)*c(-1,1), ylim=sqrt(N)*c(-1,1), cex=0.5, pch=19, col=cols[i], asp=1, xaxs="i")

dev.off()

帧到动画

有许多工具可用于将每一帧链接到一个动画中(在 R 中也有像 gganimate 之类的东西,我已经尝试过,但没有发现比以下更方便或更好)。我对生成的文件大小或使所有内容看起来尽可能清晰所需的时间也没有任何要求。

兑换

对于短 gif 样式动画,常见的解决方案是执行 convert -delay 1 -loop 0 *.png g.gif 之类的操作。这使

enter image description here

吉夫斯基

运行 gifski -o g.gif *.png生产

boring_gif

在上述两种情况下的帧之间的过渡中都会发生令人讨厌的“抖动”(尽管 gifski 不太明显)。

ffmpeg

作为 gif,上面的调整选项有限,所以我怀疑部分解决方案在于使用 ffmpeg .我想知道的是如何使动画看起来完全平滑而没有任何明显的模糊。在这里,生成的电影往往非常流畅,但缺乏分辨率......例如设置后 height=1080width=1080png()上面的代码我们可以运行
fmpeg -i %d.png -s 1080x1080 -c:v libx264 -vf fps=250 -pix_fmt yuv444p out.mp4

如果粒子在小于肉眼可见的时间/空间尺度上移动,并且我们将每秒帧数设置为总帧数,那么帧之间的过渡应该是无缝的,对吧?在 out.mp4 的 2 秒左右您会在开始时看到某种丢帧现象。为什么会这样?

问题
  • 是否有标准的记录方法来生成涉及大量“点状”粒子的高质量动画/电影?我们需要更多更多的帧吗?
  • 如何使用 ffmpeg 提高电影的分辨率?我应该从 .png 格式更改为矢量化的格式(如果是,如何)?

  • 运行 Fedora v31。

    最佳答案

    利用:

    ffmpeg -framerate 250 -i %d.png -c:v libx264rgb -crf 0 out.mp4
  • 该视频将可由基于 FFmpeg 的播放器(VLC、mpv、ffplay 等)播放。
  • 这避免了缩放,并将输出与输入 PNG 文件相同的宽度 x 高度。
  • 图像解复用器的默认帧速率为 25,因此 -framerate用于覆盖这一点。
  • 色彩空间被保留。
  • 输出无损。
  • 关于r - 如何制作高平滑、高分辨率的粒子运动动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59167850/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com