关于OpenGL中的旋转

时间:2017-02-22 10:50:40

标签: c opengl glut

我正在开发一个简单的代码,试图学习一些OpenGL。我用GL_LINES做了一个简单的方格,我试图用箭头键旋转它们。当它左右旋转时,它会顺利进行,但如果我尝试上下旋转它有时会跳跃。我知道错误就在这条线上,但我不知道如何修复它:if(beta>=PI*2.0 && beta<=0) beta=0;

#include <windows.h>
#include <glut.h>
#include <GL/gl.h>
#include <GL/glu.h> 
#include <stdio.h>
#include <math.h>
#define INCREMENTO .1
#define DISTANCIA 50
#define PI 3.1416

float alpha=0;
float beta =0;

void myCamara() {

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-100.0,100.0f,-100.0,100.0f,-100.0,100.0f);     
    gluLookAt(((float)DISTANCIA*(float)sin(alpha)*cos(beta)), ((float)DISTANCIA*(float)sin(beta)), ((float)DISTANCIA*cos(alpha)*cos(beta)), 0, 0, 0, 0, 1, 0);


}

void myTeclado(unsigned char tras,int x,int y)
{
    switch (tras) {
    case 'l':

    break;
    case 'c':
            break;
    case 'r':
            break;
    case 'p':

    break;

    default:
    break;
    }

  glutPostRedisplay();
}

 void myTeclasespeciales(int cursor,int x,int y) 
{
    switch(cursor) 
    {
        case GLUT_KEY_F1:
            break;
        case GLUT_KEY_F2:   
            break;
        case GLUT_KEY_F3:           
            break;
        case GLUT_KEY_F4:
            break;
        case GLUT_KEY_F5:           
            break;
        case GLUT_KEY_F6:       
            break;
        case GLUT_KEY_UP:
            beta-=INCREMENTO;
            break;
        case GLUT_KEY_DOWN:
            beta+=INCREMENTO;
            break;
        case GLUT_KEY_RIGHT:
            alpha-=INCREMENTO;
            break;
        case GLUT_KEY_LEFT:
            alpha+=INCREMENTO;
            break;
        default:
            break;
    }

    if(alpha>PI*2.0 && alpha<=0) alpha=0;
    if(beta>=PI*2.0 && beta<=0) beta=0;

    glutPostRedisplay();
}

1 个答案:

答案 0 :(得分:0)

如果陈述永远不会成立:

if(alpha>PI*2.0 && alpha<=0) alpha=0;

if(beta>=PI*2.0 && beta<=0) beta=0;

您需要或(||)not和(&amp;&amp;)。

问题不仅在于测试版。

解决方案是

if(alpha>PI*2.0 || alpha<=0) alpha=0;

if(beta>=PI*2.0 || beta<=0) beta=0;