关于 Unreal 的各种坐标系、输入与逻辑的转换问题

说明

已知:

  • 在世界原点往 X 轴方向看去,ForwardVector 为 [ 1 , 0 , 0 ] [1,0,0] [1,0,0],此时的右手边的方向为 [ 0 , 1 , 0 ] [0,1,0] [0,1,0]
    在这里插入图片描述

  • 手柄摇杆、鼠标移动朝右得到的 [ 1 , 0 , 0 ] [1,0,0] [1,0,0],朝上得到的是 [ 0 , 1 , 0 ] [0,1,0] [0,1,0]
    在这里插入图片描述

  • 屏幕上,向右移动的输入为 [ 1 , 0 , 0 ] [1,0,0] [1,0,0],向下移动的输入为 [ 0 , 1 , 0 ] [0,1,0] [0,1,0]
    在这里插入图片描述

  • 对于旋转,Roll(X)的正方向为(右上左),Pitch(Y)的正方向为(后上前),Yaw(Z)的正方向为(左前右)
    在这里插入图片描述

  • 四元数

你会发现 X 轴 Y 轴变来变去,正的方向也变来变去,这到底是怎么回事?

我们讨论下 Z 方向:

  • 在一个坐标系下,Z 轴正方向的单位向量为:X 轴正方向的单位向量叉乘 Y 轴正方向的单位向量,即 X ^ [ 1 , 0 , 0 ] × Y ^ [ 0 , 1 , 0 ] = Z ^ [ 0 , 0 , 1 ] \hat X[1,0,0]\times\hat Y[0,1,0]=\hat Z[0,0,1] X^[1,0,0]×Y^[0,1,0]=Z^[0,0,1]
  • 根据左手螺旋还是右手螺旋,分为左手坐标系和右手坐标系,Unreal 采用的是左手坐标系,所以在世界内, Z ^ \hat Z Z^朝上的前提下,才会 X ^ \hat X X^ 朝前, Y ^ \hat Y Y^ 朝右
  • 国内的数学习惯使用三维笛卡尔坐标系,为右手坐标系,也就是 X ^ \hat X X^ 朝右, Y ^ \hat Y Y^ 朝前, Z ^ \hat Z Z^ 朝上
    -

回看另外三个 Case:

  • 基于左手坐标系,其实屏幕坐标是符合直觉的,也就是 X ^ × Y ^ \hat X\times\hat Y X^×Y^ 得出的向量朝屏幕(手机)上方
  • 而手柄摇杆、鼠标的输入倒是比较符合右手坐标系,塞到左手坐标系下时, Z ^ \hat Z Z^ 其实是朝向下方的
    • 猜测原因是:输入值由操作系统一路传过来,中间没有进行转换
  • 旋转的三个方向,其实都是使用左手螺旋,即旋转前后向量叉乘,为旋转量对应的向量: V ⃗ × V ′ ⃗ = R . V e c t o r ( ) \vec V\times \vec{V'}=R.Vector() V ×V =R.Vector()

建议

在各个编程模块之间(其它信号转输入、输入信号处理、逻辑执行),尽可能让输入和输出满足以下要求:

  • 必须满足左手坐标系
  • 以下情况按照从前往后进行尝试:
    • 按照世界坐标, Z ^ \hat Z Z^ 朝上(屏幕的上方、人物的头顶方向), X ^ \hat X X^ 朝前, Y ^ \hat Y Y^ 朝右
    • Z ^ \hat Z Z^朝上时比较繁琐,则以屏幕坐标为准, X ^ \hat X X^ 朝右, Y ^ \hat Y Y^ 朝下, Z ^ \hat Z Z^ 朝后
      • 有些人习惯第一象限落在右上方,可以旋转下Z轴,全局的标准则改为: X ^ \hat X X^ 朝上, Y ^ \hat Y Y^ 朝右, Z ^ \hat Z Z^ 朝后

举个例子:

在 EnhanceInput 内,输入和逻辑的中间层为 IA,我们讨论下 2D-Axis 的 IA,以 Gamepad Left Thumbstick 2D-Axis 映射到移动输入为例:

  • 移动模块的输入 V ⃗ \vec V V x = 1 x=1 x=1 表示前方有 1 的输入, y = 1 y=1 y=1 表示右方有 1 的输入
  • 输入模块的输出,只需要加一个 Swizzle Input Axis Values 的 Modifier,Order 为 YXZ,即调换 X 和 Y 即可( [ i , j ] → [ j , i ] [i,j]\to[j,i] [i,j][j,i]

但是考虑下旋转镜头,Gamepad Right Thumbstick 2D-Axis 映射到旋转镜头输入:

  • 旋转镜头比较特殊,因为按照FRotator的定义,右晃镜头为Z正,下晃镜头为Y正
  • 用这个定义去强行转换,会涉及各种XYZ转换和正负问题,所以换一下,用CameraForwardVector在角色前方平面的落点位置为标准,采用屏幕坐标,这样就不用考虑Z的值了
  • 旋转镜头模块的输入 V ⃗ \vec V V x = 1 x=1 x=1 表示方向为落点向右移动,为Yaw(Z)的正方向有 1 的输入
    • y = 1 y=1 y=1 表示方向为落点向下移动,为Pitch(Y)的正方向有 1 的输入
  • 输入模块的输出,只需要加一个 Negate,调转Y的朝向即可( [ i , j ] → [ i , − j ] [i,j]\to[i,-j] [i,j][i,j]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/504529.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录:字符串5-7

右旋字符串 题目 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。 例如,对于输入字符…

货币与利率

货币与利率 货币及其职能什么是货币货币的职能货币带来了什么? 货币形式的演变商品货币代用货币信用货币货币的特性 现代社会货币的表现形式流通中的现金支票存款信用卡储存存款 货币层次划分目的划分标准划分种类我国的货币层次 货币与物价的关系利率什么是利息什么…

算法学习——LeetCode力扣补充篇1

算法学习——LeetCode力扣补充篇1 1365. 有多少小于当前数字的数字 1365. 有多少小于当前数字的数字 - 力扣(LeetCode) 描述 给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。 换而言之&a…

推荐一本牛逼的入门 Python书!,如何试出一个Python开发者真正的水平

本书详细解说了 Python 语言和编程的本质,无论你是否接触过编程语言,只要是 Python 编程的初学者,都可阅读本书。 本书讲解的内容虽然基础,但并不简单。本书提供了 165 幅图表,可以让大家能够轻松地理解并掌握复杂的概…

Taro+vue3 监听当前的页面滚动的距离

1.需求 想实现一个这样的效果 一开始这个城市组件 是透明的 在顶部 的固定定位 当屏幕滑动的时候到一定的距离 将这个固定的盒子 背景颜色变成白色 2.Taro中的滚动 Taro中的滚动 有固定的api 像生命周期一样 这个生命周期是 usePageScroll import Taro, { useDidShow, useP…

外包干了5天,技术退步明显.......

先说一下自己的情况,大专生,18年通过校招进入杭州某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

Django源码之路由的本质(上)——逐步剖析底层执行流程

目录 1. 前言 2. 路由定义 3. 路由定义整体源码分析 3.1 partial实现path函数调用 3.2 图解_path函数 3.3 最终 4.URLPattern和Pattern的简单解析 5. 小结 1. 前言 在学习Django框架的时候,我们大多时候都只会使用如何去开发项目,对其实现流程并…

【C++】位图

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:手撕哈希表的闭散列和开散列 > 毒鸡汤: 坚持不懈,才能在困难面前看到光明的希望。 > 专栏选自:C嘎嘎进阶 >…

基于单片机病房温度监测与呼叫系统设计

**单片机设计介绍,基于单片机病房温度监测与呼叫系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机病房温度监测与呼叫系统设计概要主要涵盖了通过单片机技术实现病房温度的实时监测以及病人呼叫功能…

java字符串(一)-- 字符串API,StringBuffer 和 StringBuilder,Object

String字符串相关的类 String的特性 String类:代表字符串。Java 程序中的所有字符串字面值(如"abc" )都作为此类的实例实现。String类是引用数据类型。 在 Java 8 中,String 内部使用 char 数组存储数据。 public fi…

C++入门知识点

目录 一、命名空间 1.命名空间的定义 2.命名空间的使用 二、输入和输出 三、缺省参数 1.缺省参数的概念 2.缺省参数的分类 1)全缺省参数 2)半缺省参数 四、函数重载 五、引用 1.引用的概念 2.引用的特性 3.引用和指针的区别 六、内联函…

gan zoo: 最新GAN 相关paper/code收集

相关推荐: 简单实现 GAN 简单实现 DCGAN 简单实现 InfoGAN 简单实现 Pix2Pix 一文带你读懂概率生成模型 GPT-1/GPT-2/GPT-3简介 GPT从0到1构建(附视频代码链接) 一文带你读懂变分自编码器(VAEs) 文本引导图像生成模型的演变(DALLE/CLIP/GLIDE) 作者对迄今为止所有的…

YOLOv7--复现并训练自己的数据集(简单)

目录 1、官网下载代码 2、上传代码至服务器 3、配置环境 4、上传数据集 5、新建yaml文件 6、修改Yolov7.yaml文件 7、修改train.py文件 8、开始训练 9、复现Yolov7遇到的错误: 1、官网下载代码 Yolov7代码下载网址: https://github.com/WongKi…

【vue2+antvx6】报错Cannot read properties of undefined (reading ‘toUpperCase‘)

我的代码是这样的 <el-collapseref"collapse"v-model"active"accordionclass"collapseStart"change"collapsechange"><el-collapse-item:name"String(index 1)"v-for"(i, index) in List":key"in…

Linux重点思考(下)--shell脚本使用以及内核开发

Linux重点思考(下&#xff09;--shell脚本使用和组合拳 shell脚本的基础算法shell脚本写123...n的值&#xff0c;说思路Shell 脚本用于执行服务器性能测试的死循环Shell 脚本备份和定时清理垃圾文件 shell脚本的内核开发正向映射反向映射 shell脚本的基础算法 shell脚本写123……

SpringBoot常见注解有哪些

Spring Boot的核心注解是SpringBootApplication , 他由几个注解组成 : ● SpringBootConfiguration&#xff1a; 组合了- Configuration注解&#xff0c;实现配置文件的功能&#xff1b; ● EnableAutoConfiguration&#xff1a;打开自动配置的功能&#xff0c;也可以关闭某个自…

答辩PPT最后一页除了写谢谢观看,谢谢聆听,感谢老师,还可以写什么呢?

以我的答辩PPT为例吧 我当时写的这两句话得到了导师的肯定&#xff0c;大家可以参考 感谢导师悉心指导&#xff0c;敬请老师批评指正

linux之忘记root密码

一&#xff0c;开机到如下地方按下e进入紧急模式 然后再如下位置输入init/bin/bash 然后Ctrlx 二&#xff0c; 修改密码 以上操作分别为 1&#xff09;&#xff0c;重新挂载根目录 mount -o remount,rw / 2&#xff09;&#xff0c;修改密码 passwd root 3&#xff09;&a…

redis-shake可视化监控

目录 一.redis-shake v4 1.镜像 2.shake.toml 3.启动redis-shake后 二.json-exporter配置 1.Dockerfile 2.config.yml 三.prometheus配置 1.prometheus.yml 2.redis-shake.json 四.grafana 一.redis-shake v4 1.镜像 ######################### Dockerfile #########…

平衡二叉树(AVL树)

文章目录 平衡二叉树&#xff08;AVL树&#xff09;1、平衡二叉树概念2、平衡二叉树的的实现2.1、平衡二叉树的结点定义2.2、平衡二叉树的插入2.3、平衡二叉树的旋转2.3.1、右单旋&#xff08;R旋转&#xff09;2.3.2、左单旋&#xff08;L旋转&#xff09;2.3.3、先右单旋再左…