背景
最近看了一篇 关于Maya,Nuke等不同三维软件相机camera互导的一点问题 里面各种公式,初略瞄了一眼觉得甚是牛逼。于是把网址记下,回家再打开慢慢研究。
分析
简单说明一下它这篇文章的目的。作者是想告诉我们 Nuke 的 Camera (包括最新的 Nuke 9.0)默认是只支持 Horizontal Gate 模式的。所以你在 maya 做动画的时候只用 Horizontal Gate 模式,那肯定是一点问题都没有的,作者也不会写得那么辛苦。但是现实总是残酷的,艺术家们对自由的渴望是无止境的,所以Fit Resolution Gate 通常会被改成 Fill Gate 或者 Vertical Gate。
然后作者告诉我们一个很牛逼的事实,就是他不需要 Nuke 提供 Fill Gate 和 Vertical Gate,他可以通过连节点完成这一个突破性创举。然后就开始他洋洋洒洒的数学推导。乍一看还挺忽悠人的,有三个矩形,其中两个还是相似矩形,参数就有6个之多,然后还有2个要比较大小,推导的图形还不一致。读者稍不留神就会被作者令人眼花缭乱的数学推导方法给整蒙了。
我们先理一下作者的思路,其实作者无非是想利用 bg 属性连接一个更高分辨率的图形来提高 scanlineRender 的分辨率。(我以前都是中规中矩地保证 bg 分辨率跟渲染结果保持一致。从来没见过这么牛逼的连法)接着通过剪裁高分辨率的图形保证质量无损地生成一个符合要求的最终渲染图。
然后看下他推导半天究竟在干嘛。我们拉到最后看一眼,无非就是推导一个缩放系数 S 。好吧,这个系数的计算步骤那么长,我们简化一下:
S = Rf / Rr (Rf > Rr)
S = Rr / Rf (Rf < Rr)
如果还是嫌上述式子太麻烦,那么只要记住一句:因为要提高分辨率,所以缩放系数绝对不会小于1!
实现
不知道是不是我的节点连接手法有问题,原作者写的那个缩放的方法我没试出方便易用的方法。所以我对他的那套节点方式进行修改了。他原来的 bg 连的两个节点的 resolution 都没办法 k 帧,所以我用一个 crop 就代替了。而 scanlineRender 生成后他用 crop 来截取自己想要的区域。然后可想而知,那是个漫长的计算过程,或者要写公式,很麻烦。其实他想要的那个功能用 reformat 完全就可以实现了。然后一个参考节点连接方式如下图:
总结
作者能想到这个思路是很牛逼的。虽然这可能不是生产过程中的最终方案,但是至少这是众多方案中的一种。整个方案考虑得很全面,比如为了保证最终画面的分辨率和质量而渲染更高分辨率的图形,然后通过裁切地方式处理图形。甚至还写了完整的数学推导过程,让人更轻易了解整个运作方式。