正在处理的相机(2D和3D)

本教程介绍了用于2D和3D处理草图的移动虚拟相机。 首先,它介绍了在固定摄像机时包装屏幕元素(如背景)的策略。 引入着色器并使用多个渲染器后,它会创建一个2D相机。 然后,它会创建3D等效项,并沿途查看投影。 本教程以具有动态背景和平视显示器(HUD)的第一人称射击(FPS)摄像机结束。

处理功能旨在快速制作原型,并对创意编码进行友好介绍。 因此,需要对其进行定制以实现上述功能。 那些自由选择工具的人可能会在Unity或Godot中找到更好的选择,仅举几例。

如果首选处理,则某些相机库可用。 乔纳森·费恩伯格(Jonathan Feinberg)的peasycam包括HUD和旋转控制功能。 乔什·卡斯尔(Josh Castle)专门为FPS相机编写了一个库QueasyCam。 另一方面,在设计目标足够简单以使用内置Processing实用程序工作的情况下,J。David Eisenberg的“ 2D Transformations”和Dan Shiffman的“ P3D”可能比本教程更好看。

对于那些仍在阅读的人,希望本教程将提供一些见解。 它是用Processing 3.4编写的。 有助于了解集成开发环境(IDE)中的一些工具,这些工具可使类,变量和函数更易于搜索和更新。 作为快速复习,

其中lr代表相机视图的左右边缘; tb为顶部和底部; nf ,用于近和远裁剪平面。

在源代码中,透视投影依赖于此处找到的辅助函数frustum 。 截锥体是一个截顶的方形金字塔,其中从中心位置向外延伸到摄像机视场四个角的线被近和远剪切平面切断。

在左上角的图像中可以看到视锥台的影响,在这些视域中,球体在接近地平线时似乎会后退; 相同的球体在正交投影中并排出现在右上方。 用矩阵表示,视frustum看起来像

首先,我们使用Ana Tudor的“使用JavaScript模拟CSS计时函数”作为参考,为向量创建一个Easy-in函数。

诸如PaperboyMonster of KingUltima VII之类的视频游戏普及的倾斜投影对上述工作流程提出了独特的挑战。 与其他3D相机一样,我们操纵渲染器的投影矩阵。 但是,由此产生的失真不会使相机旋转。 因此,相机将保持前视方向,就像在2D模式中一样跟随虚拟角色。 为了跟上步伐,它必须将化身在z轴上的运动转换为在x和y轴上的运动。

我们从Shaun Lebron在此处的Stack Overflow讨论中设置的示例开始,使用固定摄像机。 oblique函数取决于上面定义的ortho函数。

另一个复杂的情况是FPS相机,这种游戏在《 毁灭战士》 ,《 使命召唤》等游戏中得到普及。 在此,必须将通过按键输入进行的化身运动与通过鼠标输入控制的透视投影结合起来。 我们从类构造函数和一些重要变量开始。

在2.5D中,我们将HP条形图和背景放置在与相机更新的渲染器相同的渲染器中。 我们将矩阵重置,从而避免了这样做的不利影响,方法是将背景放在draw的开头,将GUI放在结尾。 在3D中,太多的矩阵对此并不有吸引力。 相反,我们使用多个渲染器:辅助渲染器处理相机和世界,而GUI和背景将被视为在“ post”中添加的效果。

在修改总体策略的同时,我们还更新了GUI的美观性。

我们参考《着色器手册》中有关噪声的章节,而后者又参考了Morgan McGuire的GLSL实现。 着色器的完整代码可以在这里找到。 对于Perlin噪声,单纯形噪声和基于Voronoi的噪声背后的数学有很多研究,包括它们所依赖的hashrandom函数,这些将为进一步的研究带来回报。 要进行的最直接的比较是与Processing实现。

掌握了一些基础知识之后,我们可以开始将相机运动视为设计问题 。 我们可能会问,化身的功能(在虚拟空间中执行的操作)将如何影响相机。 例如,在主要具有水平运动的平台游戏中,相机可能会等待玩家在平滑到新位置之前降落在平台上。 相比之下,在化身掉落或爬深矿井的游戏中,相机无法等待。 游戏开发者大会(GDC)上的技术讲座是进一步探讨这些问题的好方法。

另外,值得一提的是,将单个屏幕作为限制而不是限制。 在艺术实践中,约束可以是自我施加的,也可以是外部施加的,并且可以激发而不是限制想象力。 例如,Ludum Dare 31向游戏开发人员提出挑战,要求他们开发一款适合一个屏幕的游戏。 特别值得注意的是丹尼尔·林森的鸟鸣。

最后,有时相机必须停止注视,必须拉下窗帘,并重新布置舞台上的元素。 希望这里的技术使我们能够处理持续,流畅的相机工作以及场景过渡。