Новичок
Профиль
Группа: Участник
Сообщений: 16
Регистрация: 26.4.2015
Репутация: нет Всего: нет
|
Народ, нужна помощь))Пытаюсь наложить текстуру на все планеты-сферы, плюс использовать текстуру как фон... норм работало, когда текстура была фоном, планеты просто окрашивались цветом... Сейчас "летает" одинокая планета(т.е. закрашивается только последняя планета), закрашенная текстурой, и все... остальное исчезло((( Что делаю не так??? PS Новичок, пытаюсь написать курсач((( Код | #include <windows.h> #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; //соотношение единица модели / точка экрана static bool EnableTextureFlag = false; //классы unsigned int photo_tex; unsigned int texture;
unsigned int tex1; unsigned int tex2; AUX_RGBImageRec* photo_image; AUX_RGBImageRec* photo1; AUX_RGBImageRec* photo2;
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(); } }; 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),0,orbit_radius * sin(tmp * RAD_IN_DEG)); } 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(); } void render_planet(void) { GLUquadricObj *q = gluNewQuadric(); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glEnable( GL_TEXTURE_2D );
gluQuadricTexture(q, GL_TRUE); gluQuadricDrawStyle(q, GLU_FILL); glColor3d(1,1,1); glPushMatrix(); glBindTexture(GL_TEXTURE_2D, texture); gluSphere(q, planet_radius, segments_count, segments_count); glPopMatrix();
} 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-функции static void Display(void) { glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity();
glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, photo_tex); glBegin(GL_QUADS); glTexCoord2d(0,0); glVertex2d(-9,-9); glTexCoord2d(0,1); glVertex2d(-9, 9); glTexCoord2d(1,1); glVertex2d( 9, 9); glTexCoord2d(1,0); glVertex2d( 9,-9); glEnd(); glDisable(GL_TEXTURE_2D);
core->render(t * t_factor); glFlush(); glutSwapBuffers(); } static 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); gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0); } static void Timer(int value) { t += dt / 1000.0; glutPostRedisplay(); glutTimerFunc(dt, Timer, 0); } int main(int argc, char *argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutInitWindowSize(width, height); glutCreateWindow("planet system"); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL);
photo_image = auxDIBImageLoad("fon.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); photo1=auxDIBImageLoad("sun.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);
photo2=auxDIBImageLoad("ground.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); planet_t core(texture, 1, -1, 0, 0, 0, 0); ::core = &core; core.sats.push_back(planet_t(tex2, 0.1, 2, 0, 0, 5, 0)); core.sats.push_back(planet_t(tex2, 0.2, 2.5, 0, 0, 10, 0)); core.sats.back().sats.push_back(planet_t(tex1, 0.05, 0.3, 0, 0, 5, 0)); core.sats.push_back(planet_t(tex2, 0.2, 3, 0, 0, 15, 0));
core.sats.push_back(planet_t(tex2, 0.5, 4, 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));
glutDisplayFunc(Display); glutReshapeFunc(Reshape); glutTimerFunc(dt, Timer, 0); glutMainLoop(); return 0; }
|
!!!исправила функцию, где рисую сферу, добавила glutSwapBuffers(); НО! появилась новая проблема((Отображаются все планеты, но текстура у них, которая используется для фона...и она как-то беспорядочно "мигает"(((как исправить? Код | void render_planet(void) { GLUquadricObj *q = gluNewQuadric(); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glEnable(GL_TEXTURE_2D); gluQuadricTexture(q, GL_TRUE); gluQuadricDrawStyle(q, GLU_FILL); glColor3d(1,1,1); glPushMatrix(); gluSphere(q, planet_radius, segments_count, segments_count); glPopMatrix(); gluDeleteQuadric(q); glutSwapBuffers(); }
|
Это сообщение отредактировал(а) Shade2015 - 26.4.2015, 18:17
|