草庐IT

UE4基于SenceCaptureComponent2D的视角同步

十点半的末班车 2023-12-17 原文

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没多久还请大佬指教。本文纯属个人的理解,如有讲错的地方还望谅解指正。

有关UE4基于SenceCaptureComponent2D的视角同步的更多相关文章

  1. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  2. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

  3. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  4. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  5. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  6. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

  7. ruby - 在 Rakefile 中动态生成 Rake 测试任务(基于现有的测试文件) - 2

    我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n

  8. ruby - 如何使用 Ruby 基于字母数字字符串生成颜色? - 2

    我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:

  9. 【自动驾驶环境感知项目】——基于Paddle3D的点云障碍物检测 - 2

    文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3

  10. ruby-on-rails - 本地 yaml key 的 i18n 同步 - 2

    类似的问题,但对于java,Keepingi18nresourcessynced如何保持i18nyamllocals的key同步?即,当将key添加到en.yml时,如何将它们添加到nb.yml或ru.yml?如果我在my_title:"atitle"旁边添加键my_label:"sometextinenglish"我想把它给我的其他本地人我指定,因为我不能做所有的翻译,它应该回到其他语言的英语例如en.ymlsomegroup:my_tile:"atitleinenglish"my_label:"sometextinenglish"othergroup:...我想发出命令,将整个键和

随机推荐