扩展&稳定视角向量

z

游龙入画 也可以拿来做些别的东西



几个月前想到个3D空间里的游龙炫酷的冲进平面的画里的主意,结果苦于不会做动画一直搁置着,直到最近想到用蓝图生成模型做鼠标跟随作替代。这篇介绍的是原理和材质实现部分,分两种情况采样texture2d和cubemap。如果有人对那个龙感兴趣的话可以以后介绍一下。


先说球,通常我们采样cubemap的时候,会用模型表面的法线和视线计算来的反射向量来采样,但是这次我想做一个可以交互的球(比较难解释,大家看结果,我们在球和球内模型的相同屏幕位置给上了相同的贴图)。所以显然我们需要利用视线向量来采样贴图,而且需要做一些修改,因为默认的视线向量会在远离的时候角度变小,固定距离的时候大小也无法控制。



看上面的图,我们有相机位置、球中心位置、固定的球半径,所以我们可以得到相机到球中心的向量,相机到球表面的所有向量,最边缘向量离中心的角度。我们把这些向量全放到下方的单位圆里。

在车上画的手抖不好意思

图中的OA表示到球中心的向量,OP表示到球表面的任何向量,OP'是我们的目标向量,就是要把OP挪到OP',因为OAP和OAP'是两个等腰三角形,可以轻松得到角度a,然后正弦定理得到CP的长度,把CP和视野向量OP的反方向相乘,可以得到向量PC,向量AP+PC=AC,就是和AP'相同方向的向量,然后根据另一个忘了什么叫什么定理,我们可以得到AP'的长度,标准化AC向量然后乘上AP'的长度,可以得到向量AP',然后就可以得到OP'啦,就是我们的目标向量。整个计算过程都在下面,可以拷贝这里然后CTRL+V粘贴到你的UE4材质编辑器中。



另一个情况是用平面采样texture2d,就是正经贴图,这个比较简单,不需要处理太多的向量。我们只要把模型表面的点推到平面上就可以了。唯一需要注意的是求点到平面的距离,通常来说保持平面处于正交方向是最方便的,需要放到非正交位置时也不用傻乎乎的算平面在空间中的方程,直接把相机点转换到平面的本地坐标就好了,有研究过Ryan大佬的体积云的同学应该知道在RayMarching的时候相机位置也是类似思路转换到本地空间(local space)。这里不想麻烦就按简单的做了,需要传转换矩阵到材质里的可以搜搜一篇UE4的shadowmap里有示例。



同样的所有计算都在这,然后拷贝这里到你的材质编辑器。



我几乎可以确定这两个都不是最简单或者优化最好的办法,只是分享下自己的做法。有更好的办法的朋友也可以告诉我,有兴趣的也都可以试试这个,感觉应该可以做出些更酷的东西,Enjoy.


这里补上工程文件.