2016-11-17 69 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,因此我的代码正常工作!再次感谢 –