Unity游戏内相机(主角头部视角)的旋转问题:“万向节锁定”(Gimbal Lock)

前言:

        在Unity中,相机的正前方是Z正半轴,相机的正右方是X正半轴,相机的正上方是Y正半轴。这个很好理解。

        现在,我想要相机看向左前上方45°,你会觉得要怎么做呢?

        如果是我的话,我的第一感觉确实就是先绕相机的Y轴逆时针旋转45度,然后再绕相机的X轴逆时针旋转45度。然后确实是做到了,没错的,大家的第一印象没毛病。

        假设这个时候摄像头视野的正中心有一个苹果,但是苹果的正左侧有一个香蕉,现在我想让相机往左稍微摆动一下,让相机聚焦苹果正左侧的香蕉,于是我们打算绕相机的Y轴再次逆时针旋转10度,试图去对准香蕉。

        奇怪的是,当旋转完毕之后,相机视野正中心并没有靠近香蕉,甚至是远离了香蕉!!!

        越是想纠正,越是远离香蕉!!!

原因:

        经过多次旋转之后,已经改变了相对于相机的局部坐标轴(相机的前、右、上方向),所以原来的方法会失效。

        这种现象被称为“万向节锁定”(Gimbal Lock)。万向节锁定是一个在使用三个欧拉角表示三维空间旋转时可能遇到的问题,尤其是当旋转顺序导致两个旋转轴对齐时。此时,会失去一个旋转自由度,导致无法独立控制某个轴的旋转。

        在Unity等三维图形环境中,当你绕着一个轴旋转一个物体时(比如绕着X轴或Y轴),这个物体的其他轴(比如Y轴和Z轴)也会随之旋转。如果进行多次旋转,这些轴可能会变得对齐或近似对齐,从而导致万向节锁定。在万向节锁定的状态下,本应独立的两个旋转轴因为对齐而实际上合并成了一个轴,使得原本独立的两个旋转方向无法被单独控制。

解决的方法:

1. 用四元数(Quaternion)来表示旋转

        为了解决或避免万向节锁定问题,可以使用四元数(Quaternion)来表示旋转。四元数可以提供不受万向节锁定影响的平滑连续旋转,这也是为什么在Unity等现代三维图形软件中四元数被广泛用于处理旋转。

2.还是喜欢用xyz轴表示旋转

        如果还是想用3个轴来表示旋转的话,可以将这两个旋转分开到两个不同的对象上,可以确保当你旋转其中一个轴时,不会意外地影响到另外一个轴。这样,摄像头的行为就更加可控和预测。在Unity中,为了避免万向节死锁,并使摄像头的控制更加直观和灵活,通常会将摄像头的水平旋转(通常是Y轴)和垂直旋转(通常是X轴)分开处理。

        我的处理方法是,相机这个对象来控制抬头和低头。

        相机的父对象Observer来控制左转和右转。

public float mouseSensitivity = 100f;

    [SerializeField] Transform observerTf;
    [SerializeField] Transform cameraTf;

    private float xRotation = 0f;

    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
    }

    void Update()
    {
        float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;

        observerTf.Rotate(0, mouseX * Time.deltaTime, 0);
        cameraTf.Rotate(-mouseY * Time.deltaTime, 0, 0);
    }

        一个对象控制一个轴的旋转,这样就能避免旋转的时候意料之外的旋转了Z轴,导致视线不可控的问题。这样一来,相机视线的控制就变得得心应手了。

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

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

相关文章

鹿目标检测数据集VOC格式500张

鹿,一种优雅而神秘的哺乳动物,以其优美的外形和独特的生态习性而备受人们的喜爱。 鹿的体型通常中等,四肢细长,身体线条流畅。它们的头部较小,耳朵大而直立,眼睛明亮有神。鹿的毛色因品种而异,…

RocketMQ MQClientInstance、生产者实例启动源码分析

🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏&…

第11章 GUI Page462~476 步骤二十三 步骤二十四 Undo/Redo ①为Undo/Redo做准备工作,弹出日志窗口

step23和step24合起来学习 工程一 1.主窗口类中添加新的私有成员数据: 2 主窗口构造函数中,最后一行加入,用于调试的Log功能 3 鼠标弹起函数,添加Undo动作 4 编译之后报错:ActionLink不是一个类型 5 新增一个头文件…

2024年自动化测试面试题分享(含答案)

1、你做了几年的测试、自动化测试,说一下 selenium 的原理是什么? 我做了五年的测试,1年的自动化测试; selenium 它是用 http 协议来连接 webdriver ,客户端可以使用 Java 或者 Python 各种编程语言来实现&#xff1…

20240105移远的4G模块EC20在Ubuntu 20.04.6 LTS下使用联通5G卡上网的步骤

20240105移远的4G模块EC20在Ubuntu 20.04.6 LTS下使用联通5G卡上网的步骤 2024/1/5 10:11 缘起:需要在Firefly的AIO-3399J开发板上调试移远的4G模块EC20(Android10/11/12),需要现在先测试EC20的好坏! 陶老板告诉我找一…

书生浦语大模型训练营第一课笔记:全链路开源体系

AI 的研究方向,从专业模型转变为通用模型。 上海人工智能实验室的开源历程 覆盖了轻量级、中量级、重量级的模型; 7B 20B 都是免费开源的,可商用。 从模型到应用 开源了全链路工具。 ![

Linux第20步_在虚拟机上安装“Visual Studio Code”

1、双击windows系统桌面上的“FileZilla Client.exe”,打开FTP客户端,点击03软件下的Visual Studio Code,发现code_1.50.1-1602600906_amd64。 2、点击“文件”,然后点击“站点管理器”,见下图操作: 3、点…

excel统计分析——两因素无重复方差分析

参考资料:生物统计学 从严格意义上讲,两因素试验都应当设置重复观测值,以便检验交互作用是否真实存在,对试验误差有更准确的估计,从而提高检验效率。但根据专业知识或先前的试验已经证明两个因素不存在交互作用时&…

【Turtle库】圣诞树

在寒冷的冬季,没有什么比一棵亮丽的圣诞树更能带给我们温暖和快乐。而现在,我们将使用Python编程语言来绘制这样一棵美丽的圣诞树。 首先,我们需要导入Python的turtle模块,它可以帮助我们绘制图形。然后,我们可以定义一…

高性价比的高速吹风机/高速风筒解决方案,基于普冉单片机开发

高速吹风机是近些年非常火的一款产品,快速崛起并颠覆了传统吹风机,高速吹风机也成为了传统吹风机替代的一个大趋势。高速吹风机是利用高转速产生的大风量来快速吹干头发,由于其精巧的外观设计、超低的噪声、出色的干发效果,高速吹…

苹果Mac图像修图软件Photomator和Pixelmator Pro 有什么区别?

同为一个团队设计的Mac修图软件Photomator和Pixelmator Pro有哪些区别呢?有哪些不一样的功能? Photomator和Pixelmator Pro区别如下: 1、用途不同 Photomator 和 Pixelmator Pro 是两个功能强大的应用程序,具有两个不同的用途。…

【docker】一文讲完docker搭建私有仓库

一、docker搭建私有仓库方法总结 搭建Docker私有仓库主要有以下几种方式: 使用Docker官方提供的Registry镜像:Docker官方提供了一个用于构建私有镜像仓库的Registry镜像,只需将镜像下载并运行容器,然后暴露5000端口即可使用。可以…

呼叫 Mac 用户 | Navicat Premium 原生支持在搭载 Apple Silicon 芯片的电脑上使用

作为桌面端数据库管理开发软件,Navicat Premium 与 Navicat for MongoDB 16.3 (或更高版本) 已原生支持搭载 Apple Silicon 芯片的 Mac 电脑上使用。这是一次重要的技术改进,通过原生技术将大幅提升 Mac 用户在使用 Navicat 过程中的响应速度、流畅性以及…

LeetCode(39)组合总和⭐⭐

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被选取 。如…

2个nodejs进程利用redis 实现订阅发布

1.新建文件 redis_db.js use strict;const redis require(redis); const options {host: "127.0.0.1",port: 6379,password: "123456", // CONFIG SET requirepass "123456" }var array [] for(var i0; i<3; i){const client redis.crea…

bat批处理文件_命令汇总(2)

文章目录 1、换行2、返回上一级目录cd..3、隐藏指令回显echo off4、开启指令回显echo on5、用关闭echo off指令本身的回显6、echo提示信息 1、换行 cd.. echo. echo. echo. pause2、返回上一级目录cd… 3、隐藏指令回显echo off echo off echo hello1 echo hello2 pause4、开…

手机上连网络转接app,电脑连接手机,共用网络转接app的办法

方法一&#xff0c;&#xff08;不推荐&#xff09; 因为太简单了所以写一下 电脑安装MuMu模拟器&#xff0c;之后安装网络转接app&#xff0c;这个模拟器设置了从电脑上安装app和&#xff0c;安卓与电脑同步文件夹功能&#xff0c;实现文件共享。所以直接用就可以了。 方法二…

磁盘损坏0x80070570

要修复的文件在E盘&#xff0c;那就输入&#xff1a;chkdsk e&#xff1a; /f 原文&#xff1a;https://www.haozhuangji.com/xtjc/111213592.html

得物商品状态体系介绍

一、得物的商品体系 目前得物的商品分为三种类型&#xff0c;分别是&#xff1a;新品、商品、草稿。但是只有商品是可售卖的&#xff0c;新品和草稿都不是可售卖的。 新品有很多种创建的渠道&#xff0c;商品可以由新品选品通过后由系统自动生成&#xff0c;也可以由运营直接…

十、HTML 样式- CSS

CSS (Cascading Style Sheets) 用于渲染HTML元素标签的样式。 一、实例 1、HTML使用样式 本例演示如何使用添加到 <head> 部分的样式信息对 HTML 进行格式化。 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>HTM…