2013-11-22 23 views
-1

我有隨機生成一個點,與一些隨機方向(與隨機lat和隨機LON),其餘計算由這些數學方程:繪製金字塔,指向某個方向

dirX = cos(lat * DEG_TO_RAD) * sin(lon * DEG_TO_RAD); 
dirY = sin(lat * DEG_TO_RAD); 
dirZ = cos(lat * DEG_TO_RAD) * cos(lon * DEG_TO_RAD); 

我會就像要拿那個點,畫一個金字塔。這個金字塔在球體的一半有其正方形基礎,產生的點應該是這個正方形的中心。

然後根據這個點的方向,我想生成這個金字塔的座標,它應該位於半徑爲r的球體的球形邊界上,它的中心是隨機點。

金字塔頂端指向隨機點所在的方向,其他點應分別繪製。這是一張圖片,可以幫助您想象我正在嘗試做什麼。

Pyramid in half sphere Sketch

這是我在做什麼:

//A 
v[0][0][0]= radius * (cos(lat) * sin(lon)); 
v[0][0][1]= radius * sin(lat); 
v[0][0][2]= radius * (cos(lat) * cos(lon)); 

    //B 
v[0][2][0]= radius * (cos(lat+(90*DEG_TO_RAD)) * sin(lon)); 
v[0][3][1]= radius * sin(lat+(90*DEG_TO_RAD)); 
v[0][4][2]= radius * (cos(lat+(90*DEG_TO_RAD)) * cos(lon)); 

//D 
v[0][2][0]= radius * (cos(lat) * sin(lon+(90*DEG_TO_RAD))); 
v[0][2][1]= radius * sin(lat); 
v[0][2][2]= radius * (cos(lat) * cos(lon+(90*DEG_TO_RAD))); 


// Side ABD 
glColor3f(0.0, 0.0, 0.0); 
glBegin(GL_POLYGON); // Start drawing a quad primitive 
    glVertex3f(v[0][0][0], v[0][0][1], v[0][0][2]); //A 
    glVertex3f(v[0][5][0], v[0][6][1], v[0][7][2]); //B 
    glVertex3f(v[0][2][0], v[0][2][1], v[0][2][2]); //D 



//A 
v[1][0][0]= radius * (cos(lat) * sin(lon)); 
v[1][0][1]= radius * sin(lat); 
v[1][0][2]= radius * (cos(lat) * cos(lon)); 

//D 
v[1][8][0]= radius * cos(lat) * sin(lon+(90*DEG_TO_RAD)); 
v[1][9][1]= radius * sin(lat); 
v[1][10][2]= radius * (cos(lat) * cos(lon+(90*DEG_TO_RAD))); 

//C 
v[1][2][0]= radius * (cos(lat-(90*DEG_TO_RAD)) * sin(lon)); 
v[1][2][1]= radius * sin(lat-(90*DEG_TO_RAD)); 
v[1][2][2]= radius * (cos(lat-(90*DEG_TO_RAD)) * cos(lon)); 

// Side ADC 
glColor3f(1, 1, 1); 
    glVertex3f(v[1][0][0], v[1][0][1], v[1][0][2]); //A 
    glVertex3f(v[1][11][0], v[1][12][1], v[1][13][2]); //D 
    glVertex3f(v[1][2][0], v[1][2][1], v[1][2][2]); //C 



//A 
v[2][0][0]= radius * (cos(lat) * sin(lon)); 
v[2][0][1]= radius * sin(lat); 
v[2][0][2]= radius * (cos(lat) * cos(lon)); 

//C 
v[2][14][0]= radius * (cos(lat-(90*DEG_TO_RAD)) * sin(lon)); 
v[2][15][1]= radius * sin(lat-(90*DEG_TO_RAD)); 
v[2][16][2]= radius * (cos(lat-(90*DEG_TO_RAD)) * cos(lon)); 

//E 
v[2][2][0]= radius * (cos(lat) * sin(lon-(90*DEG_TO_RAD))); 
v[2][2][1]= radius * sin(lat); 
v[2][2][2]= radius * (cos(lat) * cos(lon-(90*DEG_TO_RAD))); 

// Side ACE 
glColor3f(0.5, 0.3, 0.1); 
    glVertex3f(v[2][0][0], v[2][0][1], v[2][0][2]); //A 
    glVertex3f(v[2][17][0], v[2][18][1], v[2][19][2]); //C 
    glVertex3f(v[2][2][0], v[2][2][1], v[2][2][2]); //E 

//A 
v[3][0][0]= radius * (cos(lat) * sin(lon)); 
v[3][0][1]= radius * sin(lat); 
v[3][0][2]= radius * (cos(lat) * cos(lon)); 

//E 
v[3][20][0]= radius * (cos(lat) * sin(lon-(90*DEG_TO_RAD))); 
v[3][21][1]= radius * sin(lat); 
v[3][22][2]= radius * (cos(lat) * cos(lon-(90*DEG_TO_RAD))); 

//B 
v[3][2][0]= radius * (cos(lat+(90*DEG_TO_RAD)) * sin(lon)); 
v[3][2][1]= radius * sin(lat+(90*DEG_TO_RAD)); 
v[3][2][2]= radius * (cos(lat+(90*DEG_TO_RAD)) * cos(lon)); 

// Side AEB 
glColor3f(1.0, 0.8, 0.7); 
    glVertex3f(v[3][0][0], v[3][0][1], v[3][0][2]); //A 
    glVertex3f(v[3][23][0], v[3][24][1], v[3][25][2]); //E 
    glVertex3f(v[3][2][0], v[3][2][1], v[3][2][2]); //B 
glEnd(); 


/* 
    //Square BECD 
    glColor3f(0.1, 0.3, 0.1); 
    glVertex3f((radius * cos(lat+(90*DEG_TO_RAD)) * sin(lon)), (radius * sin(lat+(90*DEG_TO_RAD)) * sin(lon)), (radius * cos(lon))); //headB 
    glVertex3f((radius * cos(lat) * sin(lon-(90*DEG_TO_RAD))), (radius * sin(lat) * sin(lon-(90*DEG_TO_RAD))), (radius * cos(lon-(90*DEG_TO_RAD)))); //headE 
    glVertex3f((radius * cos(lat-(90*DEG_TO_RAD)) * sin(lon)), (radius * sin(lat-(90*DEG_TO_RAD)) * sin(lon)), (radius * cos(lon))); //headC 
    glVertex3f((radius * cos(lat) * sin(lon+(90*DEG_TO_RAD))), (radius * sin(lat) * sin(lon+(90*DEG_TO_RAD))), (radius * cos(lon+(90*DEG_TO_RAD)))); //headD 
    glEnd(); 
*/ 

讓我們不要考慮繪製金字塔的方形底座,這個問題已經從之前存在!出於某種原因,它只是渲染一團糟!我沒有得到期望的結果。

回答

0

嗯有趣的問題,如果我正確理解你的問題,這裏是我該怎麼做。讓單位球的產生點是(a,b,c)a^2 + b^2 + c^2 = 1其中球體以原點爲中心,那麼我們通過(a,b,c)和其相反(-a,-b,-c)畫一條線。確定這條線的方程很容易。接下來我們找到一條垂直於這條線的3d線,這裏有無限多的選擇。有了這兩條線,我們可以找到由這兩條線確定的兩個平面,它們與球體的交點將爲您提供金字塔的座標。再次根據您選擇的第二條線有無限多的選擇(想想這是爲了固定一條線,另一條線垂直於它的中點並自由旋轉)

1

GL_POLYGON繪製多邊形你給它的所有頂點。

既然你只繪製三角形,你應該切換到GL_TRIANGLES