Я разрабатываю простой код, пытаясь изучить 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();
}
Я предполагаю, что вы пытаетесь сохранить ваши альфа и бета углов от 0 до 2 * пи, верно? Попробуйте использовать оператор остатка (%) для вашего значения угла. Если ваш угол больше 2 * pi, остаток (beta% 2 * pi) будет положительным и должен работать. Если остаток отрицательный (что может произойти в случае отрицательного угла), то просто добавьте 2 * pi к результату остатка! – CodeSurgeon
Это не поможет в вашей проблеме, но вы можете определить 'DISTANCIA' как' 50.f' и использовать 'cosf' и' sinf' для удаления кастинга и улучшения удобочитаемости. – purplepsycho
@CodeSurgeon Я не понимаю, извините –