Unity 3D 矩陣和四元數的研究

2021-07-26 23:29:08 字數 1936 閱讀 4660

版本:unity 5.4.1  語言:c#

2023年了,使用unity也有一段時間了,略有心得吧,基本上要求一些功能可以拼拼湊湊地做出來,算是入門了吧。

不過很多遊戲上使用的技術還沒有接觸過,比如protobuf、熱更新、shader之類,今年的一開始接觸一下遊戲中常用的技術,然後shader方面好好入門一下。當然好早之前的3d遊戲開發大師也會在今年早期看完。

暫定這些目標吧,好好磨練一下技術。

今天給大家帶來的是矩陣和四元數,首先矩陣說實話在unity今天還是第一次,找api都花了點時間,不過使用下來還是挺容易的,跟代數很像。

首先是最簡單的平移矩陣:(看的實戰核心技術,不過書裡很多矩陣都是錯的)

1   0     0    0

0   1     0    0

0   0     1    0

tx  ty  tz  1

tx、ty、tz是x、y、z軸移動的數值,具體使用的話,使用matrix4x4 mat = new matrix4x4();建立矩陣物件,然後乘以new vector4(x, y, z, 1f)表示的三維座標,獲得的vector4就是移動後的座標。後面的矩陣也都是這個原理,就不會再贅述了。

縮放矩陣:

sx  0   0   0

0   sy  0   0

0   0   sz  0

0   0    0   1

x軸旋轉矩陣:

1   0           0          0

0   cos(a)  sin(a)  0

0   -sin(a) cos(a)  0

0   0           0          1

y軸旋轉矩陣:

cos(a)  0       -sin(a) 0

0          1       0           0

sin(a)  0       cos(a)  0

0          0       0           1

z軸旋轉矩陣:

cos(a)  -sin(a) 0    0

sin(a)  cos(a)  0    0

0          0          1     0

0          0          0     1

以上就是常用的幾個矩陣了。

四元數其實有點像是矩陣的效果,不過計算更加複雜難以理解,我這邊參考了candycat的教程給出幾個結論。

四元數的表示為(v, w),其中v類似是乙個三維座標。

單位長度的乙個旋轉軸(x, y, z)和角度a,則對應的四元數為((x, y, z)*sin(a/2), cos(a/2)) 。

建立四元數的幾種方法:

quaternion.euler(vector3)  以尤拉角建立四元數

quaternion.axisangle(vector3,float)  相對於某個方向旋轉某個角度的四元數

quaternion.fromtorotation(vector3,vector3)  起始方向到結束方向的四元數

quaternion.lookrotation(vector3)  朝向為正方向,旋轉軸為上方向,旋轉到想要方向的四元數

使用四元數:

operator*  四元數相乘,旋轉累積

operator*  vector3左乘四元數,點旋轉到對應點

lerp  線性插值

slerp  球形插值

lerpunclamped  非鉗制線性插值,可以突破0和1的界限

slerpunclamped  非鉗制球性插值,可以突破0和1的界限

尤拉角的旋**

transform.rotate(vector3)  就是transform的3個值,需要注意的是如果設定x為90度,則移動其他的緯度都會改變y,這就是萬向節鎖。

常用的方法估計就以上幾個,如果後面有好用的方法,我還會再補充。

unity3d四元數和旋轉矩陣

quaternion中存放了x,y,z,w四個資料成員,可以用下標來進行訪問,對應的下標分別是0,1,2,3。主要介紹幾個函式 1 根據兩個向量計算出旋轉量,計算出來的旋轉量為從fromdirection旋轉到todirection的旋轉量 static quaternion fromtorotat...

unity3d四元數和旋轉矩陣

quaternion中存放了x,y,z,w四個資料成員,可以用下標來進行訪問,對應的下標分別是0,1,2,3。主要介紹幾個函式 1 根據兩個向量計算出旋轉量,計算出來的旋轉量為從fromdirection旋轉到todirection的旋轉量 static quaternion fromtorotat...

Unity3D 四元數的理解

環境 unity2018.3 語言 c 複數 首先我來考慮複數軸i,i的定義為i 2 1。按照旋轉的角度來理解的話,從1變換到 1,1實際上是旋轉了180度到了 1。那麼旋轉90度呢?這個時候實際上就旋轉到了複數軸上了,我們便用i來表示這個軸。在2維空間中事情比較簡單。設點p為 x,y 以複數的概念...