Unity手游之路四3d旋轉-四元數,歐拉角和變幻矩陣

http://blog.csdn.net/janeky/article/details/17272625

今天我們來談談關于Unity中的旋轉。主要有三種方式。變換矩陣,四元數和歐拉角。


定義

  • 變換矩陣

可以執行任意的3d變換(平移,旋轉,縮放,切邊)并且透視變換使用齊次坐標。一般比較少用到。Unity中提供了一個Matrix4x4矩陣類

  • 四元數

“四元數是最簡單的超復數。 復數是由實數加上元素 i 組成,其中i^2 = -1。 相似地,四元數都是由實數加上三個元素 i、j、k 組成,而且它們有如下的關系: i^2 = j^2 = k^2 = ijk = -1 , 每個四元數都是 1、i、j 和 k 的線性組合,即是四元數一般可表示為a + bi + cj + dk,其中a、b、c 、d是實數”。這些概念很難懂吧。只要先記得Unity中的Quaternion有4個組件(x,y,z,w)

  • 歐拉角

“用來確定定點轉動剛體位置的3個一組獨立角參量,由章動角θ、旋進角(即進動角)ψ和自轉角j組成”
在Unity中,Quaternion.eulerAngles 返回旋轉的角度,繞z軸旋轉euler.z角度,繞x軸旋轉euler.x度,繞y軸旋轉euler.y度

轉換

  • 1.四元數到變換矩陣
[csharp]?view plaincopy
  1. Quaternion?q?=?Quaternion.LookRotation(new?Vector3(0,0.5,1));????
  2. Matrix4x4?rot?=?new?Matrix4x4();????
  3. rot.SetTRS(new?Vector3(0,0,0),q,new?Vector3(1,1,1));????



  • 2.變換矩陣到四元數
[csharp]?view plaincopy
  1. Matrix4x4?rot?=?new?Matrix4x4();????
  2. rot.SetTRS(new?Vector3(0,0,0),q,new?Vector3(1,1,1));????
  3. ????????????
  4. Vector4?vy?=?rot.GetColumn(1);????
  5. Vector4?vz?=?rot.GetColumn(2);????
  6. ????????????
  7. Quaternion?newQ?=?Quaternion.LookRotation(new?Vector3(vz.x,vz.y,vz.z),new?Vector3(vy.x,vy.y,vy.z));????

?


常用的函數
function ToAngleAxis (out angle : float, out axis : Vector3) : void
繞axis軸旋轉angle,創建一個旋轉


static function Angle (a : Quaternion, b : Quaternion) : float
返回a和b兩者之間的角度。


var eulerAngles : Vector3
返回表示旋轉的歐拉角度。表示旋轉的角度,繞z軸旋轉euler.z度,繞x軸旋轉euler.x度,繞y軸旋轉euler.y度(這樣的順序)。


function SetFromToRotation (fromDirection : Vector3, toDirection : Vector3) : void
把物體的fromDirection旋轉到toDirection


function SetLookRotation (view : Vector3, up : Vector3 = Vector3.up) : void
建立一個旋轉使z軸朝向view y軸朝向up


static function Slerp (from : Quaternion, to : Quaternion, t : float) : Quaternion
從from 轉換到to,移動距離為t


static function Lerp (a : Quaternion, b : Quaternion, t : float) : Quaternion
跟Slerp相似,且比Slerp快,.但是如果旋轉角度相距很遠則會看起來很差

比較

  • 變換矩陣

可以做各種復雜的變換,但是學習曲線比較大,使用的內存也比較多,因為存儲的數據量比較大。

  • 歐拉角

簡單理解,尤其是對美術和策劃的同事。運算速度和消耗內存比較少。可能存在萬向鎖的問題(兩個軸的旋轉重合)

  • 四元數

避免了萬向鎖的問題。理解起來不是那么直接。
有任何問題歡迎一起探討ken@iamcoding.com

轉載于:https://www.cnblogs.com/123ing/p/4114864.html

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

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

相關文章

本地通知

本地通知,local notification,用于基于時間行為的通知,比如有關日歷或者todo列表的小應用。另外,應用如果在后臺執行,iOS允許它在受限的時間內運行,它也會發現本地通知有用。比如,一個應用&…

Redux 并不慢,只是你使用姿勢不對 —— 一份優化指南

原文地址:Redux 并不慢,只是你使用姿勢不對 —— 一份優化指南原文作者:Julian Krispel譯文出自:掘金翻譯計劃本文永久鏈接:github.com/xitu/gold-m…譯者:reid3290校對者:sunui,xek…

把windows裝到linux下,如何將WSL(Windows Subsystem for Linux 2)安裝到Windows 10?

原標題:如何將WSL(Windows Subsystem for Linux 2)安裝到Windows 10?Windows 10憑借大受歡迎的WSL(Windows Subsystem for Linux)進入Linux領域。由于最近推出了WSL的最新版WSL2,用戶現在可以利用實際的Linux內核從Windows執行Linux任務。現在…

TWRP-recovery中文界面安裝方法[轉]

把下載到的ui.zip放入sdcard1/twrp文件夾。注意,是內置存儲卡中。如沒有上述文件夾,自行建立后通過文件管理器放入,不是卡刷。文件夾應如下所示:sdcard1(內置SD) | ┕--twrp(文件夾…

如何定期備份網站數據

產生這個問題的背景是我在維護兩個個人的網站,因為采用的是虛擬主機,有時候空間續費不及時等,都可能造成數據的丟失,為了保障數據不丟失,因為有必要每15天左右對網站數據進行備份以防止發生不當的事情。 我們希望做的就…

初創團隊可能不適合應屆生小孩

根據最近招聘中接觸到的一些剛畢業小孩的表現,談談這個問題: 1、扛不住,初創團隊一般最好一人撐一快工作,剛畢業經驗比較薄的小孩在這方面一是心理上不敢擔當,二是能力上確實還需要磨煉成長 2、初創團隊的那個環境可能…

vba執行linux命令,從VBA中的shell命令捕獲輸出值?

慕蓋茨4494581根據Andrew Lessard的回答,這是一個運行命令并將輸出作為字符串返回的函數 -Public Function ShellRun(sCmd As String) As StringRun a shell command, returning the output as a stringDim oShell As ObjectSet oShell CreateObject("WScript…

溢出和剪裁,可見性

內容溢出和剪裁 如果一個元素的內容對于元素大小來說過大,就有可能溢出元素本身。對于此情況,有一些解決辦法可選。 溢出 overflow 值 visible(默認):內容在元素框外可見。一般會導致內容超出其自己的元素框,但不會改變框的形狀scroll:溢出部…

C#= 棧模仿堆的操作

//原理,利用兩個棧,互相作用,來模仿堆的效果,先進先出。。 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Threading.Tasks;5 6 namespace TwoStacksQueue7 {8 public class Progra…

linux計劃任務執行日志,linux中centos制定計劃任務執行命令并且輸出日志

1.寫腳本最簡單的 寫如下代碼#!/bin/shABC1.每個命令之間用;隔開說明:各命令的執行給果,不會影響其它命令的執行。換句話說,各個命令都會執行,但不保證每個命令都執行成功。2.每個命令之間用&&隔開說明:若前面…

Java-大集合拆分為指定大小的小集合

因為Oracle數據的in 最大允許1000 ,超過就會報錯&#xff0c; 所以需要將集合拆分為多個集合進行處理. /*** 拆分集合* param <T>* param resList 要拆分的集合* param count 每個集合的元素個數* return 返回拆分后的各個集合*/public static <T> List<L…

AsyncTask與多任務

問題由來&#xff1a; 之前看到一篇博文&#xff0c;說AsyncTask不適合運行多任務&#xff0c; 多個任務不會異步執行&#xff0c; 當時只是印象里記住了一下也不確定&#xff0c; 今天把代碼看了看&#xff0c; 把原因寫出來。 問題的代碼演示&#xff1a; 1 public class Asy…

iptables簡單應用

可以修改/etc/rc.d/boot.local讓規則重啟后也能生效&#xff0c;如&#xff1a;/sbin/iptables -F/sbin/iptables -A INPUT -i eth0 -p tcp --sport 80 -j ACCEPT/sbin/iptables -A INPUT -i eth0 -p tcp -j DROP/sbin/iptables -A INPUT -i eth0 -p udp -j DROPiptables是一個…

linux中內部命令有哪些,linux內部命令有哪些

linux中常見的內部命令有&#xff1a;1.exit命令&#xff0c;退出當前的shell&#xff1b;2.history命令&#xff0c;顯示歷史執行過的命令&#xff1b;3.cd命令&#xff0c;切換當前工作目錄&#xff1b;4.source命令&#xff0c;重新執行剛修改的初始化文件&#xff1b;5.ech…

使用SALT-API進入集成開發的簡單樣例

測試的時候&#xff0c;可以CURL -K&#xff0c;但真正作集成的時候&#xff0c;卻是不可以的。 必須&#xff0c;不可以讓TOKEN滿天飛吧。 現在進入這個階段了。寫個樣例先&#xff1a; import salt import salt.auth import salt.log import saltapiopts salt.client.LocalC…

POJ 2778

題意&#xff1a;很Uva項鏈題目類似。 區別&#xff1a; 1、字符串很多&#xff0c;用map hash超時&#xff0c;用Trie查找。 2、DFS判斷連通&#xff0c;和并查集判連通&#xff0c;被我寫錯的地方時&#xff0c;查森林的時候&#xff0c;還是要Find_Set。 1 #include <ios…

linux掛載VMFS硬盤,ESX4.1掛載NFS共享存儲(VMkernel)

要使用vmotion,iscsi,nfs功能&#xff0c;必須啟用VMkernel端口&#xff0c;ESX 4.1默認不啟用&#xff0c;ESXi 5.x默認啟用。在 vCenter Server“SZVCENTER01”上調用對象“datastoreSystem-44”的“HostDatastoreSystem.CreateNasDatastore” 失敗。掛載NFS存儲的ESX控制臺命…

Perl學習之四:語句(續)

循環控制&#xff1a;1.last 退出標簽的語句塊2.next 3.redo不推薦&#xff0c;循環次數不可控 4.goto不推薦。***************************************標簽&#xff1a; 先定義一個 labellast|next|redo|goto label&#xff1b; last VS next 相當于C語言中的&#xff1a;las…

2017年8個最流行的Web編程趨勢

互聯網一直在不斷的發展&#xff0c;這意味著開發人員必須及時了解當前的所有變化。人們在新聞、社交、購物到銀行等各大方面都與互聯網有著千絲萬縷的聯系。因此&#xff0c;為了滿足全球數百萬網絡用戶的需求&#xff0c;Web開發需求正在上升。Web編程趨勢是在W開發的過程中不…

linux 分卷壓縮到指定目錄,運用在android下Linux分卷壓縮與分卷解壓的命令

protected static Vector execRootCmd(String paramString) {Vector localVector new Vector();try {Process localProcess Runtime.getRuntime().exec("su ");// 經過Root處理的android系統即有su命令OutputStream localOutputStream localProcess.getOutputStre…