Unity里的對象旋轉數值跳轉問題的原理與解決方案

文章目錄

  • 1. 問題描述
  • 2. 問題原因
  • 3. 解決方案
  • 3.1通過多個父子關系從而控制旋轉(推薦)
  • 3.2 使用四元數進行旋轉

1. 問題描述

我們現在寫一個3D的Unity程序,我們現在設置了一個物體后,我們想旋轉使其改為我們想要的情況。但是我們如果rotation輸入了3個值后,我們發現現在旋轉的時候,rotation的值會突然跳轉變換到另一個值。這個時候我們修改例如x的值,y和z值也會隨著x值發生變化。我們在這種情況下難以通過不斷調整三個坐標軸的旋轉將我們的物體旋轉到我們想要的情況。
在這里插入圖片描述
在這里插入圖片描述

2. 問題原因

了解圖形學的話,我們知道旋轉(Rotation)是變換(Transformation)的一種,其底層計算使用矩陣來表示。
我們一般使用homogeneous co0ordinates(齊次坐標)來進行計算。
在三維空間中,繞z軸的旋轉可以看作是在所有z坐標相同的平面上進行的二維旋轉。
因此關于z軸旋轉的情況如下:
在這里插入圖片描述
關于y軸和x軸旋轉的情況如下:
在這里插入圖片描述
由于是矩陣計算,矩陣乘法有結合律但是沒法使用交換律。
因此當我們完成了旋轉之后,我們再次更改值,旋轉順序就被我們打亂了,因此矩陣的值會突然發生變化,此時我們再修改值,也不會是我們想象中的只變化一個軸的值,另外的值也會發生變化。

3. 解決方案

3.1通過多個父子關系從而控制旋轉(推薦)

在這里插入圖片描述

在 Unity中,旋轉的順序是先繞 Z 軸旋轉,然后繞 X 軸旋轉,最后繞 Y 軸旋轉。也就是說,對于歐拉角 (30, 40, 50),旋轉順序如下:

  1. 先繞 Z 軸旋轉 50°。
  2. 再繞 X 軸旋轉 30°。
  3. 最后繞 Y 軸旋轉 40°。

因此我們可以分別使用三個父子關系從而分別控制不同的軸進行旋轉。
但是這里我們并不是Z軸在最外面作為父物體,而是Y軸在最外面作為父物體。
因為在 Unity 中使用父子關系來控制旋轉時,每個子物體的旋轉是相對于其父物體的局部坐標系進行的。在 Unity 中直接設置一個物體的歐拉角旋轉時,這個旋轉是相對于世界坐標軸的。
換句話說在Unity中根據自身坐標系旋轉的順序是Y-X-Z,根據世界坐標系旋轉的順序是Z-X-Y。所以這里正確的父子關系如圖所示,順序為Y-X-Z。
在這里插入圖片描述
這里使用CubeYRotation控制Y軸的旋轉。
在這里插入圖片描述
接著用其子物體CubeXRotation控制X軸的旋轉。
在這里插入圖片描述
最后使用其子物體CubeZRotation控制Z軸的旋轉。
在這里插入圖片描述
將其分別設置為和原來的Cube一樣的旋轉值,通過這樣的方式我們可以得到和原來的Cube一樣的效果,而且,這時候我們再分別旋轉這些對象的Rotation可以只修改一個軸的Rotation,不會產生一次旋轉多個值變化的情況。

這種方法易于控制,并且使用我們日常使用的歐拉角,所以方便理解,現實實踐的時候可以不按照這個順序進行控制,用這種父子關系控制旋轉即可。
我們在實際使用Unity中也可以多使用父子關系控制對象的變換(包含位置、旋轉、縮放),通過父子關系我們可以更好控制對象的位置關系和實際效果,還可以幫助我們更好管理對象的層級結構。
如圖所示,我將這個場景里的所有對象放在了一個大的父物體下,方便控制。
在這里插入圖片描述

為了驗證前面我們的結論我們可以試驗下面的幾個代碼。
第一個代碼:

transform.Rotate(45, 45, 45);

第二個代碼:

transform.Rotate(0, 0, 45, Space.World);
transform.Rotate(45, 0, 0, Space.World);
transform.Rotate(0, 45, 0, Space.World);

第三個代碼:

transform.Rotate(0, 45, 0);
transform.Rotate(45, 0, 0);
transform.Rotate(0, 0, 45);

這三個代碼的效果一樣,也能說明在Unity中根據自身坐標系旋轉的順序是Y-X-Z,根據世界坐標系旋轉的順序是Z-X-Y。

3.2 使用四元數進行旋轉

如果我們學習Unity的教程,一般會告訴你旋轉Unity采取四元數來表示和計算旋轉,因為四元數不會像歐拉角一樣存在萬向鎖(萬向鎖是使用歐拉角表示旋轉時可能遇到的一個問題,即當旋轉到某些特定角度時,會失去一個維度的自由度,導致旋轉變得不穩定。)和表達方式多樣的問題(歐拉角有無數種表達方式,這可能導致在計算或存儲時出現混淆或錯誤)。
但是它并沒有歐拉角那樣易于理解,這里只稍微說下簡單的概念。
它是一種擴展了復數的概念,可以表示為一個實部和三個虛部的組合,通常表示為 q=w+xi+yj+zkq=w+xi+yj+zkq=w+xi+yj+zk,其中w,x,y,zw,x,y,zw,x,y,z是實數,而i,j,ki,j,ki,j,k是虛數單位。這里實部與旋轉的余弦值有關,虛部與旋轉軸的方向向量有關。
四元數可以表示為:q=cos(θ/2)+(u?i)sin(θ/2)q=cos(θ/2)+( u ? i )sin(θ/2)q=cos(θ/2)+(u?i)sin(θ/2)其中,θθθ是旋轉角度, uuu是旋轉軸的單位向量。

我們這里使用四元數進行旋轉,這是Unity比較推薦的方式。
我們先創建三個旋轉四元數,分別對應 X、Y、Z 軸的旋轉角度。然后將這三個四元數相乘,得到最終的旋轉四元數。將這里的最終四元數賦給物體的rotation從而完成旋轉。

Quaternion rotationX = Quaternion.Euler(30f, 0f, 0f);
Quaternion rotationY = Quaternion.Euler(0f, 40f, 0f);
Quaternion rotationZ = Quaternion.Euler(0f, 0f, 50f);
Quaternion finalRotation = rotationZ * rotationY * rotationX;transform.rotation = finalRotation;

這個方式相較于前者在Inspector里修改不夠直觀方便,因此更推薦前者。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92129.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92129.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92129.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

為什么現代 C++ (C++11 及以后) 推薦使用 constexpr和模板 (Templates) 作為宏 (#define) 的替代品??

我們用現實世界的比喻來深入理解??為什么 C 中的宏 (#define) 要謹慎使用,以及為什么現代 C (C11 及以后) 推薦使用 constexpr 和模板 (Templates) 作為替代品。??🧩 ??核心問題:宏 (#define) 是文本替換??想象宏是一個 ??“無腦的…

PyCharm vs. VSCode 到底哪個更好用

在 Python 開發者中,關于 PyCharm 和 VSCode 的討論從未停止。一個是功能齊備的集成開發環境(IDE),另一個是輕快靈活的代碼編輯器。它們代表了兩種不同的開發哲學,選擇哪個,往往取決于你的項目需求、個人習…

FPGA學習筆記——VGA彩條顯示

目錄 一、任務 二、分析 三、代碼 四、實驗現象 五、更新 一、任務 使用VGA實現彩條顯示,模式是640x48060。 二、分析 首先,模式是640x48060,那么對照以下圖標,知道其它信息,不清楚時序和VGA掃描方式的可以看看這…

ES-301A :讓 Modbus 設備無縫接入工業以太網的高效橋梁

在工業自動化領域,串口設備與以太網的互聯互通是提升系統效率的關鍵。ES-301A 工業以太網串口網關作為上海泗博自動化精心打造的專業解決方案,以強大的協議轉換能力、工業級可靠性和靈活配置特性,成為連接 Modbus RTU/ASCII 設備與 Modbus TC…

【學習筆記】FTP庫函數學習

【學習筆記】FTP庫函數學習 FTP基本指令步驟 1、初始化會話句柄:CURL *curl curl_easy_init(); 2、設置會話選項: 設置服務器地址,設置登錄用戶和密碼 curl_easy_setopt(curl, CURLOPT_URL, ftp_server); curl_easy_setopt(curl, CURLOPT_US…

ARM Cortex-M異常處理高級特性詳解

1. 異常處理概述 ARM Cortex-M處理器提供了高效的異常處理機制,包含多種硬件優化特性,顯著提升了中斷響應性能和系統效率。這些特性對于實時嵌入式系統和網絡協議棧(如LwIP)的性能至關重要。 1.1 Cortex-M異常處理架構 Cortex-M異…

【圖像算法 - 08】基于 YOLO11 的抽煙檢測系統(包含環境搭建 + 數據集處理 + 模型訓練 + 效果對比 + 調參技巧)

一、項目背景與需求 【打怪升級 - 08】基于 YOLO11 的抽煙檢測系統(包含環境搭建 數據集處理 模型訓練 效果對比 調參技巧)今天我們使用YOLO11來訓練一個抽煙檢測系統,基于YOLO11的抽煙檢測系統。我們使用了大概兩萬張圖片的數據集訓練了…

vue2升級vue3中v-model的寫法改造

vue2選項式 <template><div><el-rowclass"group-title":title"$t(restore_default_parameters)">{{ $t(restore_default_parameters) }}</el-row><el-form-item :label"$t(restore_default_parameters)" class"…

5G-LEO 簡介

1. 什么是 5G-LEO 5G-LEO 指的是將 5G 新空口&#xff08;5G NR&#xff09;服務擴展到低軌衛星&#xff08;LEO&#xff09;上的非地面網絡&#xff08;NTN, Non-Terrestrial Network&#xff09;方案。通過在距地面約500–2 000 km 的低軌道衛星上部署通信載荷&#xff0c;5G…

【MCAL】AUTOSAR架構下SPI數據同步收發具體實現

目錄 前言 正文 1.依賴的SPI硬件特性 1.1. SPI時隙參數配置 1.2. SPI數據發送和接收模式 2.MCAL中的SPI配置 3.軟件的具體實現 3.1. Spi_SyncTransmit 3.2. Spi_lSyncTransmit 3.3. Spi_lSyncStartJob 3.4. Spi_lSyncTransmitData8Bit 3.5. Spi_lSynTransErrCheck …

SQL157 更新記錄(一)

描述現有一張試卷信息表examination_info&#xff0c;表結構如下圖所示&#xff1a;FiledTypeNullKeyExtraDefaultCommentidint(11)NOPRIauto_increment(NULL)自增IDexam_idint(11)NOUNI(NULL)試卷IDtagchar(32)YES(NULL)類別標簽difficultychar(8)YES(NULL)難度durationint(11…

懸賞任務系統小程序/APP源碼,推薦任務/發布任務/會員服務

1. 我們承諾及優勢本店源碼承諾&#xff1a;1&#xff09;. 店長親測 - 100%完整可運行2&#xff09;. 含詳細安裝文檔3&#xff09;. 支持二次開發定制4&#xff09;. 專業客服隨時解答5&#xff09;. 技術團隊保障質量2. 功能詳細說明主要功能 模塊 角色 解釋說明 用戶登錄和…

Ubuntu20.04系統上使用YOLOv5訓練自己的模型-1

在Ubuntu系統上使用YOLOv5訓練自己的模型&#xff0c;你需要遵循以下步驟。這里我將詳細說明如何從準備數據集到訓練模型的整個過程。 步驟 1: 安裝依賴項 首先&#xff0c;確保你的Ubuntu系統上安裝了Python、PyTorch和必要的庫。你可以使用以下命令安裝這些依賴項&#xff1a…

解決微信小程序中camera組件被view事件穿透觸發對焦以及camera的bindtap事件

view跟camera組件同級 不要用bind:tap和catch:tap 替換用catch:touchstart即可解決&#xff01; 如果你不放心&#xff0c;可以再加個透明蒙版&#xff0c;這樣就不會觸發了&#xff01;&#xff08;不加這個也行&#xff0c;但是必須要用catch:touchstart&#xff09;<!-- …

【Redis】移動設備離線通知推送全流程實現:系統推送服務與Redis的協同應用

在移動應用開發中&#xff0c;應用未啟動時的通知推送是提升用戶體驗的核心需求之一。當用戶未主動啟動 App 時&#xff0c;如何通過手機通知欄觸達用戶&#xff0c;確保關鍵信息&#xff08;如訂單提醒、系統警報&#xff09;不丟失&#xff1f;本文將嘗試解析從 系統推送服務…

WebView 中控制光標

在 WebView 中控制光標&#xff08;如移動焦點、獲取/設置光標位置、顯示/隱藏光標等&#xff09;需要根據具體場景和平臺&#xff08;Android/iOS/Web&#xff09;采用不同的方法。以下是常見場景的解決方案&#xff1a;一、Web 頁面中的光標控制&#xff08;JavaScript&#…

2025國賽數學建模C題詳細思路模型代碼獲取,備戰國賽算法解析——決策樹

2025國賽數學建模C題詳細思路模型代碼獲取見文末名片 決策樹算法&#xff1a;從原理到實戰&#xff08;數模小白友好版&#xff09; 1. 決策樹是什么&#xff1f;——用生活例子理解核心概念 想象你周末想決定是否去野餐&#xff0c;可能會這樣思考&#xff1a; 根節點&#xf…

從底層架構到多元場景:計算機構成與應用的深度剖析

一、引言1.1 研究背景與意義在當今數字化時代&#xff0c;計算機已成為推動社會進步和經濟發展的核心力量&#xff0c;其身影遍布生活、工作、學習的各個角落。從個人日常使用的筆記本電腦、智能手機&#xff0c;到企業運營中不可或缺的服務器、大型機&#xff0c;再到科研領域…

控制建模matlab練習08:根軌跡

此練習主要是&#xff1a;在matlab中繪制根軌跡的方法。 一、在matlab中建立對應系統 1、例如&#xff0c;對于如圖的反饋系統。 2、其中開環傳遞函數G(s)、閉環傳遞函數Gcl(s)。3、因此&#xff0c;其閉環傳遞函數的根軌跡&#xff0c;就可以直接在matlab中繪制出來。 4、直接…

【Spring Boot 快速入門】七、阿里云 OSS 文件上傳

這里寫自定義目錄標題準備阿里云 OSS參照官方 SDK 編寫入門程序案例數據準備案例集成阿里云 OSS前端測試代碼app.jsstyle.cssindex.html效果圖準備阿里云 OSS 注冊登錄阿里云&#xff0c;然后點擊控制臺&#xff0c;在左上角菜單欄搜索對象存儲 OSS&#xff0c;點擊并開通點擊…