Новичок
Профиль
Группа: Участник
Сообщений: 16
Регистрация: 26.4.2015
Репутация: нет Всего: нет
|
Всем привет, строю модель солнечной системы...возникла такая проблема- при вращении камеры (сбоку,например, если смотреть сверху-то все норм работает) планеты "пропадают",потом опять появляются на своей орбите.. как согласовать поворот камеры и движение по орбите, чтобы не было этих провалов планет??? Код | #include <gl\gl.h> #include <glut.h> #include <list> #include <math.h> #pragma comment(lib, "GLAUX.lib") #include "glaux.h" //макросы #define RAD_IN_DEG 0.017453292519943295769
//глобальные переменные static float segments_count = 50; //кол-во сегментов static float t; //время [с] static int dt = 10; //интервал пересчета [мс] static GLint width = 600; //ширина экрана static GLint height = 600; //высота экрана static float t_factor = 1.0; //соотношение время модели / время пользователя static float x_factor = 10.0 / 600.0; //соотношение единица модели / точка экрана unsigned int photo_tex; unsigned int texture; unsigned int tex1; unsigned int tex2; unsigned int tex3; unsigned int tex4; unsigned int tex5; unsigned int tex6; unsigned int tex7; unsigned int tex8; unsigned int Sprite; AUX_RGBImageRec* photo_image; AUX_RGBImageRec* photo1; AUX_RGBImageRec* photo2;
class Person { public: class _Coord { public: double x,z,y; }; class _Rotation { public: double y,x,z; };
_Coord Coord; _Rotation Rotation; };
int MouseOld_x=0, MouseOld_y=0; int WinWidth=640, WinHeight=480; Person User;
void MouseMotion(int x, int y); void Init(void) { glEnable(GL_DEPTH_TEST); User.Coord.x=0; User.Coord.z=0; User.Coord.y=0; User.Rotation.x=0; User.Rotation.y=0; }
class ring_t { public: float r, g, b; //цвет float inner_radius, outer_radius; //внутренний и внешний радиусы float az, ax; //углы поворота кольца относительно осей z, x (исходная позиция - в плоскости xy) [град] ring_t(float r, float g, float b, float inner_radius, float outer_radius, float az, float ax): r(r), g(g), b(b), inner_radius(inner_radius), outer_radius(outer_radius), az(az), ax(ax) {} void render(void) { glPushMatrix(); glRotatef(az, 0, 0, 1); glRotatef(ax, 1, 0, 0); GLUquadricObj *qu = gluNewQuadric(); gluQuadricTexture(qu, GL_TRUE); gluQuadricDrawStyle(qu, GLU_FILL); glColor3f(r, g, b); gluDisk(qu, inner_radius, outer_radius, segments_count, segments_count); gluDeleteQuadric(qu); glPopMatrix(); glutSwapBuffers(); } };
class planet_t; static planet_t *core; class planet_t { public: unsigned int texture; float planet_radius; //радиус планеты float orbit_radius; //радиус орбиты (окружность) float az, ax; //углы поворота орбиты относительно осей z, x (исходная позиция - в плоскости xy) [град] float T; //период обращения [с] float dT; //смещение [с] std::list<ring_t> rings; //кольца std::list<planet_t> sats; //спутники planet_t( unsigned int texture, float planet_radius, float orbit_radius, float az, float ax, float T, float dT): texture(texture), planet_radius(planet_radius), orbit_radius(orbit_radius), az(az), ax(ax), T(T), dT(dT) {}
void render(const float t) { glPushMatrix(); glRotatef(az, 0, 0, 1); glRotatef(ax, 1, 0, 0); if (orbit_radius > 0) { float tmp = t + dT; //время с учетом смещения int n = tmp / T; //кол-во оборотов tmp -= n * T; //время от начала оборота tmp *= 360.0 / T; //угол glTranslatef(orbit_radius * cos(tmp * RAD_IN_DEG),orbit_radius * sin(tmp * RAD_IN_DEG),0); } if (this == core) { float p0[4] = {0, 0, 1, 0}; glLightfv(GL_LIGHT0,GL_POSITION, p0); render_planet(); float p1[4] = {0, 0, 0, 1}; glLightfv(GL_LIGHT0, GL_POSITION, p1); } else { render_planet(); } render_rings_and_sats(t); glPopMatrix(); glFlush(); } void render_planet(void) { glPushMatrix(); GLUquadricObj *q = gluNewQuadric(); glClear(GL_DEPTH_BUFFER_BIT ); glEnable(GL_TEXTURE_2D); gluQuadricTexture(q, GL_TRUE); gluQuadricDrawStyle(q, GLU_FILL); glBindTexture(GL_TEXTURE_2D, texture); if(planet_radius==1) { glDisable(GL_LIGHTING); gluSphere(q, planet_radius, segments_count, segments_count); glEnable(GL_LIGHTING); } else {gluSphere(q, planet_radius, segments_count, segments_count);} gluDeleteQuadric(q); glPopMatrix(); glFlush();
}
void render_rings_and_sats(const float t) { for ( std::list<ring_t>::iterator i = rings.begin(); i != rings.end(); i++ ) i->render(); for ( std::list<planet_t>::iterator i = sats.begin(); i != sats.end(); i++ ) i->render(t); } }; //GL-функции
void Display() {glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef(User.Rotation.y, 0,1,0); glRotatef(User.Rotation.x, 1,0,0); glTranslatef(User.Coord.x,0,User.Coord.z); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glEnable(GL_ALPHA_TEST); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glBindTexture(GL_TEXTURE_2D, photo_tex); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f(-10, -10, 10); glTexCoord2f(1.0f, 0.0f); glVertex3f(10, -10, 10); glTexCoord2f(1.0f, 1.0f); glVertex3f(10, 10, 10); glTexCoord2f(0.0f, 1.0f); glVertex3f(-10, 10, 10); // new face glTexCoord2f(0.0f, 0.0f); glVertex3f(10, 10, 10); glTexCoord2f(1.0f, 0.0f); glVertex3f(10, 10, -10); glTexCoord2f(1.0f, 1.0f); glVertex3f(10, -10, -10); glTexCoord2f(0.0f, 1.0f); glVertex3f(10, -10, 10); // new face glTexCoord2f(0.0f, 0.0f); glVertex3f(10, 10, -10); glTexCoord2f(1.0f, 0.0f); glVertex3f(-10, 10, -10); glTexCoord2f(1.0f, 1.0f); glVertex3f(-10, -10, -10); glTexCoord2f(0.0f, 1.0f); glVertex3f(10, -10, -10); // new face glTexCoord2f(0.0f, 0.0f); glVertex3f(-10, -10, -10); glTexCoord2f(1.0f, 0.0f); glVertex3f(-10, -10, 10); glTexCoord2f(1.0f, 1.0f); glVertex3f(-10, 10, 10); glTexCoord2f(0.0f, 1.0f); glVertex3f(-10, 10, -10); // new face glTexCoord2f(0.0f, 0.0f); glVertex3f(-10, 10, -10); glTexCoord2f(1.0f, 0.0f); glVertex3f(10, 10, -10); glTexCoord2f(1.0f, 1.0f); glVertex3f(10, 10, 10); glTexCoord2f(0.0f, 1.0f); glVertex3f(-10, 10, 10); // new face glTexCoord2f(0.0f, 0.0f); glVertex3f(-10, -10, -10); glTexCoord2f(1.0f, 0.0f); glVertex3f(10, -10, -10); glTexCoord2f(1.0f, 1.0f); glVertex3f(10, -10, 10); glTexCoord2f(0.0f, 1.0f); glVertex3f(-10, -10, 10);
glEnd(); core->render(t * t_factor); glEnable(GL_LIGHTING); glDisable(GL_ALPHA_TEST); glDisable(GL_BLEND); glDisable(GL_TEXTURE_2D); glFlush(); }
void Reshape(GLint width, GLint height) { ::width = width; ::height = height; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-width / 2 * x_factor, width / 2 * x_factor, -height / 2 * x_factor, height / 2 * x_factor, 0, 100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glutPostRedisplay(); }
//РЕАЛИЗАЦИЯ ПОВРОТА: void MouseMotion(int x, int y) { User.Rotation.x+=(y-MouseOld_y)/4; User.Rotation.y-=(x-MouseOld_x)/4; MouseOld_x=x; MouseOld_y=y; glutPostRedisplay(); }
void Keyboard(unsigned char key, int x, int y) { if (key=='w') {User.Coord.x+=0.1;User.Coord.y+=0.1;} if (key=='s') {User.Coord.x-=0.1;User.Coord.y-=0.1;} if (key=='a') {User.Coord.z+=0.1;} if (key=='d') {User.Coord.z-=0.1;} if (key=='x') {User.Rotation.x++;} if (key=='y') {User.Rotation.y++;} glutPostRedisplay(); } static void Timer(int value) { t += dt / 1000.0; glutPostRedisplay(); glutTimerFunc(dt, Timer, 0); }
int main(int argc, char *argv[]) { GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR }; // Хранит три типа тумана GLuint fogfilter= 0; float density=(float)6.8; float fogcolor[4] = {0.05,0.05,0.05,0.0001}; glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(width, height); glutCreateWindow("planet system"); Init(); glutDisplayFunc(Display); glutReshapeFunc(Reshape); glutKeyboardFunc(Keyboard); glutMotionFunc(MouseMotion); glEnable(GL_FOG); // Включает туман (GL_FOG) glFogi(GL_FOG_MODE, fogMode[fogfilter]);// Выбираем тип тумана glFogfv(GL_FOG_COLOR, fogcolor); // Устанавливаем цвет тумана glFogf(GL_FOG_DENSITY, 0.15f); // Насколько густым будет туман glHint(GL_FOG_HINT, GL_DONT_CARE); // Вспомогательная установка тумана glFogf(GL_FOG_START, 1.0f); // Глубина, с которой начинается туман glFogf(GL_FOG_END, 5.0f); // Глубина, где туман заканчивается. glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glEnable(GL_ALPHA_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL);
photo_image = auxDIBImageLoad("1.bmp"); glGenTextures(1, &photo_tex); glBindTexture(GL_TEXTURE_2D, photo_tex); glTexImage2D(GL_TEXTURE_2D, 0, 4, photo_image->sizeX, photo_image->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, photo_image->data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); photo2=auxDIBImageLoad("sun.bmp"); glGenTextures(1, &tex2); glBindTexture(GL_TEXTURE_2D, tex2); glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, 3, photo2->sizeX, photo2->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, photo2->data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
photo1=auxDIBImageLoad("sutr.bmp"); glGenTextures(1, &tex1); glBindTexture(GL_TEXTURE_2D, tex1); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, 3, photo1->sizeX, photo1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, photo1->data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
photo1=auxDIBImageLoad("zemly.bmp"); glGenTextures(1, &tex3); glBindTexture(GL_TEXTURE_2D, tex3); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, 3, photo1->sizeX, photo1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, photo1->data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); photo1=auxDIBImageLoad("zel.bmp"); glGenTextures(1, &tex4); glBindTexture(GL_TEXTURE_2D, tex4); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, 3, photo1->sizeX, photo1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, photo1->data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); photo1=auxDIBImageLoad("mars.bmp"); glGenTextures(1, &tex5); glBindTexture(GL_TEXTURE_2D, tex5); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, 3, photo1->sizeX, photo1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, photo1->data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); photo1=auxDIBImageLoad("jup.bmp"); glGenTextures(1, &tex6); glBindTexture(GL_TEXTURE_2D, tex6); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, 3, photo1->sizeX, photo1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, photo1->data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); photo1=auxDIBImageLoad("pl.bmp"); glGenTextures(1, &tex7); glBindTexture(GL_TEXTURE_2D, tex7); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, 3, photo1->sizeX, photo1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, photo1->data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); photo1=auxDIBImageLoad("mr.bmp"); glGenTextures(1, &tex8); glBindTexture(GL_TEXTURE_2D, tex8); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, 3, photo1->sizeX, photo1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, photo1->data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); planet_t core(tex2, 1, -1, 0, 0, 0, 0); ::core = &core; core.sats.push_back(planet_t(tex4, 0.1, 1.3, 0, 0, 5, 0)); core.sats.push_back(planet_t(tex5, 0.16, 1.8, 0, 0, 10, 0)); core.sats.push_back(planet_t(tex8, 0.25, 3.4, 0, 0, 15, 0)); core.sats.push_back(planet_t(tex3, 0.3, 2.5, 0, 0, 15, 0)); core.sats.back().sats.push_back(planet_t(tex1, 0.08, 0.3, 0, 0, 5, 0)); core.sats.push_back(planet_t(tex6, 0.6, 5.6, 0, 0, 13, 0)); core.sats.push_back(planet_t(tex7, 0.3, 6.8, 0, 0, 25, 0)); core.sats.push_back(planet_t(tex1, 0.5, 4.5, 0, 0, 20, 0)); core.sats.back().rings.push_back(ring_t(1, 1, 1, 0.7, 0.8, 0, 80)); core.sats.back().rings.push_back(ring_t(1, 1, 1, 0.85, 0.9, 0, 80)); core.sats.back().rings.push_back(ring_t(1, 1, 1, 0.95, 1, 0, 80)); core.sats.push_back(planet_t(tex3, 0.2, 3, 0, 0, 15, 0));
glutTimerFunc(dt, Timer, 0); glutMainLoop(); return 0; }
|
Это сообщение отредактировал(а) Shade2015 - 2.5.2015, 15:52
|