還是在讀書的時候幫外專業朋友做作業,用gdi實現三維空間的立方體繪製和旋轉的操作,那個時候自己根據《線性代數與空間解析幾何》以及《計算機圖形學》等課程的相關知識寫了乙個三維向量類。後來做了些二維和三維的東西發現用向量操作會使很多問題變得簡單直觀,尤其是在opengl程式設計的時候這種感覺尤為明顯。經過這麼長時間的使用現在這個類已經比較完善了,早些時候將它上傳到了csdn,近來比較閒索性寫個介紹吧,希望對從事三維圖形開發的朋友有所幫助,也期待著與大家的交流中會有所提高。
類的定義是這樣的
大家應該都知道所謂向量其實就是一組數,在笛卡爾座標系中乙個向量就是起點在原點的有向線段,雖然向量的起點可以在任意位置,但是標記向量的有序數卻還是當起點在原點時終點的座標。所以m_fvectorx, m_fvectory, m_fvectorz就唯一確定了乙個向量。當然向量還有一些其他屬性,比如模(也就是向量的長度),比如其和各個座標軸的夾角,所以我做了另外四個變數m_fmod、m_fanglex、m_fangley、m_fanglez來儲存這些屬性。
生成變數有很多方法,比如直接設定終點座標、比如通過起點和終點做差,所以我也實現了兩個版本的setvector。當然也有通過模和角度來生成變數的,但這種方法極其不常用,尤其是在三維條件下這個角度其實很不容易計算,所以我也就沒有實現相應的方法。獲取向量的模是常用的向量操作,我自然也對其進行了實現,getmod就是返回模的函式。和向量有關的操作中反向也是比較常用的乙個,我也用invert實現了這個操作。具體應用時,我們可能經常會用到單位向量,makeunitvector的功能就是將當前向量變成單位向量。最值得一提的就是rotate函式,有過三維製作經驗的人都應該知道在三維空間中旋轉操作是最讓人頭疼的了,需要進行繁瑣的矩陣運算。根據實際使用的經驗,我實現了簡單易用的rotate函式,第乙個引數fangle用於指定旋轉角度,而第二個引數vtraxis用於指定旋轉軸。這樣通過呼叫這個函式我們就可以輕鬆實現任意的旋轉操作,也可以初始向量到乙個特殊方向,通過旋轉達到指定方向,這樣也省掉了自行計算複雜向量初始引數的麻煩。當然作為乙個數學操作單元過載操作符是必須的,加、減、賦值不必多說,向量乘法有兩種,叉積和內積,我通過「*」實現了叉積運算而通過「^」號實現了內積運算。各個向量操作主要都是通過座標實現的,而某些操作實現之後需要相應的修正其他引數,calculateangles函式就是重新計算新向量的角度引數的,使用在各個函式的內部。以下是這個類的實現**:
我在網上也看過一些向量類,多半只是有座標引數,沒有相應操作。這個類體現出了向量的所有屬性,而且封裝了我能想到的向量的所有常用操作。尤其是旋轉操作功能比較全面,在我實際的三維程式設計應用中也有很好的效果。這次拿出來和大家分享,希望大家多提寶貴意見。
三維向量筆記
筆記 一 1 三維向量vec3的使用 1 vec3 cocos定義的乙個三維向量的類,在cc模組中 2 向量在每個座標軸的分量 x y z 3 構造乙個向量的3種方式 new vec3 v vec3 new了乙個vec3的例項出來,然後我們的例項裡面的x,y,z v的分量一樣 new vec3 x,...
Unity三維數學(向量)
什麼是向量?乙個數字列表,表示各個維度上有向位移向量的形式 乙個有大小有方向的物理量 大小就是向量的模長 方向描述了空間中向量的指向 可以表示物體的位置方向 向量的大小 向量各分量平方和的平方根 公式 x y z 再平方根 api float dis vertor.magnitude 模的平方 ve...
三維向量的長度python 對向量空間的理解
線性代數是研究向量和矩陣的一門數學,矩陣也是向量構成的,所以線性代數主要是研究向量,向量空間以及向量線性組合性質的一門科學。我們很早就接觸到了向量這個東西,向量也稱為向量,是一種有方向,有數值大小的一種數值表示。我們知道向量有幾種基本的運算,向量加法,就是向量裡的每乙個分量對應相加,向量與乙個標量相...