2017-02-22 8 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 * пи, верно? Попробуйте использовать оператор остатка (%) для вашего значения угла. Если ваш угол больше 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

Это не работает, хотя –

Смежные вопросы