请取件

2023-11-03

Part1前言

最常见的鼠标平移算法是平行于水平面(地面)的:无论相机视角如何,平移时,相机的世界Z值始终不变,因为绝大多数场景都是在观察地面上的物体,而人类的行走总是平行于地面的。但是本文要介绍的另一种小众的平移算法则平行于视锥体的截面,平移时,相机的本地X值始终不变,平移面始终垂直于相机的方向,这种鼠标平移算法适用于空间类的场景,比如观察一堆无人机的飞行轨迹。区别于“地面类”的平移,“空间类”平移算法还要求垂直同步。比如有如下的要求:鼠标左键按下后,通过光标位置的射线计算出光标点对应的场景位置,在平移过程中,该场景位置在屏幕上的投影点始终与光标在屏幕上的位置同步。这里要求光标与光标指向的物体同步移动,那么这条射线始终垂直于镜面(在现实中,镜面是球面,因此是垂直的),故曰垂直同步算法。

ecf7a14ee1462f5fa493930a6f3368d3.png

Part2实现原理

首先构建一个空间中的三角形:由视点、原光标点、新光标点组成的三角形。原光标点是鼠标按下时的光标点,新光标点是鼠标移动到的新的位置,原光标点和新光标点都在视锥体的近截平面上。鼠标按下时,沿鼠标方向发送一条射线,若没击中物体则结束,若击中物体则记录下所有参量(记为原光标),当鼠标按住移动时,每移动一个像素都通过此刻的新光标位置和原光标,利用相似三角形算出原光标的撞击点“应该”往哪个方向平移,最后让相机往相反的方向平移相同的距离即可。

00377ca4ba1f3a375e690f901d621718.png
新视点 = 撞击点 - 新光标向量
新光标向量 = 新光标方向 * 新射线长
新射线长 / 新光标距 = 原射线长 / 原光标距

“光标距”指的是光标坐标到视点的距离,“新射线”是一条不存在的射线,相当于原视点到“新撞击点”的向量,或者”新视点“到原撞击点的向量。【就很绕】总之最终要求出新视点的位置,然后将视点移动过去即可。这种"射线垂直同步"算法适用于第一人称的pawn,蓝图其实很简单,需要2个鼠标事件来配合完成:当鼠标“左键按下事件”触发时,从视点沿光标方向发一条射线,在1km内尝试击中物体,在“line trace by channel”中勾选“trace complex”这样保证击中的位置更精确;击中后记录下4个关键信息:
1.是否击中,bool类型
2.撞击点坐标,vector类型
3.射线长度,float类型
4.光标距离,float类型

然后左键事件结束。因此射线只是在按下时发送,不用每帧都发。然后当鼠标平移事件触发时,先要判断左键是否释放,如果释放则结束事件,然后判断之前4个关键记录中“是否击中?”这一条件是否满足,如果没击中那也结束事件。(因此,拖拽无穷远处的天空是无法平移的)。好,当这2个条件都满足了以后,就可以平移了,根据之前的公式,利用那4个关键变量,再结合新光标距和新光标方向向量,就可以求出新的视点位置了。

fd86d4cb910ff3b2eefe3e773d3393d7.png

Part3代码开源

后续代码会在demo工程中开源出来https://github.com/inveta/demo
希望大家持续关注

Part4Inveta团队

Inveta团队由研发、美术设计、建模等组成。团队介绍:
https://www.inveta.cn/about.html
团队开源项目:
https://github.com/inveta

11da13e727d2b49070b6d5bef6993154.jpeg

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

请取件 的相关文章

  • 谷歌浏览器:拷贝为CURL的小技巧

    1 美图 2 背景 一个项目要写shell 要调用一个接口 这个接口很麻烦 传参很多 一个一个的弄很难 后来发现浏览器自带的小技巧 非常好用 拷贝的url是直接可以在命令行中执行的 curl http blog sina com cn s
  • 毕业设计-基于深度学习的加密及异常网络流量检测系统

    目录 前言 课题背景和意义 实现技术思路 一 相关理论与技术 三 基于流时空特征的加密流量识别模型 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力
  • 路由交换-华为usg6000防火墙上配置内网外网通过公网ip访问http服务

    源nat是将私网地址转换为公网地址 实现内部网络访问外网 目的dnat是将对公网访问Ip转换为内网ip 实现外部网络访问内网资源 目的nat的实现有多种方式 一对一转换 带端口和不带端口的转换 最常用的就是使用带端口的一对多转换 即我们常说

随机推荐

  • Levinson-Durbin快速递推法功率谱估计(Python实现版)

    Levinson Durbin快速递推法功率谱估计是在Yule Walker方程法之上建立的 如果对于Yule Walker方程法不熟悉的话可以参考我的一篇博客 Yule Walker方程法参数化谱估计 Python实现版 声明 博客原本在
  • 文件上传漏洞upload-libs pass5

    文件上传漏洞upload libs pass4 首先查看源码 无法使用空格和大小写绕过 且黑名单过滤了 htaccess 查看提示 利用readme php文件 因为没有过滤ini文件 创建 text ini和一句话木马文件 内容为 aut
  • HIVE厂牌艺人_Labelwarts Vol. 2:洛杉矶天才厂牌 Odd Future Records 的开始到结束

    We re F kin Radical been F kin Awesome 我们太TMD激进 太TMD耀眼 Talked a lotta sh t so far words you re at a loss 说着一大堆胡话 让你们都不知所
  • 将ant design pro打包的JS分离出去

    通过analyze分析发现其实react dom并不算小 有100多kb 所以就想把它单独引用 于是就在config ts增加 externals react window React react dom window ReactDOM b
  • 利用python3 生成密码本

    一 思路 1 把密码中含有哪些字符串都放入一个迭代器中 2 确定生成的密码是几位数的 3 将生成的所有密码写入一个文件里面 二 代码 import itertools as its 迭代器 words 1234567890 生成密码本的位数
  • 3.2 Python图像的频域图像增强-高通和低通滤波器

    3 2 Python图像的频域图像增强 高通和低通滤波器 文章目录 3 2 Python图像的频域图像增强 高通和低通滤波器 1 算法原理 1 1理想滤波器 1 2巴特沃斯滤波器 1 3指数滤波器 2 代码 3 效果 1 算法原理 高通和低
  • Mongodb笔记六:排序与限制输出

    一 排序 db collectionname find sort key1 1 key 1 这里的1代表升序 1代表降序 如 对所有人按年龄升序排序 降序排序 二 索引 索引是特殊的数据结构 索引存储在一个易于遍历读取的数据集合中 索引是对
  • FFmpeg中RTSP客户端拉流测试代码

    之前在https blog csdn net fengbingchun article details 91355410中给出了通过LIVE555实现拉流的测试代码 这里通过FFmpeg来实现 代码量远小于LIVE555 实现模块在liba
  • 蓝桥杯每日一题——手算题·空间

    本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 小蓝准备用 256MB 的内存空间开一个数组 数组的每个元素都是 3232 位 二进制整数 如果不考虑程序占用的空间和维护内存需要的辅助空间 请问 56MB 的空间可以
  • [阶段二] 4. MySQL的基本操作

    mysql的基本操作 数据插入 INSERT 语句可以向数据表写入数据 可以是一条记录 也可以是多条记录 INSERT INTO 数据表名称 字段1 字段2 VALUES 值1 值2 插入一条记录 INSERT INTO 数据表名称 字段1
  • 分析工具 nvprof简介

    nvprof 是一个可用于Linux Windows和OS X的命令行探查器 使用 nvprof myApp 运行我的应用程序 我可以快速看到它所使用的所有内核和内存副本的摘要 摘要将对同一内核的所有调用组合在一起 显示每个内核的总时间和总
  • 十六进制转二进制

    public static String hexToBinary String hex if hex null hex length 2 0 return null String bString String tmp for int i 0
  • Visual Studio(VS) 编程推荐字体和主题设置

    首先是字体 工具 gt 选项 gt 环境 gt 字体和颜色 具体图如下 选择Consolas的原因 Consolas算是最常见的编码字体了 在很多的编译软件都是这个字体 而且在这个字体下的中英文标点和半角圆角符号也能有比较明显的区别 至于字
  • Java 集合 - Map 接口

    文章目录 1 概述 2 常用 API 3 遍历 Map 集合 4 HashMap 和 Hashtable 5 LinkedHashMap 6 TreeMap 7 Properties 8 Set 集合与 Map 集合的关系 9 总结 1 概
  • C++11/14之模板全特化,偏特化

    目录 模板全特化 偏特化 类模板特化 类模板全特化 a 常规全特化 b 特化成员函数而不是模板 类模板偏特化 局部特化 a 模板参数数量 b 模板参数范围 int const int 比int小 函数模板特化 函数模板全特化 函数模板偏特化
  • LayerNorm的理解

    LayerNorm计算公式 y x E x
  • C语言实现多级反馈队列调度算法

    include
  • java架构师进阶之路

    Java架构师 应该算是一些Java程序员们的一个职业目标了吧 很多码农码了五六年的代码也没能成为架构师 那成为Java架构师要掌握哪些技术呢 总体来说呢 有两方面 一个是基础技术 另一个就是组织能力和提出解决方案能力了 如果你是想成为Ja
  • Netty入门-Channel

    目录 Channel详解 Channel的特点 Channel接口方法 ChannelOutboundInvoker接口 AttributeMap接口 ChannelHandler接口 ChannelInboundHandler接口 Cha
  • 请取件

    Part1前言 最常见的鼠标平移算法是平行于水平面 地面 的 无论相机视角如何 平移时 相机的世界Z值始终不变 因为绝大多数场景都是在观察地面上的物体 而人类的行走总是平行于地面的 但是本文要介绍的另一种小众的平移算法则平行于视锥体的截面