UE4基于SenceCaptureComponent2D的视角同步

UE4基于SenceCaptureComponent2D的视角同步

最近看到了一个工程,然后里面有一个采用ScenceCaptureComponent2D的组件实现的一个类似于传送门的功能。看了工程的代码,了解到了ScenceCaptureComponent组件的原理觉得很有意思,而且他的视角懂不机制我觉得计算的算式真的很好,所以自己研究了一下觉得分享出来。
具体的运行效果如下:
在这里插入图片描述
主要的效果是屏幕中间的那个小门,可以看到随着视角的移动,里面看到的景象也会随着视角变化而变化。

ScenceCaputureCompoment2D

关于该组件,本文不进行过多介绍,推荐一个博主写的文章:
https://blog.csdn.net/BDalasja/article/details/105478935
这个博主介绍的很清楚。然后这个工程里面能够实现在这个房间的这个sceneCapture能够显示另一个房间的景象。主要是因为材质原因。
在这里插入图片描述
上图是这个门的Actor类,然后其中的构造函数就是给ScenceCaptureComponent2D组件设置它的TextTarget然后给mesh(门)赋值材质。这个才是是从TextTarget生成而来的。具体操作如下:
在这里插入图片描述
我们来看看场景中的这个类的设置:
在这里插入图片描述
可以看到,BP_Portal1,它给的材质是One的材质,但是TextTarget是Two的target.这就是实现看到别的场景的功能了。可以理解为,这个Actor类里面的ScenceCaptureComponent2绑定的是T_PartalTwo的renderTarget贴图,也就是说这个类里面生成的这个T_PartalTwo是从自己方向朝外的一个图,但是mesh最终的材质并不是由T_PartalTwo生成的材质,而是另一个Actor,也就是BP_Portal2中的ScenceCaptureComponent2生成的T_PartalOne的贴图生成的材质。通俗点将,我从我这里的相机拍到了一张照片,但是我不贴在我这里,我给你,你同样也在你的视角那里拍了一张照片,但是你不贴在你那里贴到了我这里。所以从我这,可以看到你那边的视角,从你那可以看到我这边的视角景象。大概的原理就是这个样子。

视角同步

这个工程我觉得主要有意思的地方还是在于这个视角同步,也就是文章开头展示的随着鼠标转动视角,里面的景色也变化的感觉。(为了方便,由于ScenceComponent在编辑器中会有一个相机生成,接下来都由相机A,B代替)主要的蓝图代码如下:
在这里插入图片描述

主要就是对位置和旋转的同步,类似于,如果在A处玩家的视角向左下旋转30度,对应的B处的SceneCapture相机也要向下旋转30度,所以旋转需要同步,然后玩家越靠近,能看到的景也应该越近,因此相机的位置也要靠近。最终就是要买模拟玩家靠近A的相近的视角变化。
先看旋转:
在这里插入图片描述
首先,拿到另一处相机的旋转然后将Z轴旋转减180度是因为两个相机对玩家的朝向不同。具体如图:
在这里插入图片描述
因为玩家时正对朝向相机的,所以为了达到同步,最好就是将相机的旋转朝向跟玩家一样这样方便获取需要的角度。相机B绕Z轴旋转180度后箭头就朝上了,跟玩家的朝向一样了。
在这里插入图片描述
这一步是利用相机A做一个校准,因为可能相机A本身跟相机B的旋转不同,需要先对对齐,将对齐后的向量与玩家控制的相机的旋转做combine,便可以得到相机B需要达到玩家相机的视角角度需要需旋转的角度值。将其设置为相机B的旋转,便可使旋转跟玩家相机同步。
再看位置:
在这里插入图片描述
里面的两个旋转向量可以理解为一个校准,主要的是在于拿相机B的位置,减去相机A的位置,然后再加上玩家控制器的位置,得到的位置就是相机B的同步位置。具体原理可以参考平行四边形:
在这里插入图片描述
如上草图,相机B的坐标减相机A的坐标会得到向量AB,然后玩家的位置O加上这个向量最终会得到B‘点,这个点就是同步点。因为O是直接加上AB,所以OB’是平行等于AB的,所以OABB’是可以构成平行四边形的。因此O相对于A 的位置就被同步到B’相对于B的位置。

以上就是我对这个功能的理解,如果有大佬有别的看法, 欢迎评论指正,也是初学UE没多久还请大佬指教。本文纯属个人的理解,如有讲错的地方还望谅解指正。

猜你喜欢

转载自blog.csdn.net/weixin_44840850/article/details/125288073
今日推荐