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有一些倒轉的軸)。
現在我有一個奇怪的結果,可以看出在這個視頻:
請忽略的背景和相機中間的綠化廣場的彩色球,只是看在相機前面的白色球體中。正如你所看到的,如果我只進行平移或者只進行傾斜(看左下角的值顯示確切的攝像機角度),那麼白色的球體總是在預期的相機中心。然而,當平移和傾斜一起執行時,球體漂移:搖攝和傾斜值越遠離0度,球體越漂移。此外,漂移的形狀遵循一個圓形的軌跡,這對我來說非常可疑。
有沒有人有想法?由於
非常感謝,它的工作原理!無論如何,你有什麼想法爲什麼我的方法無法正常工作?我在做一些數學錯誤嗎? –
@valerio_sperati:我很抱歉,但我懶得在某處簽到數學:)最有可能你只是混淆了操作的順序 - 請記住,旋轉是不可交換的,所以如果openGL的旋轉,首先圍繞X,則中心繞Y而你以相反的方式做,那麼你會得到不同的結果。 – ybungalobill
謝謝,你是對的!我現在意識到,在我的代碼的第一行,我旋轉相機的地方,我以這個(錯誤的)順序調用了glRotatef():1,0,2。現在我將訂單更正爲0,1,2,因此我的代碼正常工作!再次感謝 –