原视频链接:
Math for game programmers:Juicing your cameras with math(youtube)
Math-for-Game-Programmers-Juicing(GDC vault)
上面是同一个视频,油管看不了的可以尝试第二个链接。非常有价值的视频!!!每个游戏开发者都应该看看。
你也可以在这个网站上找到相关的资源。
http://www.mathforgameprogrammers.com/
Overview
-
Camera Shake(相机抖动)
- Translational vs Rotational
- Noise vs Random
- 2D vs 3D
-
Smoothed motion (平滑运动)
- Parametric motion* (本视频没有细讲,请参考另一个视频Fast and Funky 1D Nonlinear Transformations或者是搜索关键字parametric curve、ease、tween等)
- Asymptotic Averaging
-
Framing (取景)
- Points of focus
- Points of interest
- Feathering
-
Voronoi split-screen (Voronoi 分屏)
- Contruction
- Player- vs split-relative
- View merging
-
Feathering
Part I: Camera Shake
数学上有两个很有趣的区间,[0,1]和[-1,1]。我们喜欢把参数规范化到这些区间,然后利用各种曲线filter,以产生各种有趣的结果。
关于相机抖动,视频中定义了一个变量来描述,“trauma”。它具有以下特征:
- 取值范围为[0,1]
- 受到伤害、压力时(即需要相机抖动时),增加trauma值(如 +=0.2/0.5)
- Trauma值随着时间线性减小
- 相机抖动相关于 trauma的平方或立方(非线性)
关于非线性:
现实世界中有很多非线性的存在,如人对明暗的感知是非线性,此外,其实人的许多感觉都是非线性的。振动也是非线性的,比如弹簧。
偏移 vs 旋转:
相机抖动的效果可以通过对相机的位置或是角度进行微调来实现。视频中推荐:
- 在2D游戏中:我们采用“偏移 + 旋转”的方案
- 在3D游戏中:我们采用“旋转”方案
- 在VR游戏中:慎用!!!结果你能想象!
实现方法:
随机 vs 平滑噪声(如perlin噪声):
上面的方法,我们使用随机值来产生偏移量。但使用平滑噪声(smoothed fractal噪声),通常会得到更好的效果。
小结
Part II :Smoothed motion
相机运动都需要平滑,否则会很突兀。最好的方法是使用Cubic Hermit曲线,参见(“Interpolations & Splines” from the GDC 2012 Math Tutorial)。视频中提供了简单的渐进平滑方法。
Tip: 垂直方向和水平方向并不需要使用同一种算法来平滑。渐进系数也可以是随时间改变的变量。
现在公式是帧相关的,我们只要加入timescale即可。
Part III: Framing
通常,相机的关注点是角色,即相机跟踪角色。但有些时候,我们想让相机尽可能关注些场景中特定的东西,如门,道具等等。所以我们通常会设置Points of focus & Points of interest。
Points of interest通常只使相机发生小范围的移动。
我们可以定义参数“proximity”,即影响相机的优先级。一个常用的方法是proximity跟距离相关,我们设定距离阈值,使得proximity的值范围为[0,1]。通过与每个points的重要性importance想乘,即可得到影响相机移动的权重。
Part IV Voronoi split-screen cameras
上一部分,我们认识到相机要跟踪角色,使得角色不会从玩家视野内消失。那么,多人游戏就会带来难以解决的相机取景问题。此时,就不得不采用分屏方法了。视频中提供了voronoi图分割方法,感兴趣的可以找资料去了解。