2017-02-22 1 views
0

저는 OpenGL을 배우려고 간단한 코드를 개발하고 있습니다. GL_LINES으로 간단한 사각형을 만들었고 화살표 키로 회전하려고했습니다. 좌우로 회전하는 것이 좋을 때는 잘 돌아가지만, 회전 시키려고하면 가끔씩 점프합니다. 나는 실수가이 줄에 있다는 것을 알고 있지만, 그것을 고치는 방법을 모른다 : .OpenGL의 회전 정보

#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

입니까? 각도 값에 나머지 연산자 (%)를 사용해보십시오. 각도가 2 * pi보다 큰 경우 나머지 (베타 % 2 * pi)는 양수가되어 작동해야합니다. 나머지가 음수 인 경우 (음의 각도에서 발생할 수 있음), 나머지 결과에 2 * pi를 추가하십시오! – CodeSurgeon

+0

문제는 도움이되지 않지만'DISTANCIA'를'50.f'로 정의하고'cosf'와'sinf'를 사용하여 캐스팅을 제거하고 가독성을 높일 수 있습니다. – purplepsycho

+0

@ CodeSurgeon 나는 그것을 얻지 않는다, 미안하다 –

답변

0

진술이 진실하지 않습니다 경우

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

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

당신이 필요하거나 (||)되지 않고 (& &).

문제는 베타에서만 발생하는 것이 아닙니다.

솔루션은 당신이 바로, 0, 2 * 파이 사이에 알파와 베타 각도를 유지하려고하는 가정

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

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

그것은 작동하지 않는다. –