這個東西很重要,現在很多功能做不出來或者做的慢,不管是官方文件講的不詳細,還是大學裡沒有相關課程,但歸根結底功能實現起來困難,還是因為這個掌握不熟練。
今天稍微系統的學習了一下3d數學,寫下一些筆記。
目錄:
unity中的四種座標系
unity物體位置
變換類詳細筆記
點和向量
為了準確靈活的操作遊戲物體,unity提供了四種座標系,供我們使用。
沒啥好說的,世界,(0,0,0)為原點。
把物體當作乙個單獨的世界,物體中的乙個點當作原點,改變全域性座標,不會影響區域性座標系。
這個東西就好像,乙個人和世界的關係。首先把這個人的胃部,當作他區域性座標系的原點,然後假設他的頭部的區域性座標是(0,1.5,0),然後你把乙個人從(0,0,0)移動到(0,1,0),這個人的世界座標系發生了改變,但是這個人頭的區域性座標不會發生改變,還是相對於胃部的座標是(0,1.5,0)的位置。
這個需要著重理解,建立在螢幕上的二維座標系,以畫素來定義的。原點在螢幕的左下角(0,0,0)的位置。這個螢幕座標的在用 debug一下input.mouseposition得出結果。
首先得知道,這攝像機的渲染原理是什麼,也不能說叫原理,一時也想不到什麼好的方式描述,姑且叫運作方式吧,首先我們場景中有乙個攝像機,這個攝像機所拍攝的畫面被鋪到game視窗,然後再新建乙個攝像機,把這個攝像機扭向別的方向,但是為什麼game視窗只能顯示乙個攝像機的拍攝內容?因為unity中用depth也就是深度來控制攝像機的渲染順序,較大值的攝像機將被渲染在較小值的攝像機之上。然後是在相同深度下,我試了下好像是game視窗顯示的是最先被建立出來的攝像機所拍攝的畫面(有待進一步考證,但是不太重要),也就是說在場景中有多個攝像機的情況下,多個攝像機按照它們自身的深度,將所拍攝的畫面一層一層的鋪在game視窗上,於是深度最大的那乙個攝像機所拍攝的畫面,就能被我們所看到。然後,有沒有發現?這個方式什麼類似?對,就是unity2d遊戲開發中的精靈渲染模式。在2d遊戲中,我們把兩個sprite,通過拖動,把他倆堆到一起,是誰遮住誰呢?在同一sortinglayer中的order in layer中越大的那個越在上面顯示,也就是說,這些精靈也是根據自己的order in layer大小,一層層的鋪的,現在我們把兩個正方形的sprite通過拉伸,平鋪滿整個攝像機所能拍攝的範圍。這就形成了,類似於分屏的效果。同理,攝像機通過調節viewport,就能實現分屏顯示的效果。
知道了上面的這些的話,然後是這個座標系是相對於顯示區域來說的,把螢幕座標單位化,但是實際上與其這麼說,不如說是把螢幕比例化。因為在這個座標系下,左下角座標是(0,0),右上角的座標是(0,1)。舉個例子,(0,0.5),這個座標就是在螢幕高度一半的位置。
而且關於這個視口座標系的描述以及作用啥的,網上搜了半天都沒有實際靠譜的,都是籠統的貼上複製。這裡我做了個簡陋的實驗。下圖:
結合層級檢視、game視窗、scnece檢視以及相機的屬性面板,就能發現這個視口座標系是幹什麼的。
public static quaternion lookrotation (vector3 forward, vector3 upwards= vector3.up);
這個方法,文件的解釋真的是不太好理解,但是實際上就是讓乙個物體的z軸,以第二個引數為軸(這個引數預設給的是vector3.up),旋轉到與forward向量指向的方法對齊,並返回該旋轉之後的rotation四元數。(返回的這個四元數是按物體已經旋轉到了你規定的那個forward方向的那個四元數,通俗來來說就是目的地的方向的rotation四元數)然後,就可以把返回的四元數的值賦給transform.rotation了,這個api使用的難點是構建forward向量,然後還有就是別看它給的第乙個這個形參名字,很有誤導作用啊有沒有?倒不如把這個引數改為targetdir。
這兩個根本區別照我的理解是乙個是第乙個是區域性座標,第二個是世界座標。同理,其他這一套的的api也是乙個意思。
注意下後面那個引數就行。self是區域性座標系,world是世界座標。
將乙個座標點從區域性座標系轉換到全域性座標系。
將座標點從全域性座標系轉換到區域性座標系
將乙個方向從區域性座標系轉換到全域性座標系。
將乙個方向從全域性座標系轉換到區域性座標系。
將乙個向量從區域性座標系轉換到全域性座標系。
將乙個向量從全域性座標系轉換到區域性座標系。
將螢幕座標轉換為全域性座標。
將全域性座標轉換為螢幕座標。
獲得滑鼠在螢幕座標系中的座標。
將螢幕座標轉換為視口座標。
將視口座標轉換為螢幕座標。
將全域性座標轉換為視口座標。
將視口座標轉換為全域性座標。
unity用vector2、vector3型別,來表示2d和3d中的環境下的點和向量,即(x,y),(x,y,z)。零向量既無大小也無方向,2d零向量表示為(0,0),3d零向量表示為(0,0,0),在unity中,用vector3.zero來表示3d零向量。給乙個向量加負號,使該向量方向變相反在unity中,可以通過vector3.magnitude計算向量的長度。vector3.sqrmagnitude則返回向量長度的平方。vector3.distance(a,b)可以計算2個點a,b之間的距離,即返回向量ab或向量ba的長度。等同於(b-a).magnitude或(a-b).magnitude。單位向量,即用normalizated,這個把向量的長度設為1,方向不變,方便計算和改變長度。至今沒用過向量之間的加減法,等用到再記下來。
只用過點與點之間相減,構造向量的。
數學公式是這個:|a|*|b|*cos
unity中用是這個。
然後記住這個表:可以看到0到90°都是正數。先把倆向量歸一化,再絕對值乘以絕對值再乘以cos夾角,由下表的值,就可以用來當作確切的夾角範圍,一般用來判斷乙個點是否在另乙個點的一定範圍內。這個範圍通常是扇形。
數學公式:|a|*|b|*sin
然後:叉積得到的向量垂直於原來的兩個向量,也就是說可以拿這個求乙個平面的法向量。
unity中api為
其他內容,有待補充。
3D數學基礎
vector是向量,向量的意思,向量既有大小,又有方向,verctor3 就是三維向量,乙個三維向量會有三個分量,分別是 x,y,z,在 unity 中每乙個遊戲物件都至少會有乙個元件叫 transform,transform 主要用來控制遊戲物件的位置,旋轉和縮放。vector3.distance...
3D數學基礎 3D中的方位與角位移 3
先來看下下面的總結表 不同的方位表示方法適用於不同的情況,下面是一些選擇的建議 設矩陣儲存在下面這些變數中 float m11,m12,m13 float m21,m22,m23 float m31,m32,m33 以弧度形式計算尤拉角並儲存在以下變數中 360 2 弧度 float h,p,b 從...
3D數學基礎 向量
vector3.h hello 注釋 是否需要const修飾就是分析其資料是否需要修改,不需要修改就加const,安全性 一般有兩個地方需要考慮是否加const 1,成員函式引數處 2,成員函式本身,即類本身資料不允許修改 修飾的是this ifndef hello vector3 h define...