2016-11-17 83 views
1

我想在鏡頭前畫一個小球體,假設有5個單位(C++,openGL中的newby,而且對三角學不太自信!)。 我希望當我進行搖擺和傾斜動作時,球體總是在我的相機中間。openGL:無法在鏡頭前正確繪製球體

在我的渲染循環,我計算出球的按以下方式座標:

// 1) settimg my camera 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glRotatef(camera_angle[1], 0, 1, 0); 
glRotatef(camera_angle[0], 1, 0, 0); 
glRotatef(camera_angle[2], 0, 0, 1); 
glTranslatef(camera_pos[0],camera_pos[1],camera_pos[2]); 

// 2) retrieving camera pan tilt angles in radians: 
double phi = camera_angle[1] *(M_PI/180.0); //pan 
double theta = camera_angle[0] *(M_PI/180.0); //tilt 

//3) calculating xyz coordinates of the sphere, if 5 units away from camera 
double dist = -5; 
double ax = camera_pos[0] + (-1)*(dist*sin(phi)*cos(theta)); 
double ay = camera_pos[1] + dist*sin(theta); 
double az = camera_pos[2] + dist*cos(theta)*cos(phi); 

//4) draw sphere 
float ndiv = 2.0; 
GLfloat f[]={1.0,1.0,1.0,1}; 

glPushMatrix(); 
glTranslated(ax, ay, az); 
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, f); 
glShadeModel(GL_FLAT); 
glBegin(GL_TRIANGLES); 
for (int i=0;i<20;i++) 
makeTri(vdata[tindices[i][0]], vdata[tindices[i][1]], vdata[tindices[i][2]], ndiv, 0.2); 
glEnd(); 
glPopMatrix(); 

我發現這裏的三角公式 spherical coordinate system

注意,我倒喜歡正弦和餘弦一些值,因爲我猜想正確的順序取決於參考系統(我猜openGL有一些倒轉的軸)。

現在我有一個奇怪的結果,可以看出在這個視頻:

sphere behaviour

請忽略的背景和相機中間的綠化廣場的彩色球,只是看在相機前面的白色球體中。正如你所看到的,如果我只進行平移或者只進行傾斜(看左下角的值顯示確切的攝像機角度),那麼白色的球體總是在預期的相機中心。然而,當平移和傾斜一起執行時,球體漂移:搖攝和傾斜值越遠離0度,球體越漂移。此外,漂移的形狀遵循一個圓形的軌跡,這對我來說非常可疑。

有沒有人有想法?由於

回答

1

要畫的東西,不移動相對於相機您只需從身份模型視圖矩陣從頭開始:

float ndiv = 2.0; 
GLfloat f[]={1.0,1.0,1.0,1}; 

glPushMatrix(); 
glLoadIdentity();   // <------------- zero out transforms 
glTranslated(0, 0, -5); // <------------- translate 5 units from the camera 
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, f); 
glShadeModel(GL_FLAT); 
glBegin(GL_TRIANGLES); 
for (int i=0;i<20;i++) 
makeTri(vdata[tindices[i][0]], vdata[tindices[i][1]], vdata[tindices[i][2]], ndiv, 0.2); 
glEnd(); 
glPopMatrix(); 
+0

非常感謝,它的工作原理!無論如何,你有什麼想法爲什麼我的方法無法正常工作?我在做一些數學錯誤嗎? –

+1

@valerio_sperati:我很抱歉,但我懶得在某處簽到數學:)最有可能你只是混淆了操作的順序 - 請記住,旋轉是不可交換的,所以如果openGL的旋轉,首先圍繞X,則中心繞Y而你以相反的方式做,那麼你會得到不同的結果。 – ybungalobill

+0

謝謝,你是對的!我現在意識到,在我的代碼的第一行,我旋轉相機的地方,我以這個(錯誤的)順序調用了glRotatef():1,0,2。現在我將訂單更正爲0,1,2,因此我的代碼正常工作!再次感謝 –