Unity相机自由移动脚本

news/2024/4/26 7:45:58/文章来源:https://blog.csdn.net/leikang111/article/details/130362335

实现WSAD移动方向,鼠标右键旋转角度,滚轮实现缩放

在此之前,我们先讲清楚几个比较容易混淆的点:

1:Transform.forward是Transform组件的一个Vector3类型的属性,代表游戏对象在世界坐标系中的朝向,即“前方向”,它的值是(0,0,1),它表示了一个对象的X轴方向,一般用于计算游戏对象前进的方向,比如用于移动、旋转和射线检测等场景。

2:Transform.Right的数学表达式是(1, 0, 0)。它表示了一个对象的X轴方向,或者说是它的右侧方向

值得注意的是,它们都是单位向量,一般只用于方向计算

3:Input.GetAxis("Horizontal")和Input.GetAxis("Vertical"),input.GetAxis("Mouse X")

它们是分别获取水平方向输入和竖直方向输入的函数,这个函数会返回一个范围在-1到1之间的浮点数,表示当前水平方向上的输入状态

比如Input.GetAxis("Mouse X") 返回鼠标在水平方向上的移动,以浮点数表示。当鼠标向右移动时,返回正值;当鼠标向左移动时,返回负值。如果鼠标不动,返回0

Input.GetAxis("Mouse ScrollWheel"),向前滚动是正数,向后滚动时负数

4:欧拉角和四元数

在unity中的rotation就是使用了欧拉角,欧拉角指的是以三个轴为基准,通过绕不同轴的旋转角度来表示一个物体的旋转状态,通常有XYZ、ZYX、ZXY等多种旋转顺序。但是,欧拉角会存在万向锁问题,即在某些特定情况下,两个轴的旋转会发生重合,导致旋转计算异常

四元数则是通过四元数的定义和运算来实现旋转,四元数实际上是一个四元组,包含了一个实部和三个虚部。它们的定义方式和欧拉角不同,可以避免万向锁问题,并且旋转顺序不会影响旋转结果。四元数还可以通过插值运算实现平滑旋转,适用于需要连续旋转的情况。

我把代码分成了三块

第一个模块是WSAD控制前后左右,这段比较简单,直接定义一个V3类型的移动方向,再使用Translate即可

第二个模块是使用QE控制上下视角,定义一个变量upDown,每次按键时候改变1,然后直接把位置赋值到相机位置即可

第三个模块是使用鼠标右键进行旋转,设置两个旋转向量rotateX,rotateY,Y方向旋转限值minAngle和maxAngle,然后把向量和速度加到相机的欧拉角即可

有一个难点,在刚开始调试的时候,第一次点击鼠标右键进行旋转时,屏幕一直跳动,最后经过GPT的帮助,最终解决了问题!爱死GPT

using UnityEngine;
public class CameraController : MonoBehaviour
{//WSAD相机移动速度public float moveSpeed = 1.0f;//相机当前移动方向private Vector3 moveDirection;//QE相机的目标高度private float upDistance;public float upSpeed = 0.2f;//鼠标右键控制旋转private float rotateX,rotateY;public float sensitivity =0.5f;//控制鼠标在Y方向上的限值public float minAngle = -90f;public float maxAngle = 90f;//记录之前的欧拉角,避免跳屏private Vector3 currentRotation,lastPosition;//鼠标滚轮控制缩放public float zoomSpeed = 10f;private float zoomDistance = 0f;private void Start(){currentRotation = transform.eulerAngles;}void Update(){// 使用WSAD控制相机前后左右移动比较简单,直接获取当前的移动方向,然后使用Translate移动即可{moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));transform.Translate(moveDirection * moveSpeed * Time.deltaTime);}//使用QE控制相机的上下,使用unDown参数进行单位变化{if (Input.GetKey(KeyCode.Q)){upDistance -= upSpeed * Time.deltaTime;transform.Translate(transform.up * upDistance, Space.World);}else if(Input.GetKeyUp(KeyCode.Q)){upDistance = 0;}if (Input.GetKey(KeyCode.E)){upDistance += upSpeed * Time.deltaTime;transform.Translate(transform.up * upDistance, Space.World);}else if(Input.GetKeyUp(KeyCode.E)){upDistance = 0;}}//使用鼠标右键来控制相机旋转//Mouse X,向右移动返回正值,Mouse Y,向上移动鼠标为正值{if (Input.GetMouseButtonDown(1)){// 记录当前的欧拉角//currentRotation = transform.eulerAngles;//记录鼠标位置lastPosition = Input.mousePosition;}if (Input.GetMouseButton(1)){//设置偏移量Vector3 offset = Input.mousePosition - lastPosition;rotateX += offset.x * sensitivity;rotateY -= offset.y * sensitivity;//给Y方向的旋转加上限值函数rotateY = Mathf.Clamp(rotateY, minAngle, maxAngle);//改变当前的欧拉角transform.eulerAngles = new Vector3(rotateY, rotateX, 0f);// 将保存的欧拉角重新赋值回去transform.eulerAngles += currentRotation;lastPosition = Input.mousePosition;}}//使用滚轮来控制物体的缩放{//获取滚轮的滚动幅度和方向zoomDistance += Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;//使用限值函数来限定缩放的范围zoomDistance = Mathf.Clamp(zoomDistance, -10f, 10f);//最后定位transform.position = transform.position + transform.forward * Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;}}
}

直接将代码复制,挂到Camera即可运行!

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

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

相关文章

太阳辐射预报模式WRF-SOLAR在农业生态领域中的实践技术应用

太阳能是一种清洁能源,合理有效开发太阳能资源对减少污染、保护环境以及应对气候变化和能源安全具有非常重要的实际意义,为了实现能源和环境的可持续发展,近年来世界各国都高度重视太阳能资源的开发利用;另外太阳辐射的光谱成分、…

这场SIG组开放工作会议为何吸引了那么多人的关注?

【中国,上海,2023年4月20日-21日】openEuler Developer Day 2023在线上和线下同步举办。本次大会由开放原子开源基金会指导,中国软件行业协会、openEuler社区、边缘计算产业联盟共同主办,以“万涓汇流,奔涌向前”为主题…

为什么软件测试外包公司更受软件企业欢迎?软件测试报告需要多少钱?

劳动派遣或劳务派遣的用工模式古已有之,是人力资源销售市场不可避免的态势。软件测试顺应时代开展检测业务外包这一行业细分领域,越来越多软件外包公司尤其是小微型企业慢慢意识到了软件测试业务外包通常能够持续减少企业的各种成本费,使企业…

关于Vue中使用全屏容器无法占满屏幕以及样式不生效问题解决方案

先来看示例问题 App.vue文件 global.css文件 网页效果 可以看到即使设置了宽度和高度为100%都无法占满屏幕,而且容器还超出了屏幕,上拉才可以看到下边框。查看网上解决方法: 1.height设置为100vh, 或者设置为calc(10…

crm day03 创建市场活动

页面切割 div切割,ifram显示 如何分割的呢,在主页面上打开iframe $(function(){ //页面加载时window.open("workbench/main/index.do","workareaFrame"); })注意所有在WEB-INF的页面都会收到保护,因此到达此目录下的页…

Leetcode38. 外观数列

一、题目描述: 给定一个正整数 n ,输出外观数列的第 n 项。 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列: countAndSay(1) “…

2023年4月份上新的视频领域分割模型设计系列论文(附下载链接)

来源:投稿 作者:王老师 编辑:学姐 论文1 论文标题: Boosting Video Object Segmentation via Space-time Correspondence Learning 论文链接: https://arxiv.org/pdf/2304.06211v1.pdf代码链接:暂未开源 …

PSO算法、MATLAB代码实现以及测试效果

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 PSO算法原理进化操作算法流程图matlab代码实现main函数部分适应度函数部分PSO算法主体测试结果 (F1~F6) PSO算法原理 粒子群优化( Particle Swarm Optimization&am…

Java+GeoTools实现WKT数据根据EPSG编码进行坐标系转换

场景 JavaGeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示: JavaGeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示_霸道流氓气质的博客-CSDN博客 在上面实现Java中集成Geotools之后,需求是将WKT数据转换成其他坐标系的W…

银河麒麟(桌面版和服务器版)之远程桌面安装

一、前言 在信创方案中经常介绍支持麒麟系统,实际上麒麟分为银河麒麟和中标麒麟,银河麒麟又分为服务器版和桌面版,服务器器版一般用于应用系统部署,桌面版一般用于日常办公。银河麒麟操作系统作为国产操作系统,是目前国…

力扣---LeetCode21. 合并两个有序链表(链表经典题)

文章目录 前言21. 合并两个有序链表链接:方法一:取小尾插1.1代码:1.2 流程图:1.3 注意: 方法二:带哨兵位2.1代码:2.2流程图: 总结 前言 焦虑不会消除明天的悲伤 只会让你今天的力量…

openEuler Developer Day 2023成功召开!发布嵌入式商业版本及多项成果

【中国,上海,2023年4月21日】openEuler Developer Day 2023于4月20-21日在线上和线下同步举办。本次大会由开放原子开源基金会指导,中国软件行业协会、openEuler社区、边缘计算产业联盟共同主办,以“万涓汇流,奔涌向前…

QGIS数据可视化学习笔记02——CSV数据和表连接

在其他的GIS软件中,表的连接操作是十分常用的操作,在QGIS中也是一样的,接下来我们介绍QGIS中属性表之间的连接以及如何添加CSV数据到属性表中。 1、表的连接 &emsp如关系型数据库一样,两表连接的前提是,两个表中都…

荔枝派Zero(全志V3S)开启alsa,测试codec

文章目录 前言一、ALSA 简介二、ALSA 框架三、buildroot 配置四、烧录到 SD 卡五、测试1、查看 CODEC 设备2、alsa-utils 使用①、查看设备②、调节音量③、查看控制器④、录音测试⑤、播放测试 前言 默认 dts 中使能了 codec 需要使用的话,在 buildroot 中勾选 a…

Linux离线状态下安装cuda、cudnn、cudatoolkit

目录 1. 下载与安装说明2. CUDA安装3. cuDNN安装4. cudatoolkit安装5. 测试安装成功 1. 下载与安装说明 工具包下载地址 CUDA历史版本下载地址:https://developer.nvidia.com/cuda-toolkit-archivecuDNN历史版本下载地址:https://developer.nvidia.com/r…

pdf怎么删除其中一页?

pdf怎么删除其中一页?大家都应该知道,PDF是一种实用性非常强且非常便携文件格式,许多用户对其非常熟悉。不管是工作还是学习中,都会下载或者使用到pdf文件。pdf文件具有非常好的兼容性,F可以将各种图片、文字内容整合在…

界面开发框架Qt新手入门 - 自定义排序/筛选模型示例(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 自定义排序/筛选模型…

记一次某应用虚拟化系统远程代码执行

漏洞简介 微步在线漏洞团队通过“X漏洞奖励计划”获取到瑞友天翼应用虚拟化系统远程代码执行漏洞情报(0day),攻击者可以通过该漏洞执行任意代码,导致系统被攻击与控制。瑞友天翼应用虚拟化系统是基于服务器计算架构的应用虚拟化平台,它将用户…

原理这就是索引下推呀

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 索引下推是之前面试的时候遇到的一个面试题,当时没有答上来,今天来学习一下。 介绍索引下推之前先看一下MySQL基…

【AI炼丹术】写深度学习代码的一些心得体会

写深度学习代码的一些心得体会 体会1体会2体会3总结内容来源 一般情况下,拿到一批数据之后,首先会根据任务先用领域内经典的Model作为baseline跑通,然后再在这个框架内加入自己设计的Model,微调代码以及修改一些超参数即可。总体流…