今天,我们来一起学习一下,如何自定义相机的投影规则,以及它的应用场景。
前几天,有位群友问了这样一个问题: 事实上,由于相机的近裁面即为投影面,所以我们仅需将图一中的相机向后撤一些,然后把近裁面距离调大就好。但这突然让我产生了一些疑问:投影面一定得是矩形吗?投影面一定要垂直于相机自身的Z轴吗?可以看到,调整Inspector面板上的参数是无济于事的: 仿佛常识一样,投影面就该是矩形的,且始终垂直于相机的Z轴。不过之后我发现了Camera类中有一些公开的变量,却没有被显示在Inspector面板中,比方说它: Camera.projectionMatrix 官方手册上简单地说了下它是用来设置自定义投影面的,并给出这样一个生动的案例。我们把代码复制到工程里,运行看一下效果: 正如官方说明,相机的投影规则是完全可以自定义设置的。




那么如何设置?
这是一篇优快云上的“Twinsen”大佬发布于2013年的文章:https://blog.youkuaiyun.com/popy007/article/details/1797121 详细地推导了如何让我们想要的投影面变为投影矩阵,内容极其地细腻、严谨,并且没有一点大佬的架子,十分适合新手了解投影矩阵的原理。由于篇幅原因,本文仅使用最终的推导结果。

那么现在就趁热打铁,尝试着实际应用一下!
游戏中的镜子算是比较常见的一个效果,我们可以利用一个RT相机,在镜子的另一侧,与观察者对称的位置渲染出镜中图像。首先写出代码的结构: 大致分为四步骤:先算出必要的向量与坐标,然后算出公式中所需的远近裁面距与裁面上下左右六个参数,接着带入公式求得RT相机的投影矩阵,最后设置RT相机的转换矩阵。

准备素材:
这次的素材十分简单,一个主相机作为观察者,一个用于渲染镜中画面的RT相机,和一个材质为Unlit的Plane作为镜子。接下来开始编写控制RT相机的代码。先算出准备使用的向量与坐标: 用它们计算出远近裁面距与裁面上下左右六个参数: 既然下来就是我们学生党最擅长的——套!公!式! 注意分母不能为0哦~届时我们已经把镜面“强制”作为了RT相机的投影面。打上[ExecuteInEditMode],我们可以在Scene窗口中看到,近裁面已经与镜子重合了,任由我们改动Plane的形态: 最后一步,设置RT相机的转换矩阵,也就是修改相机的Camera.worldToCameraMatrix属性: 这里最前面虽然要乘一个缩放矩阵,但是缩放对相机是无效的,所以缩放矩阵是单位矩阵,可以忽略。 把RT赋给Plane的_MainTex,然后Tiling赋值(-1, 1),Offset赋值(1, 0),以正确的将RT映射到Plane的UV上。我们来看一下效果吧! 不仅可以移动观察者,还可以移动镜子: 掌握了自定义投影面之后,我们可以轻松完成像《鬼泣5》中的次元斩割裂空间的效果: 还有《Coding Adventures》中某一期的“传送门”效果:









OK~这就是本期的全部内容!最后说些题外话:
3月11日,Moon Studio发布了《奥日与萤火意志》,一款Made With Unity的佳作。笔者在沉浸于游戏的美景中时,也在思考这些艺术效果应该如何实现,但苦思不得解。但社区中不乏人才:关于“燕子巢”处的径向光效果,我搜到了MaxwellGeng写的三种体积光教程,还原度极高;关于“夸洛克地穴”处的大面积水体效果,我搜到了CGBull写的次表面散射与噪点扰动,效果拔群。 这让我深深地意识到,MonoBehaviour是一个强大的工具,但它不能实现一切。有许多程序解决不了的问题,美术技术却能轻易化解。
4月17日,Unity全球美术总监江毅冰开课!
扫码了解详情。该链接是博主定制链接,只要是扫了PROS的二维码并付费报名了课程,就可以联系我领取返现福利!我们下期见~

本文详细介绍如何自定义游戏引擎中相机的投影规则,包括投影面形状和方向的改变,通过实例展示如何实现镜像效果和特殊视觉效果,如《鬼泣5》的次元斩割裂空间。
446

被折叠的 条评论
为什么被折叠?



