Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 当θ=360时,沿z轴观察gluLookAt起作用,但当θ=0时不起作用_Opengl - Fatal编程技术网

Opengl 当θ=360时,沿z轴观察gluLookAt起作用,但当θ=0时不起作用

Opengl 当θ=360时,沿z轴观察gluLookAt起作用,但当θ=0时不起作用,opengl,Opengl,我在OpenGL中绘制三角形时遇到了一个有趣的问题。显然,当你沿着“向上”的方向看时,在我的例子中,这意味着Eye_z=Up_z(因为我是在球坐标系下工作的,这意味着θ=0),对象不会显示(请参阅的顶部答案以获得数学解释)。 但是,当我将角度设置为360度而不是0度时,对象将毫无问题地显示出来。有人知道为什么吗?我在这里附上了我的代码片段和屏幕截图: 三角形.cpp void Triangle::render(Camera C){ glClear(GL_COLOR_BUFFER_

我在OpenGL中绘制三角形时遇到了一个有趣的问题。显然,当你沿着“向上”的方向看时,在我的例子中,这意味着Eye_z=Up_z(因为我是在球坐标系下工作的,这意味着θ=0),对象不会显示(请参阅的顶部答案以获得数学解释)。 但是,当我将角度设置为360度而不是0度时,对象将毫无问题地显示出来。有人知道为什么吗?我在这里附上了我的代码片段和屏幕截图:

三角形.cpp

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;
        }
}