2017-02-22 101 views
0

我正在開發一個簡單的代碼,試圖學習一些OpenGL。我用GL_LINES做了一個簡單的正方形,我試着用箭頭鍵旋轉它們。當它左右旋轉時,它會很順利,但如果我嘗試上下旋轉它,有時會跳躍。我知道錯誤在這一行,但我不知道如何解決它:if(beta>=PI*2.0 && beta<=0) beta=0;關於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

我假設你想保持你的α和β角0到2 * pi之間,對不對?嘗試在角度值上使用餘數(%)運算符。如果你的角度大於2 * pi,則餘數(beta%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; 

你需要或(||)不和(& &)。

該問題不僅在測試版上。

的解決方案是

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

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

它雖然不起作用 –