解決opengl計算頂點法向量問題,opengl計算頂點向量
由於畢業論文的需要,近期開始學習OpenGL,由於新手剛開始接觸所以總會遇到很多問題。這兩天,總算把OpenGL中頂點法向量這個問題弄明白了。
幾點迷惑:
如何通過假設方法判斷平面法向量的方向(這裡是指三角面片):
首先,當然要有資料,就是未經處理資料中每個面片是由那三個頂點組成。比如現在空間中有一個三角形平面由三個頂點A,B,C組成。
接著,就會存在下面兩種情況,如:
因此,我們在程式中只要反著試一次,就會得到我們的結果了。下面我給出我的部分代碼已經(斯坦福大學著名的bunny模型):
其中,A和B是後面要進行叉乘的兩個向量,point1,point2,point3就是三角面片的三個頂點。
情況1:
A[X] = point2[X] - point1[X];A[Y] = point2[Y] - point1[Y];A[Z] = point2[Z] - point1[Z];B[X] = point1[X] - point3[X];B[Y] = point1[Y] - point3[Y];B[Z] = point1[Z] - point3[Z];
情況2:
<span style="color:#000000;">A[X] = point3[X] - point1[X];A[Y] = point3[Y] - point1[Y];A[Z] = point3[Z] - point1[Z];B[X] = point1[X] - point2[X];B[Y] = point1[Y] - point2[Y];B[Z] = point1[Z] - point2[Z];</span>
從上面兩種情況可以看出,它們確實是相反的。自己再實際操作的時候可以去嘗試一下。
計算頂點法向量的過程記錄:
首先,我們要瞭解幾個概念,平面法向量(平面上兩個不平行,不共線的向量叉乘得到),頂點法向量(以這個點為頂點的所有三角形的法向量之和)。
接著,我們就可以通過三個頂點求得兩個向量,兩個向量叉乘得到平面法向量。(平面法向量進行歸一化)
然後,統計每個頂點的所有平面法向量之和。(頂點法向量進行歸一化)
bunny資料檔案下載連結
bunny資料包含頂點資料和頂點法向量資料連結
第一個串連是bunny模型的幾種資料格式檔案,第二個連結是一個包含bunny模型的頂點資料和已經計算出的頂點法向量資料。大家可以自己利用頂點資料計算頂點法向量,然後和該檔案中的頂點法向量進行比對,來驗證自己寫的計算頂點法向配量序的正確與否。
頂點法向量的計算[opengl]
(1) 可以自己假定。
(2) 可以用叉乘積計算,注意方向--右手螺旋。
空間平面的法線向量,可以用平面上的任兩條直線的叉乘積計算。對於一個mesh角點,用兩條過角點的mesh邊線算出,如果這個角點有好幾個mesh們,可以用它們的平均,或自己假定法線向量。
(3) loonie自己的已知三點,計演算法線子程式:
/* -------------------------------
* v1[],v2[],v3[] {x,y,z}
* -------------------------------*/
void norm(GLfloat v1[3], GLfloat v2[3], GLfloat v3[3], GLfloat *nor )
{
GLfloat vc1[3],vc2[3];
GLfloat a,b,c;
GLdouble r;
vc1[0]= v2[0] - v1[0]; vc1[1]= v2[1] - v1[1]; vc1[2]= v2[2] - v1[2];
vc2[0]= v3[0] - v1[0]; vc2[1]= v3[1] - v1[1]; vc2[2]= v3[2] - v1[2];
a = vc1[1] * vc2[2] - vc2[1] * vc1[2];
b = vc2[0] * vc1[2] - vc1[0] * vc2[2];
c = vc1[0] * vc2[1] - vc2[0] * vc1[1];
r = sqrt( a * a + b* b + c * c);
nor[0] = a / r;
nor[1] = b / r;
nor[2] = c / r;
}
教opengl前輩 opengl中怎讓頂點與頂點法向量關聯起來,以圓柱為例……
相機是一樣的,加上防暴型外殼層級相機中,基於工業級防爆要求很複雜,主要是防水,防結露,防氣,防機械衝擊......基本上密封狀態下,許多殼牌也比照相機的情況下更昂貴,相機不高或低,防暴外殼在千元以上。