动画编辑器 - 为您单调的 Covid 世界带来卡通色彩





5.00/5 (6投票s)
使用此动画编辑器将您自己的精灵与任何您选择的 MP4 结合
引言
电影《谁陷害了兔子罗杰》中的场景。感谢这部好莱坞的瑰宝,我们可爱而多彩的朋友们不再需要像过去那样,被污名化和边缘化在与世隔绝的卡通小镇的贫民窟里。
如果有人不把《谁陷害了兔子罗杰》列入他们心目中的经典电影名单,这些电影不仅改变了一个行业,还彻底改变了卡通人物在我们的社区中被接受的方式,那么他们就没有看过《谁陷害了兔子罗杰》。这一点是可以原谅的,我理解,不是每个人都天生具备电影鉴赏能力,能够分辨现代世界中更美好的体验。但即使你以前从未见过卡通人物在我们中间行走,现在你也可以了。只需看看这个视频,看看一个喝醉的维尼熊在我这里惹麻烦时会发生什么。(它们不全是坏蛋,但有时它们会是混蛋。)
在过去的几个月里,我一直在忙于制作卡通视频,同时也在精调这个项目。还有很多事情没有完成,但项目目前正处于一个十字路口,它已经足够稳定且功能齐全,可以供任何人制作视频了,所以我觉得我必须停下来发布我现在拥有的东西,然后再继续实现更多更棒的闪光点、小玩意和装饰品。
我最近的项目包括
- 新冠肺炎洗手宣传片,这大约花了我一周时间来完成,那是在四月,当时这个应用程序还处于起步阶段,我简直不敢相信我竟然能做出这个视频,尽管当时动画编辑器遇到了很多问题。这是我第一次尝试制作真人视频/动画。你可以看到声音有点不对,视频运动也很卡顿。
- 维尼熊,尽管源视频的光线很差,演员的动作也很卡顿——这个视频仍然让我捧腹大笑。
- 兔宝宝与米奇是一个更简单的项目——没有涉及太多真人动作,但卡顿感仍然存在。而且,我必须承认,我在制作兔宝宝/米老鼠的精灵图时有点懒。
- 俯卧撑 我就是喜欢这首音乐——谁不喜欢欢快的波尔卡呢。不过还是有点卡。
- UFC的Rose Namajunas 我可以忍受自己在模糊、卡顿的视频里出现……但不能是Rose Namajunas。那简直不可接受。所以,在这一点上,我花了一个月的时间来改进视频捕捉方式,使用时间戳来确保所有帧都以正确的时间绘制。在捕获所有内容成视频之前,将所有最终屏幕图像录制到文件,然后通过从硬盘读取每个最终屏幕图像,并以精确的时间戳计划将其 splash 到屏幕上……尽管过程中经历了许多失败,但却取得了显著的改进。
- 维尼熊遇见贝蒂娃娃——最后,在制作了上一个视频中的Rose-Bursts并对项目进行了许多许多修改之后,我不得不制作另一个涉及实际精灵的视频,以确保一切正常工作……两周后,我们达到了现在的状态。
加载示例项目
您可以在此处下载制作维尼熊遇见贝蒂娃娃视频所需的所有文件(您需要将整个 zip 文件解压到您的 *c:\* 驱动器下的新目录中,您需要创建目录 *c:\AnimationEditor*,这样当您加载 *Winnie Meets Betty Boop.xml* 文件时,它才能正常运行)。下图显示了需要创建的目录以及文件需要放置的位置,以便 *.xml* 项目文件能够正确加载和工作。
您可以看到上面工作目录的图像中有两个扩展名为 *.bin* 的文件。这两个文件都是帧图像的二进制流及其对应的时间戳。第一个文件是 **动画编辑器** 在 WindowsMediaPlayer
上播放源 MP4 视频并截取视频播放时的屏幕截图,然后将这些图像存储到 *Winnie Meets Betty Boop half speed.bin* 文件(以其采样的 MP4 命名)的结果。另一个 *.bin* 文件是视频的最终录制,它是通过使用第一个 *.bin* 文件中的源图像,并在这些图像上绘制所有必要的精灵,然后将它们存储在单独的 *Winnie Meets Betty Boop_record.bin* 文件中生成的,该文件名来自项目名称。
MP4 文件如下
- Winnie Meets Betty Boop SOURCE.MP4 - 这是用我的手机录制的未编辑文件
- Winnie Meets Betty Boop AUDIO.MP4 - 这是已编辑的音频文件(仍为 MP4,仅用于其音频)
- Winnie Meets Betty Boop half speed.MP4 - 音频文件减慢到一半速度
- Winnie Meets Betty Boop Screen Capture.MP4 - 这是项目 *WinnieMeetsBettyBoop_record.bin* 文件以两倍速播放的录制,并使用第三方视频屏幕录制应用程序捕获的
*.vProj* 文件是使用 VSDC 的视频编辑器生成的,用于制作最终结果:VSDC
除了所有这些文件之外,您只需要关心维尼和贝蒂的两个精灵文件以及至关重要的 *.xml* 文件,动画编辑器使用它来跟踪您的项目。
总体概述
动画编辑器使用的整个过程通常被称为“完全 Hack”。由于无法轻松地使用 C# 编辑/访问/读取 MP4 中的单个图像(我尝试过但一无所获,如果可以,我将不胜感激),将 MP4 视频分解成单个可工作的图像有点困难。以下是动画编辑器工作方式的总体概述。
制作视频涉及几个步骤
- 需要一个源视频——用摄像机自己录制一个,或者下载一个您喜欢的视频
- 最好是源视频的长度与输出视频的长度完全相同,这样您就可以在最终产品中使用它的音频。将其保存为音频文件(或者不保存,随你喜欢)。
- 一旦有了这个音频文件,您就可以通过将此源文件减慢到一半或四分之一速度来提高输出视频的质量,并将其保存为单独的文件(不要破坏您的音频文件)。您可以使用免费的第三方软件来编辑视频。 VSDC 是一个非常好的产品,它们有一套可用的工具。
- 然后,**动画编辑器**会在
WindowsMediaPlayer
上播放 MP4 视频,并尽可能多地录制帧。更好的硬件会带来更好的结果。我的笔记本电脑足够用,但游戏PC会更好。 - **动画编辑器**现在硬盘上有一个二进制流文件,其中包含它在上一步捕获的图像序列以及每帧的时间戳。然后处理这些帧,以便从前一帧中减去每个时间戳,并将差值与该图像关联起来。这样,每帧都有一个时间戳,告诉动画师在绘制一帧后需要等待多长时间才能绘制下一帧。当用户在编辑过程中移动、复制或以其他方式更改帧序列时,这些帧会随之携带各自的延迟时间。
- 用户使用**动画编辑器**的工具将精灵添加到视频中,直到完成视频精灵编辑。
- **动画编辑器**然后绘制和定位所有精灵,以生成最终图像序列,并将其记录在单独的二进制流‘*..._record.bin*’文件中。
- 当您准备好使用第三方视频屏幕捕获应用程序并生成您的项目的 MP4 时,请使用上下文菜单的“场景->播放速度设置”选项将视频播放速度设置为与源视频速度相对应(如果您使用半速源视频 -> 将录制速度加倍,或以四分之一速度设置为 4.0)。使用您的第三方应用程序捕获您计算机屏幕的视频,并告诉**动画编辑器**以您设置的速度播放您的项目的录制版本。这将生成您的项目的 MP4 视频。
- 在第 8 步中使用的屏幕视频捕获,并使用您用于创建音频文件和半速视频的视频编辑器进行最终编辑。包含您的音频文件的声音,添加您认为最好的任何标题,然后播放片尾字幕。
结果将取决于您的硬件(以及您的创造力)。我使用的是笔记本电脑,在半速源视频下得到了不错的结果,但如果您有更快的机器,效果会更好。输出*_record.bin*文件中每帧的时间戳与原始源视频*.bin*文件中帧之间的时间戳不同,前者在每帧之间保留延迟时间,而*_record.bin*文件跟踪视频开始以来的时间,因此在播放最终项目时没有累积误差。此外,*_record.bin*文件对每帧有两个时间戳。第一个等同于原始 MP4 转换为二进制流时记录的原始延迟时间(累积帧延迟用作记录文件的戳,无论时间轴编辑期间用户创建的任何更改),另一个时间戳是第一个时间戳乘以使用上下文菜单的“**场景**->**播放速度设置**”选项获得的结果。由于改变的速度反映为直接写入文件的戳,然后您告诉编辑器播放您的动画,因此速度设置不必是 2 的倍数(编码器可能会倾向于假设用于内部二进制寄存器移位,因为您的计算机可以非常快速地乘以和除以 2)。最终播放速度的时间戳相对于源视频进行了修改,并在**动画编辑器**播放录制之前设置。因此,在播放时不需要进行任何数学计算,所有帧都已准备就绪,并且有一个单一的开始时间可以进行比较,然后再将下一帧放到屏幕上。这样,您的动画播放只需要显示第一张图像,然后在比较下一个加载的视频帧的时间戳与当前时间时,在时间流逝时 splash 下一张图像,然后从二进制流加载下一帧并再次执行此操作。
使用动画编辑器
注意:下面提到的**精灵绘制顺序**,并在视频中仅简要提及,在影片拍摄时实际上称为“精灵绘制顺序”。这种对礼仪的严重错误和对可接受的社会礼仪正常标准的忽视,严重伤害了作者的代码道德感,他对此深表歉意。请接受视频对臭名昭著的**绘制精灵顺序**列表的错误标记,将其视为由于缺乏睡眠而导致的判断失误。谢谢。
您首先需要熟悉我在上一篇文章中介绍的 classSprite。您不需要阅读该系列的所有文章,但您需要熟悉 Sprite Editor 2017 - Build and Edit Animations 文章,并了解如何使用精灵才能充分利用**动画编辑器**。
一旦您的精灵绘制完毕并准备就绪,就可以加载动画编辑器。
步骤 1:将 MP4 加载到动画编辑器
加载 MP4
将鼠标光标移到屏幕底部的**时间轴**上。右键单击鼠标以调出附加到**时间轴**的上下文菜单,然后选择“加载->MP4”,如上图所示。**动画编辑器**会将您选择的 MP4 文件加载到 WindowsMediaPlayer
并播放视频。然后,它会尽可能快地拍摄您的计算机屏幕截图,直到视频完成。由于**动画编辑器**需要全神贯注,并且您的项目结果取决于您的机器在此操作中的最佳利用,因此最好在继续之前停止运行所有其他应用程序。关闭 WiFi,以免您的 Windows OS 决定在此刻升级自身。然后放手去做。
一旦此操作完成,您将有两个时间轴需要处理……这没关系。
时间轴就是时间轴,它之所以被称为时间轴,就是因为它是您项目的**时间轴**。
尽管其他时间轴(请使用小写字母)也是时间轴,但它们并不是您要绘制精灵的时间轴。如果您还没有注意到,您可以通过在时间轴上方使用鼠标滚轮来放大/缩小任何时间轴。单击任何时间轴,您都会在屏幕上看到图像。您可以使用鼠标选择多个帧并观看这些帧的循环,然后使用右键菜单,您可以像在任何编辑器中一样进行剪切、复制和粘贴。这些时间轴实际上只是一系列索引,指向您正在处理的 *.bin* 文件中的常用图像列表。即使您更改了整个时间轴,您实际上并没有更改 *.bin* 文件。您只是在改组指向 *.bin* 文件中帧的索引顺序,但 *.bin* 文件保持不变,只有您项目 *.xml* 文件中存储的数据会被更改。您可以查看**动画编辑器**的任何已保存项目的 *.xml* 文件(如下所示),并看到时间轴中的 TimeFrames 每个都有一个文件路径和一个索引,该数字指的是该文件中 *.bin* 帧的索引。您项目使用的所有 *.bin* 文件必须位于首次加载时它们所在的位置,否则您的项目将无法正确加载。您不需要实际了解这些才能使用**动画编辑器**。只需记住,您对输出视频时间轴所做的任何更改都不会反映您之前保存的音频文件……您是否要更改源视频的帧顺序,这真的只取决于您的意图,但请记住,如果您计划使用原始视频的音频,您需要保持时间轴不变。
因此,选择底部时间轴(默认为“default”,直到您给它起一个新名字)的所有帧并复制。然后单击其上方的**时间轴**,并通过上下文菜单进行“**粘贴**”。
完成此操作后,您的项目时间轴中将准备好原始视频,等待您进行绘制。
步骤 2:创建精灵(Pixies)
如果您阅读了我的文章 Sprite Editor 2017 - Build And Edit Animations,您就会知道精灵(sprite)是什么。我从 Wikipedia 上得到的定义是:“在计算机图形学中,精灵是一种二维位图,它被集成到一个更大的场景中,最常见的是在二维电子游戏中……”后面还有,但这就是要点。只是,有了 **动画编辑器**,您可以在同一时间屏幕上有几个不同的角色(例如,动画卡通),而每个角色在技术上都可以算作一个精灵,但如果您想制作一个像哈哈镜一样的达菲鸭场景,或者一个马文 the Martian 的克隆情节,那么您就需要绘制同一精灵的几个不同版本。classSprite
的单个实例可以为您做到这一点,但您需要跟踪屏幕上所有不同的克隆。每个图像都需要为每个视频帧拥有自己的大小、角度、位置、动画、动画帧等值(此信息存储在一个名为 **classPixieFrame** 的类中)。因此,在引用这些相同角色的不同图像时,**动画编辑器**称它们为“精灵”(Pixies),而不是说“精灵”(sprite)。在民间传说中,精灵(Pixies)与精灵(sprites)和仙女(fairies)基本相同。在计算机科学中,有一个叫做 Pixie Renderer 的东西,它显然是“由德克萨斯大学奥斯汀分校计算机科学系的 Okan Arikan 开发的光线追踪渲染器,用于生成逼真的图像”。但在**动画编辑器**中,情况并非如此。我只是需要一种方法来描述正在发生的事情,而不必混淆精灵(sprite)和精灵(pixie)。也许以后,我会找到使用“仙女”(fairy)一词的理由,但现在还没有。
所以,屏幕上的每个角色都是一个精灵(Pixie),它使用 Sprite 类的实例来绘制。
每个精灵绘制的 TimeFrame 都将包含绘制该精灵在该单个 TimeFrame 上所需的信息。该信息在一个名为 classPixieFrame
的类中。每个精灵都指向 Sprite 类的实例,该实例告诉动画师,当您指定精灵的角度、动画和动画帧时,应该在屏幕上显示哪个图像。您可以拥有任意数量的精灵,但对于您项目中想要包含的任何具有相同精灵图像的精灵,您只需要一个 Sprite 类的实例。如果您喜欢,您可以在屏幕上显示十几个唐老鸭。尽管每个都将是一个独立的精灵(Pixie),但它们都将使用相同的唐老鸭 Sprite 类实例来绘制。
清楚了吗?……您会习惯这个想法的。
要创建一个精灵(Pixie),您只需单击**场景编辑器**顶部附近的**精灵(Pixie)**按钮,然后在鼠标下方弹出的上下文菜单中选择“**新建**”。会出现一个表单,要求您输入新精灵的名称,只需输入您想给它起的名称,然后点击“**确定**”。此时,**场景编辑器**的外观将略有改变。精灵(Pixie)组合框将变成红色,这通常是一个不好的迹象,但在这里它只意味着这个新精灵还没有分配精灵(sprite)。为了帮助您选择精灵(sprite)分配给您的精灵(Pixie),**精灵列表**将被调出,并绘制在**精灵绘制顺序**列表的上方,如下图所示。
如果您想要的精灵(sprite)尚未出现在您的列表中,您需要从硬盘加载它(或者创建一个文本精灵,如果您需要的话)。只需单击蓝色精灵列表区域中的“**新建**”按钮并加载您需要的精灵。一旦精灵被添加到加载到内存中的可用精灵列表中,双击它就会将其绑定到上方组合框中当前选择的精灵(Pixie)。
**注意**:更改精灵(Pixie)的精灵(sprite)可能会导致**动画编辑器**崩溃,如果您随后尝试绘制新精灵(sprite)不识别的动画或动画帧。
注意:在加载现有项目时,尽管精灵(Pixie)组合框似乎已经为您选择了一个精灵(Pixie)来处理,但在开始之前,您需要使用组合框来确认此选择。这仅在您首次加载 *.xml* 项目文件或创建新精灵(Pixie)时才适用,并且在这两个事件之后只需执行一次。如果您不单击精灵(Pixie)组合框来确认您的选择,下面的路径编辑器界面可能无法正常工作。我知道这是一个 bug,但它相对次要,您暂时只能接受它。
一旦您为您的新精灵(Pixie)命名并为其分配了精灵(sprite),您就可以开始工作了,并将**精灵列表**推回到**精灵绘制顺序**的藏身之处,您很快就会用到它。
步骤 3:生成路径
每个精灵(Pixie)都绑定到一个精灵(Sprite)。
而 Sprite 类的每个实例都包含一个或多个 Sprite 动画。
而每个 Sprite 动画都包含一个或多个 Sprite 动画帧。
然而,您的精灵(Pixie)在它出现的每个视频帧中的外观,不仅由其**精灵**、**精灵动画**和**精灵动画帧**描述,还由其**大小**、**角度**和**位置**描述。
所有这些信息,对于它出现的每个视频帧,都存储在精灵(Pixie)的**PixieFrame**中。
项目时间轴中的每个视频 TimeFrame(如 XML 文件所示)都有一个 PixieFrames 列表,描述了每个 TimeFrame 中的所有精灵(Pixie)。
要编辑任何精灵(Pixie)在时间轴中给定视频 TimeFrame 的 PixieFrame,您可以使用**帧编辑器**界面。
- 选择您要编辑的视频 TimeFrame(可以通过在主屏幕上滚动鼠标滚轮、使用时间轴跳转到所需帧,或使用主屏幕上下文菜单的“帧”选项)。
- 从上面的精灵(Pixie)组合框中选择一个已在该指定 TimeFrame 中绘制的精灵(Pixie)。
- 使用**帧编辑器**界面更改您想要的值。
但这只有在该精灵(Pixie)在时间轴中选定的视频 TimeFrame 中已经有一个 PixieFrame 时才可能发生。
这时就轮到**路径编辑器**出场了。
**路径**(在**动画编辑器**的上下文中)是一种为项目时间轴中的一系列视频 TimeFrames 生成 Pixie Frames 的方法。您设置所需的变量(位置、大小和角度的起始/结束值,以及选定的精灵动画和精灵动画帧),然后点击“**生成帧**”。
要做到这一点,您必须
- 确保您选择了正确的精灵(Pixie)(再次单击该组合框以确保)
- 设置开始帧
- 选择一个精灵动画
- 选择一个开始精灵动画帧索引(默认为 0)
- 选择结束帧,该帧可以对应精灵动画的结束(我通常使用比完整动画少一帧,并获得良好结果),或者您可以循环播放相同的动画,直到您到达项目时间轴中的特定视频 TimeFrame。
- 有两个方便的功能称为:“**跟随前一帧**”和“**前置后一帧**”。这两个功能在路径编辑器中都有自己的按钮,允许您在不同动画之间无缝过渡,而无需重新定位、调整大小或设置精灵的角度,以便此路径的起点与此新路径开始之前视频帧中相同精灵的大小、角度和位置完全匹配(同时还考虑了您路径两端的 `UseRelativeTo` 肢体)。它们的名字不言自明,可以区分它们之间的区别,但您必须确保在使用“**跟随前一帧**”选项之前正确设置路径的开始帧,同样,在使用“**前置后一帧**”功能之前必须设置结束帧值。
- 设置您的精灵(Pixie)在开始帧和结束帧的角度和大小。您可以通过点击下面描述的 **pt Start** 和 **pt End** 按钮来查看这些更改的结果,并在步骤 7、8 和 9 之间循环,直到您对精灵(Pixie)的开始/结束角度、大小和位置满意为止。
- 设置路径的角度增量(在精灵(Pixie)新路径的长度上的角度变化),您的精灵(Pixie)将在开始帧和结束帧之间旋转指定的度数。
- 如果您需要设置精灵(Pixie)的开始/结束位置,您可以通过多种方式进行。**pt Start** 和 **pt End** 按钮允许您使用鼠标光标将精灵(Pixie)定位在屏幕上的任何位置。当您使用鼠标将精灵(Pixie)定位在屏幕上时,视频图像将被调整大小,并在屏幕上出现一个红色的矩形框。红色矩形框指示了调整大小的图像中的屏幕边界,因此您可以将精灵(Pixie)的开始/结束位置放置在可见屏幕的边界之外,并允许精灵(Pixie)随意进出画面。
- 点击“**设置字段**”按钮,会提示您希望路径修改的字段列表(通常,在您熟悉**动画编辑器**之前,请勾选所有选项,并确保您只想修改选定精灵(Pixie)的 TimeFrames 的某些部分)。
- 当您对选择满意后,点击“**生成帧**”按钮,然后循环浏览您的路径以查看结果。您可以对您的路径进行更改并重复操作,但应记住经常保存您的项目,以免在动画编辑器出现故障时丢失数据(劳资谈判正在进行中,但软件工会代表们正在为比契约式代码重用更好的退休选择而坚守……罢工不太可能发生,但在此项目仍在开发过程中可能会发生。如果您的当地工会发起罢工,您至少会有一个项目蓝图,并且可以随时强迫他们复工)。
4. 精灵绘制顺序
尽管项目时间轴中的每个 TimeFrame 都包含屏幕上出现的每个精灵(Pixie)的 PixieFrames 列表,但该 PixieFrames 列表是通过在任何给定 TimeFrame 中逐个添加精灵(Pixie)来生成的,但这并没有告诉**动画编辑器**以什么顺序绘制它们。因此,您需要告诉**动画编辑器**您希望这些精灵(Pixie)按什么顺序绘制。这与 Sprite 类本身如何绘制 Sprite 类似,每个 Animation Frame 都会汇总一个精灵肢体列表,并且只有在它弄清楚每个肢体应该在哪里之后,它才会开始以特定于该动画帧的 DrawSequence 进行绘制。通过这样做,无论是在 sprite 类中还是在这里的**动画编辑器**中,您都可以决定哪些图像出现在其他图像的前面或后面。在 Sprite 类中,首先绘制角色最远离摄像机的轮廓很重要,这样它就会被该角色自身的其他肢体和胸部或其他部分部分覆盖。同样,在这里您也可以选择设置一个特定的顺序,以您希望在任何给定 TimeFrame 图像上的精灵(Pixie)被绘制,这样可见的动作就能更好地讲述您想要传达的故事。因此,为此,我们现在来谈谈所谓的精灵绘制顺序。精灵绘制顺序本身相对简单,出现在给定帧中的任何精灵(Pixie)都有一个 PixieFrame,并且它本身包含在精灵绘制顺序中的某个位置。要更改此绘制顺序,您只需使用鼠标选择绘制顺序中的一个精灵(Pixie),然后向上或向下滚动鼠标滚轮,具体取决于您希望它显示在屏幕上的位置。
如果您看下面的图片,您会注意到奥贝利克斯正用他最喜欢的锁喉技术抓住两个罗马人。所以,如果我们想用(旧的 - 直到最近一次文章更新两周前)Sprite class
来绘制这个,您将很难处理精灵,并且需要费一番周折才能让奥贝利克斯的身体出现在两个罗马人后面,同时又让奥贝利克斯的手臂出现在那两个罗马人前面。要做到这一点,您可以将他的手臂拆分成两个单独的精灵,然后进行数学计算以将它们绘制到需要的位置,或者,您可以制作罗马人作为附着在奥贝利克斯身上的“肢体”,然后您可以将它们绘制在任何 Sprite Animation Frame 的绘制顺序中,在其手臂后面。
因此,我看了看这个问题,并决定我需要做些什么来解决它,并提出了一个快速简单的解决方案。Sprite Class
的 Draw_Animation_Frame()
现在有一个重载,允许您指定一个要从身体其余部分单独绘制的肢体列表。
然后那个函数
- 创建一个新的精灵所有肢体的列表。
- 然后它会创建附加到调用函数指定的精灵肢体上的肢体的子列表,并从第一个通用肢体列表中删除它们。
- 当它拥有与调用函数指定的肢体数量相等的子列表时,它就会组装精灵并准备好进行绘制。
- 它不是将整个精灵绘制到一个位图上,而是只绘制每个列表中的肢体,而这些肢体正好出现在一个包含所有精灵肢体的正常完成的精灵位图的位置上,但是现在它们各自的位图与包含所有精灵肢体的位图大小相同。
- 然后,它按照调用函数指定的肢体顺序将所有这些位图返回给调用函数。
所以,本质上,对于奥贝利克斯的情况,您需要做的就是告诉 classSprite
您需要三个图像才能绘制我们下面看到的内容:一个是没有手臂的身体,以及两个手臂本身。要做到这一点,您需要创建一个包含三个肢体的列表:LeftShoulder
、RightShoulder
和 MasterLimb
。因此,所有附加到 LeftArm
(leftForearm
和 LeftHand
)上的肢体都将在单独的位图上绘制,精确地在完成的精灵位图中它们出现的位置。当您在调用函数发送的列表中包含 RightArm
时,rightArm
、rightForearm
和 RightHand
也会如此。最后,身体和所有未附加到指定肢体(左/右臂)的肢体将绘制在第三个位图上,并且所有三个位图将以列表形式返回给调用函数。它们的大小都相同,您只需要计算第一个应该在哪里,然后您就知道它们都在哪里。有了这些,您就可以绘制奥贝利克斯,绘制罗马人,然后绘制奥贝利克斯的手臂,就完成了。
如果您有幸观看了 维尼熊遇见贝蒂娃娃 视频,您会注意到维尼被打了,结果眼青。别担心,他活该,在贝蒂被他缠住之前,她放他走了。有几种方法可以绘制维尼熊的黑眼圈。最简单的方法可能是在某些特定的动画中只显示他有黑眼圈,或者准备两倍数量的动画,一半显示黑眼圈,另一半不显示。但不是这样做,维尼的所有动画都显示了他有黑眼圈(除了一个涉及某个引发麻烦的中指的动画)。
看下面的图片
这里,您可以看到维尼熊遇见贝蒂娃娃视频的两个时间帧的序列。在第一个中,您会注意到“黑眼圈”在精灵绘制顺序中首先被绘制(在维尼肿胀的头部后面),而在第二个帧中,“黑眼圈”是在维尼受伤的自尊之后绘制的。您可能会说,绘制一个与维尼熊大小相同的额外位图会大大减慢速度,您说得对,但出于我稍后将解释的原因……这真的无关紧要。这是制作动画视频(而不是对速度要求极高的电子游戏)的一种快速解决方案,我们可以从容地创建所有图像,因此可以采取捷径来获得我们想要的结果。维尼一直都有黑眼圈,他只是以为他可以藏在右耳后面而已。
实现这一目标的用户界面并不算太难。在精灵绘制顺序中选择一个精灵(Pixie),然后使用鼠标右键调出其上下文菜单。您将获得三个选项,可以
- **删除主肢体**(在此一个帧中移除整个精灵)
- **删除一系列主肢体**(删除一系列时间帧中的整个精灵)
- **单独绘制肢体**(这将为您提供一个肢体列表供选择)
选择您要单独绘制的肢体后,您只需按照所需的顺序设置精灵绘制顺序即可。
5. 录制您的视频
当您点击**场景编辑器**顶部**文件**按钮下方的**场景**按钮时,您将可以选择播放**动画**或**录制**您的项目。任一选择都会在视频屏幕上显示您绘制的帧序列。但是,当您简单地运行动画时,**动画编辑器**所做的是从头开始重新创建每个 TimeFrame。它加载背景源图像以及项目时间轴中特定 TimeFrame 的所有 PixieFrame 信息,然后它会按照每个 PixieFrame 中描述的精灵(Pixie)的位置、大小和角度绘制各种精灵(Pixie)和它们的精灵(Sprite),并在完成所有这些工作后,将其图像显示在屏幕上。**动画编辑器**会尝试根据每个背景视频帧的时间延迟来安排每一帧,但绘制动画可能需要比平滑视频播放所需的时间延迟更长的时间。为了解决这个问题,**动画编辑器**为您提供了一个选项,可以将所有图像输出并存储到硬盘上的单独“*_record.bin*”文件中,并为每帧添加一个时间戳,您可以修改该时间戳来加速或减速您的最终项目。因为在**播放**过程中,**动画编辑器**只需要从硬盘加载一张图像(这通常是在绘制所有精灵之前加载背景视频帧时会做的事情),然后将其 splash 到屏幕上而无需进行任何处理,这会产生更平滑的动画。此外,因为 *_record.bin* 文件中每帧的时间戳并不反映两个相邻帧之间的时间延迟,而是反映自动画播放开始以来的时间延迟,所以当您从一帧测量到下一帧时,没有累积误差。最终播放版本的项目应该运行得更流畅,特别是当它涉及到在任何时候在屏幕上绘制许多大型复杂精灵图像时。
在录制您的项目之前,您可能需要先使用上下文菜单的**切换视图**->**帧**->**帧索引**和**切换视图**->**帧**->**帧时间戳**选项来移除通常打印在视频屏幕右下角的**时间帧**索引和**时间戳**信息。
当您准备好录制时,点击顶部附近的**场景**按钮,然后从出现的菜单选项中选择**录制**。**动画编辑器**将循环遍历所有 TimeFrames,并在每一帧上绘制所有精灵(Pixie),使用您在编辑项目时创建的 PixieFrame 信息。当**动画编辑器**完成这项工作后,将在项目的目录中创建一个新文件,然后当您再次点击**场景**按钮时,该文件将被检测到,并为您提供**播放**您的项目或**播放 - 设置速度**的选项。点击**播放**以观看您的动画。
如果您的源视频中有真人演员,并且您已经延长了源背景视频以提高项目开始时加载 MP4 阶段的性能,那么您需要加快录制速度,以便生成一个平滑的视频动画,其速度与您的源音频文件相同。这样,您就可以将音频文件叠加在您的动画之上,并将原始音轨与您的动画项目匹配,然后再使用您的第三方视频编辑器添加 Looney-Tunes 音效。如前所述,录制的项目对每帧有两个时间戳。第一个时间戳在您编辑背景视频序列并重新录制项目之前不会改变。首次录制项目后,这两个时间戳是相同的,但您可以使用视频屏幕的上下文菜单的**场景->播放速度设置**选项来更改第二个时间戳,该选项会将您在此输入的播放速度值乘以每帧的第一个时间戳,以生成同一帧的第二个时间戳。在播放过程中,录制动画的开始时间与每帧的修改后时间戳进行比较,以确保您的视频以您设定的速度平稳运行,只要您的硬件能够跟上。如果您的计算机无法足够快地从硬盘加载图像并将其显示在屏幕上,那么将此值设置得过高是没有意义的。此操作仍然依赖于硬件,并且不会丢帧,因此最终输出将取决于您计算机的处理速度和硬盘访问速度。
一旦您对您的动画满意,您就需要使用第三方视频屏幕捕获应用程序来捕获您的动画并将其保存为 MP4。当您这样做时,您需要在启动动画录制之前启动视频屏幕捕获应用程序,并在录制播放完毕后停止视频屏幕捕获。因此,生成的 MP4 需要进行编辑,以剪掉此操作的前后端,然后才能成功地叠加您的源音轨。
代码
我于 2020 年 3 月 31 日启动了这个项目。我们当时刚刚开始在新不伦瑞克省加拿大“新冠”疫情。我起初没有多想,直到大约十分钟后才意识到,“嘿,等一下。这是一个巨大的项目。”从那时起,我所有的其他项目都搁置了,而且我毫不后悔。花了三个半月才达到这一点,还有很多工作要做。最初,数据以 XML 文件形式存储为一系列路径。然后,在两周后的第一个新冠洗手视频之后,我改用了目前使用的**时间轴**和**时间帧**。那时,许多当前功能已经包含在内,但一直在失败或导致崩溃。随着我制作更多视频项目,新功能逐渐出现,而 bug 则缓慢迁移到代码的“蟑螂旅馆”。时间戳尚未被使用,尽管它们正在被记录,结果系统性地比现在更卡顿。随着我制作更多视频,进度很慢,我发现自己如此沉迷于我正在处理的视频项目,以至于我忍受着我开始制作视频项目来帮助我查找和修复的 bug。当时,我会在制作完整个视频后才开始纠正我发现的 bug。进展缓慢。当我制作 Rose-Bursts 视频时,我改变了这种习惯,并致力于改进屏幕捕获方法,并在出现 bug 时立即解决。许多对我来说“够用”的界面问题不符合开源发布的标准,所以在过去一周左右的时间里,其中许多问题都被发现和修复了。
我在开发 Sprite Editor 的过程中开发了该应用程序的许多技术。在处理 **动画编辑器**期间,Sprite 类中需要实现一些东西,所以我花时间改进了那个项目,并在大约一周前上传了这些更改。对 `classSprite` 最重要的更改之一,在这里绝对需要提到的是类中的 `draw_Animation_Frame()`,正如上面关于精灵绘制顺序的解释所述。
//
public Bitmap draw_Animation_Frame(ref classSpriteData cSpriteData)
{
List<classSprite_Limb> lstLimbsSource = new List<classSprite_Limb>();
lstLimbsSource.Add(cCostumeInfo_Default.cLimb_Master);
List<Bitmap> lstBmp = draw_Animation_Frame(ref cSpriteData, lstLimbsSource);
if (lstBmp.Count > 0)
return lstBmp[0];
else return null;
}
public List<Bitmap> draw_Animation_Frame(ref classSpriteData cSpriteData,
List<classSprite_Limb> lstLimbSources)
{
...
}
//
现在这个函数有一个重载。正如您在上面看到的,该类现在绘制一个位图列表,而不是单个位图。您可以给类一个肢体列表,它将生成与原始位图大小相同的肢体图像。这样,您可以将精灵的手臂或腿与其主肢体分离,并通过使用**精灵绘制顺序**以您喜欢的任何顺序绘制不同的部分。
一路上有很多问题,但通过在这个项目和**精灵编辑器**的制作/修复功能之间来回切换,使得事情更容易,因为我一直都在思考这个问题。当然,我很欣慰地看到我的视频项目成果,尽管与有 bug 的未完成的**动画编辑器**打交道带来了很多麻烦,但这本身就是一种动力。
下一步
- 我曾考虑过将 Sprite 类与一个包装器捆绑在一起,并使用 actor 和视频捕获制作一种新型精灵。技术与此处使用的类似,只是 Sprite Editor 会将 actor 分离到一个白墙前,并且用户需要进行大量编辑才能在创建的任何动画的每一帧中持续定位 actor 的质心和关键肢体。
- 关于 **动画编辑器**本身,我计划将背景从视频移开(同时保留它作为用户的选项),并引入卡通背景、中景和前景。通过跟踪精灵相对于某个共同的卡通小镇世界轴心的位置(而不是屏幕上的一个点),我可以引入摄像机视角和在安全的无新冠环境中在卡通世界中平移和缩放的摄像机。我对此有一些想法,制作动画卡通听起来是一个有趣的项目,所以我可能会很快开始。
不过现在,我只想完成这篇文章,然后把电脑收起来(差不多)一两个星期,这样我就可以用我的 GridMethod 应用(很可能是阿尔布雷希特·丢勒)来处理另一个艺术项目。但我会带着更多关于这个项目的更新回来,可能是一篇单独的文章,因为这篇已经够长了。在那之前,为什么不邀请杰西卡·兔去你家“**隔离和放松**”呢,罗杰不会介意的。与此同时,我将继续做一些事情,而贝蒂·布普则将卡通小镇中那些名声不好的暴徒挡在外面。
历史
- 2020年7月16日:首次发布