Opengl 当θ=360时,沿z轴观察gluLookAt起作用,但当θ=0时不起作用
我在OpenGL中绘制三角形时遇到了一个有趣的问题。显然,当你沿着“向上”的方向看时,在我的例子中,这意味着Eye_z=Up_z(因为我是在球坐标系下工作的,这意味着θ=0),对象不会显示(请参阅的顶部答案以获得数学解释)。 但是,当我将角度设置为360度而不是0度时,对象将毫无问题地显示出来。有人知道为什么吗?我在这里附上了我的代码片段和屏幕截图: 三角形.cppOpengl 当θ=360时,沿z轴观察gluLookAt起作用,但当θ=0时不起作用,opengl,Opengl,我在OpenGL中绘制三角形时遇到了一个有趣的问题。显然,当你沿着“向上”的方向看时,在我的例子中,这意味着Eye_z=Up_z(因为我是在球坐标系下工作的,这意味着θ=0),对象不会显示(请参阅的顶部答案以获得数学解释)。 但是,当我将角度设置为360度而不是0度时,对象将毫无问题地显示出来。有人知道为什么吗?我在这里附上了我的代码片段和屏幕截图: 三角形.cpp void Triangle::render(Camera C){ glClear(GL_COLOR_BUFFER_
void Triangle::render(Camera C){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glLoadIdentity();
float th = C.Getth();
float ph = C.Getph();
float Eye_x = r*sin(th*DEGtoRAD)*cos(ph*DEGtoRAD);
float Eye_y = r*sin(th*DEGtoRAD)*sin(ph*DEGtoRAD);
float Eye_z = r*cos(th*DEGtoRAD);
float Up_z = (th>=180.0f && th<360.0f)?-1.0f:1.0f;
gluLookAt(Eye_x,Eye_y,Eye_z,0.0,0.0,0.0,0.0,0.0,Up_z);
glRotatef(m_rotationAngle, 0.0f, 0.0f, 1.0f);
// Draw Triangle
glBegin(GL_TRIANGLES);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(-0.5f,-0.5f,0.0f);
glColor3f(1.0f,1.0f,0.0f);
glVertex3f(0.5f,-0.5f,0.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(0.0f,0.5f,0.0f);
glEnd();
// Draw Axes
glBegin(GL_LINES);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,0.0f,1.0f);
glEnd();
}
void三角形::渲染(摄影机C){
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glEnable(GLU深度试验);
glLoadIdentity();
float th=C.Getth();
浮动ph=C.Getph();
浮眼x=r*sin(th*DEGtoRAD)*cos(ph*DEGtoRAD);
浮眼y=r*sin(th*DEGtoRAD)*sin(ph*DEGtoRAD);
浮眼_z=r*cos(th*DEGtoRAD);
向上浮动(th>=180.0f和th360.0f){
th-=360.0f;
}
打破
案例-1://-th
th-=移动金额;
如果(th=360.0f){
ph-=360.0f;
}
打破
案例2://-ph
ph-=移动量;
如果(pH)你的th
可能不是真正的“0”或“360”,而是接近。如果你得到一个“真”的“0”,你的眼睛到目标向量将与upI平行。我已经考虑了我的360*DEGtoRAD中的错误,但它必须有多大才能工作?(或者,换句话说,你需要多小的变化才能不与上方向向量平行?)我现在的代码有度到弧度的转换,精确到6位。
void Camera::Move(int dir){
switch(dir){
case 1: // +th
th += move_amt;
if(th>360.0f){
th-=360.0f;
}
break;
case -1: // -th
th -= move_amt;
if(th<=0.0f){
th+=360.0f;
}
break;
case 2: // ph
ph += move_amt;
if(ph>=360.0f){
ph-=360.0f;
}
break;
case -2: // -ph
ph -= move_amt;
if(ph<=0.0f){
ph+=360.0f;
}
break;
default:
break;
}
}